VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 705|回复: 4

[交流] C语言实现贪食蛇-源码

[复制链接]
16_avatar_middle
最佳答案
0 
在线会员 发表于 2019-5-31 13:45:28 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. #include <conio.h>

  6. int        v=200;                                                //小蛇的移动速度
  7. int foodx;                                                //食物的坐标
  8. int foody;
  9. int snakeleng=2;                                //蛇身的长度(注意数组坐标从0开始)
  10. int count=0;                                        //计算分数

  11. struct body
  12. {
  13.         int x;
  14.         int y;
  15. };
  16. struct body snake_body[500];        //蛇身的长度


  17. void gotoxy(int x,int y)
  18. {
  19.         HANDLE app;                                                                //定义句柄
  20.         COORD pos;                                                                //定义坐标
  21.         pos.X=x;                                                                //修改X坐标,使X移动
  22.         pos.Y=y;                                                                //修改Y坐标,使Y移动
  23.         app=GetStdHandle(STD_OUTPUT_HANDLE);        //获取句柄
  24.         SetConsoleCursorPosition(app,pos);                //将获取的句柄移动,坐标是POS        
  25. }

  26. void drawmap()                                                //地图函数
  27. {
  28.         int i;

  29.         for(i=1;i<=30;i++)
  30.                 printf("★");

  31.         printf("\n");

  32.         for(i=1;i<=23;i++)
  33.         {
  34.                 printf("★\t\t\t\t\t\t\t  ★");
  35.                 printf("\n");
  36.         }

  37.         for(i=1;i<=30;i++)
  38.                 printf("★");
  39.         
  40.         gotoxy(65,3);
  41.         printf("数组版贪吃蛇");
  42.         gotoxy(66,4);
  43.         printf("贪吃蛇内测");
  44.         

  45.         gotoxy(64,7);
  46.         printf("======");
  47.         gotoxy(64,8);
  48.         printf("‖玩家得分‖");
  49.         gotoxy(64,9);
  50.         printf("‖\t  ‖");
  51.         gotoxy(64,10);
  52.         printf("======");

  53.         gotoxy(64,13);
  54.         printf("======");
  55.         gotoxy(64,14);
  56.         printf("‖游戏说明 ‖");
  57.         gotoxy(64,15);
  58.         printf("‖w向上移动‖");
  59.         gotoxy(64,16);
  60.         printf("‖s向下移动‖");
  61.         gotoxy(64,17);
  62.         printf("‖a向左移动‖");
  63.         gotoxy(64,18);
  64.         printf("‖d向右移动‖");
  65.         gotoxy(64,19);
  66.         printf("======");
  67. }

  68. void initsnake()                        //初始化小蛇
  69. {
  70.         int i,temp=7;

  71.         for(i=0;i<3;i++,temp-=2)
  72.         {
  73.                 snake_body[i].x=temp;
  74.                 snake_body[i].y=10;

  75.                 gotoxy(temp,10);
  76.                 printf("■");
  77.         }
  78. }

  79. void direct(char ch)                //小蛇移动方向函数
  80. {
  81.                 if(ch=='s'||ch=='S')//支持大小写按键
  82.                         snake_body[0].y=snake_body[0].y+1;        

  83.                 if(ch=='w'||ch=='W')
  84.                         snake_body[0].y=snake_body[0].y-1;

  85.                 if(ch=='a'||ch=='A')
  86.                         snake_body[0].x=snake_body[0].x-2;

  87.                 if(ch=='d'||ch=='D')
  88.                         snake_body[0].x=snake_body[0].x+2;
  89. }

  90. void make_food()                                        //制造食物(有问题,怎么避免把食物生成在蛇身里?)
  91. {
  92.         int i,flag=1;                                        //此处是flag用于记录蛇身坐标与食物坐标是否相等

  93.         srand((unsigned)time(NULL));

  94.         while(flag)
  95.         {
  96.                 foodx=rand()%53+2;
  97.                 if(foodx%2==0)                                //将食物的X轴坐标变为奇数
  98.                         foodx++;

  99.                 foody=rand()%22+2;
  100.         
  101.                 for(i=snakeleng;i>=0;i--)        //遍历蛇身
  102.                 {        
  103.                         if(snake_body[i].x==foodx && snake_body[i].y==foody)//如果产生的食物坐标与蛇身的任意位置相等
  104.                         {
  105.                                 flag=1;                                //坐标相等则再重新产生新的坐标
  106.                                 break;                                //跳出循环
  107.                         }
  108.                         else
  109.                                 flag=0;
  110.                 }
  111.                
  112.         }
  113.         gotoxy(foodx,foody);                        //画出食物
  114.         printf("●");
  115. }


  116. int add_snake_body()                        //增加蛇身的函数
  117. {
  118.         if(snake_body[0].x==foodx && snake_body[0].y==foody)        //如果食物坐标和蛇头坐标相等,说明蛇已经吃到食物了
  119.         {
  120.                 gotoxy(foodx,foody);        //擦去蛇的食物
  121.                 printf("■");

  122.                 snakeleng++;                        //增加蛇的长度
  123.                 count++;                                //每吃一个食物增加一分
  124.                 v--;

  125.                 gotoxy(66,9);                        //打印得分
  126.                 printf("%5d",count);

  127.                 snake_body[snakeleng].x=snake_body[snakeleng-1].x;                //增加新的身体,读取下个位置的坐标
  128.                 snake_body[snakeleng].y=snake_body[snakeleng-1].y;
  129.                         
  130.                 return 1;                                //记录蛇已经吃了食物
  131.         }
  132.         else
  133.                 return 0;
  134. }

  135. void read_next_coord()                        //下一位置坐标函数
  136. {
  137.         int i;

  138.         for(i=snakeleng;i>0;i--)        //循环读取下一个位置的坐标
  139.                 {
  140.                         if(i==snakeleng)        //如果i等于蛇尾(snakeleng最先初始化为2,那么2是蛇尾)
  141.                         {
  142.                                 gotoxy(snake_body[i].x,snake_body[i].y);                //擦除蛇尾
  143.                                 printf("  ");
  144.                         }

  145.                         snake_body[i].x=snake_body[i-1].x;                                       
  146.                         snake_body[i].y=snake_body[i-1].y;        
  147.         }
  148. }

  149. void snake_death()                                //判断蛇死亡的函数
  150. {
  151.         int i;

  152.         if( (snake_body[0].x<2 || snake_body[0].x>55) || (snake_body[0].y<1 || snake_body[0].y>23))        //检测左右两边是否碰墙,检测上下两边是否碰墙
  153.         {
  154.                 printf("撞墙了!游戏结束!");
  155.                 exit(0);
  156.         }

  157.         for(i=snakeleng;i>=4;i--)                                        //能否避免遍历所有数组?
  158.         {
  159.                 if(snake_body[0].x==snake_body[i].x && snake_body[0].y==snake_body[i].y)
  160.                 {
  161.                         printf("咬到身体了!");
  162.                         exit(0);
  163.                 }
  164.         }
  165. }

  166. int main(void)
  167. {
  168.         int flag=1;                                                //标记食物是否被吃
  169.         char ch2='d',ch1='a';

  170.         system("color b");                                //改变颜色

  171.         drawmap();                                                //初始化地图
  172.         
  173.         initsnake();                                        //初始化蛇身

  174.         while(1)
  175.         {
  176.                 if(flag)
  177.                 {
  178.                         make_food();
  179.                         flag=0;
  180.                 }

  181.                 read_next_coord();                        //蛇身读取下一个位置的坐标
  182.         
  183.                 if(kbhit())                                        //接受键盘输入的方向
  184.                         ch1=getch();
  185.                
  186.                 if(ch1!='a' && ch1!='s' && ch1!='w' && ch1!='d')//此语句是为了避免用户按下非a,s,w,d键
  187.                         ch1=ch2;                                //将上次移动的方向键赋值(如果错误按下,然默认为按原来方向移动)

  188.                 if((ch2=='d' && ch1!='a')||(ch2=='w' && ch1!='s')||(ch2=='s' && ch1!='w')||(ch2=='a' && ch1!='d'))
  189.                 {
  190.                         ch2=ch1;                                //此语句要来判断小蛇不往相反方向移动        
  191.                 }

  192.                 direct(ch2);                                //调用方向函数        
  193.                
  194.                 gotoxy(snake_body[0].x,snake_body[0].y);                                //画出新的蛇头
  195.                 printf("■");
  196.                 Sleep(v);                                        //控制蛇的速度

  197.                 flag=add_snake_body();                //判断蛇是否吃了食物

  198.                 snake_death();                                //判断蛇是否死亡
  199.         }        
  200.         return 0;
  201. }
复制代码




上一篇:关于类
下一篇:VC病毒源码,注释很详细
08_avatar_middle
最佳答案
9 
在线会员 发表于 2019-5-31 14:24:34 | 显示全部楼层
之前不是已经发过了的么
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-5-31 15:53:01 | 显示全部楼层
SummerGull 发表于 2019-5-31 14:24
之前不是已经发过了的么

之前做的五子棋
88_avatar_middle
最佳答案
0 
在线会员 发表于 2019-5-31 22:32:11 | 显示全部楼层
学习了!!!!!!!!!!!
35_avatar_middle
最佳答案
0 
在线会员 发表于 2019-6-1 01:03:59 | 显示全部楼层
先行一礼,再鞠一弓!老···师···好!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2021-1-20 15:27

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表