高山 发表于 2022-8-16 12:15:06

作品:C++的贪吃蛇(幽灵切割版,回复3鱼币)

本帖最后由 高山 于 2022-9-18 18:02 编辑

说明
本帖子需要自定义color函数,定义方法请见https://fishc.com.cn/thread-216662-1-1.html(完整版不需要加任何代码),本帖为付费贴,内容自带敌人幽灵切割,回复(一共奖励一次)有70%几率全额退回鱼币
奖励版(购买后在第七版块也会显示)

名称/项目昵称查看传送门   
中奖回帖(仅1次,70%的中奖率)一点点儿点此
最佳回帖(置顶展示的回帖)一点点儿点此


1、作品介绍
贪吃蛇是一款经典的游戏,本创作在保留原有功能下,创作了幽灵
幽灵(符号为▲)会跟踪贪吃蛇(注意分清蛇与幽灵),被幽灵抓到即为结束游戏。贪吃蛇吃一个食物(符号为◆)加一分,速度也会变快。
2、收费说明
本帖为付费贴,某个回复人(仅一次)有70%几率把作品查看费完全打回,下面的代码块和非完整版代码是一样的,非完整版降价免费,完整版附件收费降至1鱼币鱼币。
如果不想自己加代码,请到文末下载完整版
3、非完整版代码(代码块和非完整版的代码是一样的,color定义链接在上方或往下看)
#include<windows.h>
#include<bits/stdc++.h>
using namespace std; //命名空间
void gotoxy(intvoid gotoxy(int x, int y) {
    COORD pos = { x,y };
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
    SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
void start(){
char ans;
color(2);//设置颜色
gotoxy(12,10);//将光标移至坐标为(12,10)的位置
cout<<"★贪 吃 蛇★";//输出提示语
gotoxy(12,12);
cout<<"开始请输入y:";
cin>>ans;
if(ans!='y'){
exit(0);
}
}

int map_x=31,map_y=25;
void nav(){
color(6);
for(int i=0;i<=map_x;i++){
Sleep(10);//等待10ms
gotoxy(i,map_y);
cout<<"□";
gotoxy(i,0);
cout<<"□";
}      
for(int i=0;i<=map_y;i++){
gotoxy(0,i);
cout<<"□";
gotoxy(map_x,i);
cout<<"□";
}
color(15);
/*for(int i=1;i<=29;i++){//一列一列输出
for(int j=1;j<=23;j++){
Sleep(10);
gotoxy(i,j);
cout<<"■";
}
} */
for(int i=1;i<=map_y-1;i++){//一行一行输出
for(int j=1;j<=map_x-1;j++){
//Sleep(10);
gotoxy(j,i);
cout<<"■";
}
}
}


int snake_x,snake_y,snake_len;
void snake_coor(){
srand(time(0));      
snake_x = rand()%(map_x-1)+1;
snake_y = rand()%(map_y-1)+1;
snake_len = 1;
for(int i=1;i<snake_len;i++){
snake_x=snake_x-i;
snake_y=snake_y;
}
}

void draw_snake(){//通过循环的方式画蛇头以及蛇身
color(5);
for(int i=0;i<snake_len;i++){
gotoxy(snake_x,snake_y);
if(i==0)
cout<<"×";
else
cout<<"●";
}
//exit(0);
}

int food_x,food_y;
void food_coor(){
bool same=false;//食物跟蛇是否发生了重合,如果重合了,那么same就是true,否则是false
while(true){//无限循环地生成食物的坐标,直到食物跟蛇补充和为止
food_x = rand()%(map_x-1)+ 1;
food_y = rand()%(map_y-1) + 1;
//检测食物是否跟蛇发生了重合,如果有.则重新生成食物的坐标
for(int i=0;i<snake_len;i++){
if(snake_x==food_x&&snake_y==food_y)
same=true;
}
if(same==false)//same为false,代表蛇没有跟食物发生重合,可以退出循环了
break; //退出无限循环
same=false;      
}
}

void draw_food(){
color(4);
gotoxy(food_x,food_y);
cout<<"◆";
}

int ghost_x,ghost_y;
void ghost_coor(){
bool same=false;//幽灵跟食物跟蛇是否发生了重合,如果重合了,那么same就是true,否则是false
while(true){//无限循环地生成食物的坐标,直到食物跟蛇补充和为止
ghost_x = rand()%(map_x-1)+ 1;
ghost_y = rand()%(map_y-1) + 1;
//检测食物是否跟蛇发生了重合,如果有.则重新生成食物的坐标
for(int i=0;i<snake_len;i++){
if(snake_x==ghost_x&&snake_y==ghost_y)
same=true;
}
if(same==false)//same为false,代表蛇没有跟食物发生重合,可以退出循环了
break; //退出无限循环
same=false;      
}
}

void draw_ghost(){
color(4);
gotoxy(ghost_x,ghost_y);
cout<<"▲";
}

void draw_score(){
color(4);
gotoxy(0,map_y+1);
cout<<"长度为:"<<snake_len;
}

void draw_blank(){//画地图,把旧的蛇覆盖 ,把旧星星覆盖
color(15);
for(int i=0;i<snake_len;i++){
gotoxy(snake_x,snake_y);
cout<<"■";
}
gotoxy(ghost_x,ghost_y);
cout<<"■";      
}
char dir='R';//direction方向 ,R--right,L--left,U--up,D--down
void snake_move(){//根据当前的方向移动一步
draw_blank();//覆盖蛇的旧位置
for(int i=snake_len-1;i>=1;i--){
snake_x=snake_x;
snake_y=snake_y;
}
if(dir=='U'){
snake_y--;
}
else if(dir=='D'){
snake_y++;
}
else if(dir=='L'){
snake_x--;
}
else if(dir=='R'){
snake_x++;
}      
}

bool ghost_flag=false;
void ghost_move(){//幽灵向着蛇移动一步
ghost_flag=!ghost_flag;
if(ghost_flag)
return;
if(snake_x>ghost_x)
ghost_x++;
else if(snake_x<ghost_x)
ghost_x--;
else if(snake_y>ghost_y)
ghost_y++;
else if(snake_y<ghost_y)
ghost_y--;
}

void detect_eat(){//检测是否吃到了食物
if(snake_x==food_x && snake_y==food_y){
snake_x=snake_x*2-snake_x;
snake_y=snake_y*2-snake_y;
snake_len++;
food_coor();//吃到了,就再随机生成一个食物的新坐标
draw_food();//画一下食物
draw_score();//重新画上更新后的分数
}
}

void detect_cut(){//检测是否碰到了幽灵
for(int i=1;i<snake_len;i++)
if(snake_x==ghost_x&&snake_y==ghost_y){
snake_len=i;
return;
}
}

void detect_failure(){//检测撞墙以及撞自己的情况是否发生
//蛇头撞在了上边界,意味着y是0;蛇头撞到了下边界,意味着y是map_y
//蛇头撞在了左边界,意味着x是0;蛇头撞到了右边界,意味着x是map_x
if(snake_y==0||snake_y==map_y||snake_x==0||snake_x==map_x){
exit(0);
}
//撞到了自己,意味着蛇头撞到了蛇身,也就是蛇头的坐标与蛇身的某一个坐标发生了重合
for(int i=1;i<snake_len;i++)
if(snake_x==snake_x&&snake_y==snake_y){
exit(0);
}      
if(snake_x==ghost_x&&snake_y==ghost_y)
exit(0);
}

void detect_key(){//如果按下了键盘上的方向键,则更新贪吃蛇的方向
if(kbhit()){//kbhit的功能是返回键盘上的按键,如果返回值为0,代表没按
char key = getch();//获取在键盘上按下的按键
if(key=='w')
dir='U';
else if(key=='s')
dir='D';
else if(key=='a')
dir='L';
else if(key=='d')
dir='R';
}
}

int main(){
start();
nav();
snake_coor();//生成贪吃蛇的坐标
draw_snake();
food_coor();//生成食物的坐标
draw_food();
ghost_coor();//生成幽灵的坐标
draw_ghost();
draw_score();//画分数
//让贪吃蛇一直移动
//同时检测在某一个时刻是否按下了按键,如果有,则去更新方向
while(true){//无限循环
detect_key();//检测是否按下了按键
snake_move(); //贪吃蛇沿着原来的方向移动一步
ghost_move();//幽灵向着蛇移动
detect_eat();//检测蛇是否吃到了食物
detect_cut();//检测蛇身是否碰到了幽灵
detect_failure();//检测蛇是否碰到了自己或者墙壁,导致失败
draw_snake(); //画新位置的蛇
draw_ghost(); //画新位置的幽灵
draw_food(); //重新画食物
Sleep(500/snake_len);//让游戏暂缓
}
return 0;
}

4、color定义方法
帖子
5、附件说明
压缩包为360压缩专用,请使用3.0以上的版本查看。
360压缩安装链接:☞戳我
解压密码:fishc
普通版

完整版(不用另行添加,解压密码fishc):

6、回复说明
7板块将会公示2种类型的回帖
中奖回帖:触发70%中奖的回帖
最佳回帖:最佳回复,将会置顶展示
7、回帖看板
快来回复吧!

名称/项目 昵称 查看传送门   
中奖回帖(仅1次,70%的中奖率) 一点点儿点此
最佳回帖(置顶展示的回帖)一点点儿点此
8、结语
感谢你看到这里,如果你有建议,欢迎跟我交流,我将会第一时间查看你的建议。
再次表示感谢!

别急着走~先评个分呗



一点点儿 发表于 2022-8-17 12:59:50

感谢楼主分享!
向大佬学习{:10_254:}

zhangjinxuan 发表于 2022-8-17 16:35:59

大佬厉害!

阳阳得意ok 发表于 2022-8-18 16:23:23

哇哦哇哦哇哦

阳阳得意ok 发表于 2022-8-18 16:36:10

为什么第四行报错了

1455950276 发表于 2022-8-25 12:15:00

瞅一瞅学习下代码

middle_Mind 发表于 2022-8-28 13:14:47

谢谢

tiger20100907 发表于 2022-8-28 13:58:06

{:10_256:}

zhangjinxuan 发表于 2022-8-29 08:39:27

{:10_275:}

white_slacker 发表于 2022-8-29 10:56:59

{:10_281:}{:10_250:}

雪山之神 发表于 2022-9-18 18:01:58

好冷清         
ding

DEGEA 发表于 2022-9-28 20:17:15

ROZE 发表于 2022-9-29 00:08:26

厉害

howzyao 发表于 2022-9-29 01:12:55

非常精炼的骨干。

zhangjinxuan 发表于 2022-12-2 11:41:10

dcm_96@qq.com 发表于 2022-12-2 13:03:40

消息称

zhangjinxuan 发表于 2023-6-5 21:15:31

尘封已久的帖子。

考古{:10_250:}

zhangjinxuan 发表于 2023-7-4 21:32:02

考古考古考古考古考古{:10_244:}
页: [1]
查看完整版本: 作品:C++的贪吃蛇(幽灵切割版,回复3鱼币)