C语言简易贪吃蛇(附完整代码) 您所在的位置:网站首页 贪吃蛇代码c语言 C语言简易贪吃蛇(附完整代码)

C语言简易贪吃蛇(附完整代码)

2023-07-21 04:12| 来源: 网络整理| 查看: 265

贪吃蛇小游戏

刚学完C语言写的第一个小游戏,代码主要参考: https://blog.csdn.net/qq_37074040/article/details/54766680 我在模仿代码的过程中发现了原作者程序中的一些bug,以下f附有我加以改进后的代码。

1.游戏界面 这个小游戏游戏界面的核心在于光标的控制。只要我们能让光标到达我们想要的地方,我们就能完成游戏界面的绘制,蛋的生成。简直就像天上地下,无所不能。 实现:gotoxy()函数

2.游戏体验感 如何将用户的输入读入,而不显示在屏幕上? 实现:getch()函数(包含在中) 如何防止用户的非法输入?玩游戏的过程中难免会摁到其他的键,如何让它不影响到我们的游戏?如果蛇在往前行走,我们控制方向向后,该怎么处理? 实现:保存蛇的前进状态。

3.游戏关键 蛇该如何打印?如何实现蛇的行走? 如何完成吃蛋的过程? 游戏结束的条件是什么? 这几个问题都是实现游戏的关键步骤,但是实际操作起来并没有想象中的那么难,希望读者结合下文代码自行思考。

代码还可以大幅度优化,读者可以自行思考。

如果发现代码有bug,欢迎下方留言。

如果觉得楼主的代码对你有帮助的话,可以点个关注,点个赞,谢谢!

#include #include #include #include #include #define frame_height 30//地图尺寸 #define frame_width 50 #define UP 'w'//移动 #define DOWN 's' #define LEFT 'a' #define RIGHT 'd' int i,j,k,sp,score; char ch=UP,state=UP,choo,n;//初始化方向 int grow=0; struct Food//食物 { int x;//横坐标 int y;//纵坐标 } food; struct Snake//蛇 { /*用数组储存蛇的每一部分的坐标*/ int x[100]; int y[100]; int len;//长度 int speed;//速度 } snake; void map(void);//地图 void update_food(void);//更新食物 void move_snake(void);//蛇的移动 int alive(void);//判断蛇是否死亡 void get_speed(void);//更新速度 void gotoxy(int x,int y);//移动光标,进行游戏界面的打印 int main() { do { score=0;//初始化分数为0 /*让用户进行难度选择,有彩蛋*/ printf("Choose the degree of difficulty:\n1:easy\t2:middle 3:difficult\n"); n=getch(); switch(n) { case '1': { sp=300; break; } case '2': { sp=230; break; } case '3': { sp=180; break; } default: { printf("Congratulations!Welcome to Devil's difficulty\n"); sp=120; break; } } system("cls");//每次新一局游戏先清屏,包含在 map();//打印地图 /*开始游戏*/ while(1) { update_food();//生产食物 get_speed();//获取速度 move_snake();//移动 Sleep(snake.speed);//延时函数,speed数值越大延时越长 if(!(alive()))//判断蛇是否死亡 { break;//死亡则退出循环 } } printf("Game Over!\n"); printf("1:Restart\t2:exit"); choo=getch(); } while(choo=='1'); return 0; } void map() { srand(time(NULL)); /*打印第一个食物*/ /*Attention!此处留了一个bug:可能食物 的位置与初始的蛇重合,然后食物就会消 失,读者可以加以改进*/ food.x=rand()%(frame_height-2)+1; food.y=rand()%(frame_width-2)+1;//在框内 gotoxy(food.x,food.y);//把光标移动到该坐标 printf("$");//打印食物 /*snake的初始化*/ snake.x[0]=frame_height/2; snake.y[0]=frame_width/2; gotoxy(snake.x[0],snake.y[0]); printf("@"); snake.len=3; snake.speed=200; for(k=1; k gotoxy(0,j); printf("#"); gotoxy(frame_height-1,j); printf("#"); } for(i=0; i if(snake.x[0]==food.x&&snake.y[0]==food.y)//吃到食物 { score+=10; gotoxy(12,frame_width+3); printf("Your score:%d",score); srand(time(NULL)); /*以下是更新食物的代码,里面排除了 食物与蛇重合的情况,读者可以参考以 下代码完成对上述bug的改进*/ int flag=1;//标记变量 do { food.x=rand()%(frame_height-2)+1; food.y=rand()%(frame_width-2)+1;//在框内 for(i=0; i flag=0;//有重合 break; } } } while(flag==0); /*打印食物*/ gotoxy(food.x,food.y); printf("$"); snake.len++; grow=1;//表明长了,在move_snake函数中有用到 } } /*移动蛇*/ void move_snake() { while(kbhit())//键盘有输入 { ch=getch(); } if(!grow)//没有长 { gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]); printf(" ");//走了,在数组的最后打印空格,清除原有的蛇尾 } for(k=snake.len-1; k>0; k--)//更新蛇的坐标,除了蛇头,其余位置继承上一个点的坐标 { snake.x[k]=snake.x[k-1]; snake.y[k]=snake.y[k-1];//移动位置 } switch(ch)//改变方向 { case UP: { if(state==DOWN)//如果此时方向向下,输入向上的作用要被无视 { snake.x[0]++; break; } else { snake.x[0]--; state=UP;//其余的改变状态为向上 break; } } case DOWN: { if(state==UP) { snake.x[0]--; break; } else { snake.x[0]++; state=DOWN; break; } } case LEFT: { if(state==RIGHT) { snake.y[0]++; break; } else { snake.y[0]--; state=LEFT; break; } } case RIGHT: { if(state==LEFT) { snake.y[0]--; break; } else { snake.y[0]++; state=RIGHT; break; } } /*摁其余键,保持原有状态*/ default: { if(state==DOWN) { snake.x[0]++; break; } else if(state==UP) { snake.x[0]--; break; } else if(state==LEFT) { snake.y[0]--; break; } else if(state==RIGHT) { snake.y[0]++; break; } } } gotoxy(snake.x[0],snake.y[0]); printf("@");//打印蛇头 grow=0;//初始成长状态为0 gotoxy(frame_height,0);//光标移动到地图左下角下方 } /*存活状态*/ int alive(void) { if(snake.x[0]==0||snake.x[0]==frame_height-1||snake.y[0]==0||snake.y[0]==frame_width-1)//撞墙 return 0; for(k=1; k if(snake.len


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有