鱼C论坛

 找回密码
 立即注册
楼主: crymin

[技术交流] C语言贪吃蛇代码

  [复制链接]
发表于 2021-9-30 20:04:44 From FishC Mobile | 显示全部楼层
学习了,看了,,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 18:18:27 | 显示全部楼层
本帖最后由 王义忠 于 2021-10-1 18:22 编辑

照猫画虎打了一遍,但是还是不成功,抄都抄不对 加油
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 19:40:12 | 显示全部楼层
资瓷
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-1 23:00:42 | 显示全部楼层
看下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-5 20:56:26 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-6 11:52:39 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-6 12:06:11 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-6 12:21:53 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-6 12:24:08 | 显示全部楼层
看看,学习中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-6 13:56:53 | 显示全部楼层
受益很多,在我的编译环境下面,做了一点修改(我的编译环境可能与作者的不同)可以运行。不错。
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <windows.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6. #pragma warning(disable:4996)

  7. #define INFO_X 100  //提示信息区横坐标
  8. #define WIDE 50     //游戏界面宽度
  9. #define HIGH 36     //游戏界面高度
  10. #define LEVELUP 5   //升级所需的食物个数

  11. /* 定义全局变量 */
  12. unsigned char key;
  13. int i, j, k, end[2];                //i,j,k为循环变量,end数组用来做蛇尾坐标的中间变量


  14. /* 蛇身结构 */
  15. struct Snakes
  16. {
  17.     int X[100];     //蛇身的横坐标
  18.     int Y[100];     //蛇身的纵坐标
  19.     int length;     //蛇的长度
  20.     int speed;      //蛇移动速度
  21.     int count;      //蛇吃到食物个数
  22. };
  23. /* 食物结构 */
  24. struct Food
  25. {
  26.     int X;          //食物横坐标
  27.     int Y;          //食物纵坐标
  28. };

  29. struct Snakes s, * snake = &s;       //定义蛇的结构体指针并指向蛇的结构体
  30. struct Food f, * food = &f;          //定义食物结构体指针并指向食物结构体
  31. /* 设置控制台标题和大小 */
  32. void SetTitle()
  33. {
  34.     //设置控制台窗口大小
  35.     system("mode con cols=150 lines=40");
  36.     //设置控制台标题
  37.     SetConsoleTitle("贪吃蛇");
  38. }
  39. /* 设置光标位置 */
  40. void SetPos(int x, int y)
  41. {
  42.     HANDLE winhandle;
  43.     COORD pos = { x,y };
  44.     winhandle = GetStdHandle(STD_OUTPUT_HANDLE);
  45.     SetConsoleCursorPosition(winhandle, pos);
  46. }
  47. /* 设置控制台颜色 */
  48. void Setcolor(int forcolor, int bakcolor)
  49. {
  50.     /*
  51.     0=黑色,   8=灰色,
  52.     1=蓝色,   9=淡蓝色,
  53.     2=绿色,   A=淡绿色,
  54.     3=湖蓝色, B=淡浅绿色,
  55.     4=红色,   C=淡红色,
  56.     5=紫色,   D=淡紫色,
  57.     6=黄色,   E=淡黄色,
  58.     7=白色,   F=亮白色
  59.     */
  60.     HANDLE winhandle;
  61.     winhandle = GetStdHandle(STD_OUTPUT_HANDLE);
  62.     SetConsoleTextAttribute(winhandle, forcolor + bakcolor * 0x10);
  63. }
  64. /* 清楚单行显示 */
  65. void Cleanlin(int x, int y)
  66. {
  67.     SetPos(x, y);
  68.     for (i = 0; i < 50; i++)
  69.     {
  70.         printf(" ");
  71.     }
  72. }
  73. /* 设置游戏界面 */
  74. void Table()
  75. {
  76.     for (i = 0; i < HIGH; i++)
  77.     {
  78.         if (i == 0 || i == HIGH - 1)
  79.         {
  80.             for (k = 0; k < WIDE * 2 - 1; k += 2)
  81.             {
  82.                 SetPos(k, i);
  83.                 printf("■");
  84.             }
  85.             continue;
  86.         }
  87.         else
  88.         {
  89.             for (j = 0; j < WIDE * 2 - 1; j += 2)
  90.             {
  91.                 if (j == 0 || j == WIDE * 2 - 2)
  92.                 {
  93.                     SetPos(j, i);
  94.                     printf("■");
  95.                 }
  96.             }
  97.         }
  98.     }
  99. }
  100. /* 显示提示和菜单 */
  101. void ShowMenu()
  102. {
  103.     SetPos(INFO_X + 17, 1);
  104.     Setcolor(9, 0);
  105.     printf("欢迎来到贪吃蛇!");
  106.     SetPos(INFO_X + 17, 5);
  107.     printf("Esc  退出游戏");
  108.     SetPos(INFO_X + 17, 7);
  109.     printf("空格 暂停游戏");
  110.     SetPos(INFO_X + 17, 9);
  111.     printf("↑↓←→ 控制蛇头方向");
  112.     SetPos(INFO_X + 17, 11);
  113.     printf("长按方向键加速");
  114.     SetPos(INFO_X + 17, 15);
  115.     printf("游戏得分:%d", snake->count * 100);
  116.     SetPos(INFO_X + 17, 17);
  117.     printf("当前级别:%d", snake->count / LEVELUP + 1);
  118.     SetPos(INFO_X + 17, 19);
  119.     printf("当前速度:%d", snake->speed);
  120.     SetPos(INFO_X + 17, 21);
  121.     printf("吃到食物:%d", snake->count);
  122.     SetPos(INFO_X + 17, 23);
  123.     printf("食物坐标:%-2d,%-2d", food->X, food->Y);
  124. }
  125. /* 初始化蛇身 */
  126. void init_snake()
  127. {
  128.     snake->X[0] = WIDE;                   //初始化蛇的横坐标
  129.     snake->Y[0] = HIGH / 2;                 //初始化蛇的竖坐标
  130.     end[0] = snake->X;                    //记住蛇尾横坐标
  131.     end[1] = snake->Y;                    //记住蛇尾纵坐标
  132.     snake->speed = 300;                 //初始化蛇的速度为300ms
  133.     snake->length = 3;                    //初始化蛇的长度为3节
  134.     snake->count = 0;                     //初始化蛇吃的个数为0
  135.     for (i = 1; i < snake->length; i++)
  136.     {
  137.         /* 依次得到蛇身、蛇头的坐标 */
  138.         snake->X[i] = snake->X[i - 1] + 2;
  139.         snake->Y[i] = snake->Y[i - 1];
  140.     }
  141. }
  142. /* 移动蛇身 */
  143. void move_snake()
  144. {
  145.     SetPos(snake->X[0], snake->Y[0]);
  146.     printf("  ");               /* 清除蛇尾*/
  147.     for (i = 1; i < snake->length; i++)
  148.     {/* 后一节的坐标依次取代前一节的坐标 */
  149.         snake->X[i - 1] = snake->X[i];
  150.         snake->Y[i - 1] = snake->Y[i];
  151.     }
  152. }
  153. /* 显示蛇身 */
  154. void print_snake()
  155. {
  156.     for (i = 0; i < snake->length; i++)
  157.     {
  158.         SetPos(snake->X[i], snake->Y[i]);
  159.         if (i == 0)
  160.         {
  161.             printf("○");    //打印蛇尾
  162.         }
  163.         else if (i == snake->length - 1)
  164.         {
  165.             printf("¤");    //打印蛇头
  166.         }
  167.         else
  168.         {
  169.             printf("⊙");    //打印蛇身
  170.         }
  171.     }
  172. }
  173. /* 产生食物 */
  174. void get_food()
  175. {
  176.     srand((unsigned)time(NULL));
  177.     while (1)
  178.     {
  179.         food->X = ((rand() % (WIDE - 3)) + 1) * 2;
  180.         food->Y = (rand() % (HIGH - 2)) + 1;
  181.         for (i = 0; i < snake->length; i++)
  182.         {
  183.             if (food->X == snake->X[i] && food->Y == snake->Y[i])
  184.             {
  185.                 break;
  186.             }
  187.         }
  188.         if (i == snake->length)
  189.         {
  190.             SetPos(food->X, food->Y);
  191.             Setcolor(10, 0);
  192.             printf("⊙");
  193.             Setcolor(9, 0);
  194.             break;
  195.         }
  196.     }
  197. }
  198. /* 吃食物 */
  199. void eat_food()
  200. {
  201.     if (snake->X[snake->length - 1] == food->X && snake->Y[snake->length - 1] == food->Y)
  202.     {/*如果蛇头坐标和食物坐标相同,吃掉食物,身长加1。*/
  203.         snake->length++;
  204.         for (i = snake->length - 1; i > 0; i--)
  205.         {/* 蛇后节坐标依次赋值给蛇前一节的坐标,依次得到蛇身及蛇头的坐标 */

  206.             snake->X[i] = snake->X[i - 1];
  207.             snake->Y[i] = snake->Y[i - 1];
  208.         }
  209.         snake->X[0] = end[0];
  210.         snake->Y[0] = end[1];
  211.         get_food();
  212.         snake->count++;
  213.         if (snake->count % LEVELUP == 0)
  214.         {/* 当蛇吃LEVELUP个食物时,速度加快20毫秒并且升一级 */
  215.             snake->speed -= 20;
  216.         }
  217.     }
  218. }
  219. /* 穿墙 */
  220. void through_wall()
  221. {   /* 当蛇碰到移动方向的边界时,蛇身穿过边界从相对的另一边出现。*/
  222.     if (key == 72 && snake->Y[snake->length - 1] == 0)//上键
  223.     {
  224.         snake->Y[snake->length - 1] = HIGH - 2;
  225.     }
  226.     if (key == 77 && snake->X[snake->length - 1] == WIDE * 2 - 2)//右键
  227.     {
  228.         snake->X[snake->length - 1] = 2;
  229.     }
  230.     if (key == 80 && snake->Y[snake->length - 1] == HIGH - 1)//下键
  231.     {
  232.         snake->Y[snake->length - 1] = 1;
  233.     }
  234.     if (key == 75 && snake->X[snake->length - 1] == 0)//左键
  235.     {
  236.         snake->X[snake->length - 1] = (WIDE - 2) * 2;
  237.     }
  238. }

  239. void GameOver()
  240. {
  241.     system("cls");
  242.     SetPos(WIDE, HIGH / 2);
  243.     printf("游戏结束!");
  244.     ShowMenu();
  245.     SetPos(0, HIGH);
  246.     exit(0);
  247.     getch();
  248. }
  249. /* 判断蛇的死亡 */
  250. void die()
  251. {
  252.     for (i = 0; i < snake->length - 1; i++)
  253.     {   /* 当蛇头碰到蛇身,蛇死亡。 */
  254.         if (snake->X[snake->length - 1] == snake->X[i] && snake->Y[snake->length - 1] == snake->Y[i])
  255.         {
  256.             GameOver();
  257.         }
  258.     }
  259. }
  260. /* 得到用户输入 */
  261. void GetKey()
  262. {
  263.     switch (key)
  264.     {
  265.     case 27://Esc键--结束游戏
  266.     {
  267.         GameOver();
  268.         break;
  269.     }
  270.     case 32://空格键--暂停游戏
  271.     {
  272.         SetPos(INFO_X + 13, HIGH - 5);
  273.         Setcolor(5, 0);
  274.         Sleep(500);
  275.         printf("游戏暂停,按方向键继续!");
  276.         Setcolor(9, 0);
  277.         SetPos(0, HIGH);
  278.         break;
  279.     }
  280.     case 72://上键
  281.     {
  282.         move_snake();
  283.         snake->Y[snake->length - 1] -= 1;
  284.         break;
  285.     }
  286.     case 77://右键
  287.     {
  288.         move_snake();
  289.         snake->X[snake->length - 1] += 2;
  290.         break;
  291.     }
  292.     case 80://下键
  293.     {
  294.         move_snake();
  295.         snake->Y[snake->length - 1] += 1;
  296.         break;
  297.     }
  298.     case 75://左键
  299.     {
  300.         move_snake();
  301.         snake->X[snake->length - 1] -= 2;
  302.         break;
  303.     }
  304.     }
  305. }
  306. /* 开始游戏 */
  307. void GameStar()
  308. {
  309.     key = 77;                 //初始化蛇向右移动
  310.     SetTitle();             //设置控制台标题和大小
  311.     Setcolor(4, 0);
  312.     Table();                //初始化游戏界面
  313.     init_snake();           //初始化蛇身
  314.     get_food();             //初始化第一个食物
  315.     while (1)
  316.     {
  317.         Cleanlin(INFO_X, HIGH - 5);
  318.         ShowMenu();
  319.         end[0] = snake->X[0];
  320.         end[1] = snake->Y[0];
  321.         j = 0;
  322.         if (kbhit())
  323.         {/* 判断是否按下键盘,如果按下,ch接收键盘输入 */
  324.             key = getch();
  325.             if (kbhit())
  326.             {/* 如果长按键盘,则加速 */
  327.                 Sleep(20);
  328.                 j = 1;
  329.             }
  330.         }
  331.         GetKey();
  332.         through_wall();
  333.         eat_food();
  334.         print_snake();
  335.         die();
  336.         if (j == 0)
  337.         {
  338.             Sleep(snake->speed);        //延迟时间
  339.         }
  340.         else
  341.         {
  342.             Sleep(10);
  343.         }
  344.     }
  345. }
  346. /* 游戏结束 */

  347. int main()
  348. {
  349.     GameStar();
  350.     return 0;
  351. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-6 14:01:33 | 显示全部楼层

受益很多,在我的编译环境下面,做了一点修改(我的编译环境可能与作者的不同)可以运行。不错。

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <windows.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6. #pragma warning(disable:4996)//在某些编译环境中,以下用到的一些函数可能会报不安全,比如:getch,kbhit 所以这里要加上这个定义可以
  7. /*某一些函数的先后执行顺序做了调整*/
  8. #define INFO_X 100  //提示信息区横坐标
  9. #define WIDE 50     //游戏界面宽度
  10. #define HIGH 36     //游戏界面高度
  11. #define LEVELUP 5   //升级所需的食物个数

  12. /* 定义全局变量 */
  13. unsigned char key;
  14. int i, j, k, end[2];                //i,j,k为循环变量,end数组用来做蛇尾坐标的中间变量


  15. /* 蛇身结构 */
  16. struct Snakes
  17. {
  18.     int X[100];     //蛇身的横坐标
  19.     int Y[100];     //蛇身的纵坐标
  20.     int length;     //蛇的长度
  21.     int speed;      //蛇移动速度
  22.     int count;      //蛇吃到食物个数
  23. };
  24. /* 食物结构 */
  25. struct Food
  26. {
  27.     int X;          //食物横坐标
  28.     int Y;          //食物纵坐标
  29. };

  30. struct Snakes s, * snake = &s;       //定义蛇的结构体指针并指向蛇的结构体
  31. struct Food f, * food = &f;          //定义食物结构体指针并指向食物结构体
  32. /* 设置控制台标题和大小 */
  33. void SetTitle()
  34. {
  35.     //设置控制台窗口大小
  36.     system("mode con cols=150 lines=40");
  37.     //设置控制台标题
  38.     SetConsoleTitle("贪吃蛇");
  39. }
  40. /* 设置光标位置 */
  41. void SetPos(int x, int y)
  42. {
  43.     HANDLE winhandle;
  44.     COORD pos = { x,y };
  45.     winhandle = GetStdHandle(STD_OUTPUT_HANDLE);
  46.     SetConsoleCursorPosition(winhandle, pos);
  47. }
  48. /* 设置控制台颜色 */
  49. void Setcolor(int forcolor, int bakcolor)
  50. {
  51.     /*
  52.     0=黑色,   8=灰色,
  53.     1=蓝色,   9=淡蓝色,
  54.     2=绿色,   A=淡绿色,
  55.     3=湖蓝色, B=淡浅绿色,
  56.     4=红色,   C=淡红色,
  57.     5=紫色,   D=淡紫色,
  58.     6=黄色,   E=淡黄色,
  59.     7=白色,   F=亮白色
  60.     */
  61.     HANDLE winhandle;
  62.     winhandle = GetStdHandle(STD_OUTPUT_HANDLE);
  63.     SetConsoleTextAttribute(winhandle, forcolor + bakcolor * 0x10);
  64. }
  65. /* 清楚单行显示 */
  66. void Cleanlin(int x, int y)
  67. {
  68.     SetPos(x, y);
  69.     for (i = 0; i < 50; i++)
  70.     {
  71.         printf(" ");
  72.     }
  73. }
  74. /* 设置游戏界面 */
  75. void Table()
  76. {
  77.     for (i = 0; i < HIGH; i++)
  78.     {
  79.         if (i == 0 || i == HIGH - 1)
  80.         {
  81.             for (k = 0; k < WIDE * 2 - 1; k += 2)
  82.             {
  83.                 SetPos(k, i);
  84.                 printf("■");
  85.             }
  86.             continue;
  87.         }
  88.         else
  89.         {
  90.             for (j = 0; j < WIDE * 2 - 1; j += 2)
  91.             {
  92.                 if (j == 0 || j == WIDE * 2 - 2)
  93.                 {
  94.                     SetPos(j, i);
  95.                     printf("■");
  96.                 }
  97.             }
  98.         }
  99.     }
  100. }
  101. /* 显示提示和菜单 */
  102. void ShowMenu()
  103. {
  104.     SetPos(INFO_X + 17, 1);
  105.     Setcolor(9, 0);
  106.     printf("欢迎来到贪吃蛇!");
  107.     SetPos(INFO_X + 17, 5);
  108.     printf("Esc  退出游戏");
  109.     SetPos(INFO_X + 17, 7);
  110.     printf("空格 暂停游戏");
  111.     SetPos(INFO_X + 17, 9);
  112.     printf("↑↓←→ 控制蛇头方向");
  113.     SetPos(INFO_X + 17, 11);
  114.     printf("长按方向键加速");
  115.     SetPos(INFO_X + 17, 15);
  116.     printf("游戏得分:%d", snake->count * 100);
  117.     SetPos(INFO_X + 17, 17);
  118.     printf("当前级别:%d", snake->count / LEVELUP + 1);
  119.     SetPos(INFO_X + 17, 19);
  120.     printf("当前速度:%d", snake->speed);
  121.     SetPos(INFO_X + 17, 21);
  122.     printf("吃到食物:%d", snake->count);
  123.     SetPos(INFO_X + 17, 23);
  124.     printf("食物坐标:%-2d,%-2d", food->X, food->Y);
  125. }
  126. /* 初始化蛇身 */
  127. void init_snake()
  128. {
  129.     snake->X[0] = WIDE;                   //初始化蛇的横坐标
  130.     snake->Y[0] = HIGH / 2;                 //初始化蛇的竖坐标
  131.     end[0] = snake->X;                    //记住蛇尾横坐标
  132.     end[1] = snake->Y;                    //记住蛇尾纵坐标
  133.     snake->speed = 300;                 //初始化蛇的速度为300ms
  134.     snake->length = 3;                    //初始化蛇的长度为3节
  135.     snake->count = 0;                     //初始化蛇吃的个数为0
  136.     for (i = 1; i < snake->length; i++)
  137.     {
  138.         /* 依次得到蛇身、蛇头的坐标 */
  139.         snake->X[i] = snake->X[i - 1] + 2;
  140.         snake->Y[i] = snake->Y[i - 1];
  141.     }
  142. }
  143. /* 移动蛇身 */
  144. void move_snake()
  145. {
  146.     SetPos(snake->X[0], snake->Y[0]);
  147.     printf("  ");               /* 清除蛇尾*/
  148.     for (i = 1; i < snake->length; i++)
  149.     {/* 后一节的坐标依次取代前一节的坐标 */
  150.         snake->X[i - 1] = snake->X[i];
  151.         snake->Y[i - 1] = snake->Y[i];
  152.     }
  153. }
  154. /* 显示蛇身 */
  155. void print_snake()
  156. {
  157.     for (i = 0; i < snake->length; i++)
  158.     {
  159.         SetPos(snake->X[i], snake->Y[i]);
  160.         if (i == 0)
  161.         {
  162.             printf("○");    //打印蛇尾
  163.         }
  164.         else if (i == snake->length - 1)
  165.         {
  166.             printf("¤");    //打印蛇头
  167.         }
  168.         else
  169.         {
  170.             printf("⊙");    //打印蛇身
  171.         }
  172.     }
  173. }
  174. /* 产生食物 */
  175. void get_food()
  176. {
  177.     srand((unsigned)time(NULL));
  178.     while (1)
  179.     {
  180.         food->X = ((rand() % (WIDE - 3)) + 1) * 2;
  181.         food->Y = (rand() % (HIGH - 2)) + 1;
  182.         for (i = 0; i < snake->length; i++)
  183.         {
  184.             if (food->X == snake->X[i] && food->Y == snake->Y[i])
  185.             {
  186.                 break;
  187.             }
  188.         }
  189.         if (i == snake->length)
  190.         {
  191.             SetPos(food->X, food->Y);
  192.             Setcolor(10, 0);
  193.             printf("⊙");
  194.             Setcolor(9, 0);
  195.             break;
  196.         }
  197.     }
  198. }
  199. /* 吃食物 */
  200. void eat_food()
  201. {
  202.     if (snake->X[snake->length - 1] == food->X && snake->Y[snake->length - 1] == food->Y)
  203.     {/*如果蛇头坐标和食物坐标相同,吃掉食物,身长加1。*/
  204.         snake->length++;
  205.         for (i = snake->length - 1; i > 0; i--)
  206.         {/* 蛇后节坐标依次赋值给蛇前一节的坐标,依次得到蛇身及蛇头的坐标 */

  207.             snake->X[i] = snake->X[i - 1];
  208.             snake->Y[i] = snake->Y[i - 1];
  209.         }
  210.         snake->X[0] = end[0];
  211.         snake->Y[0] = end[1];
  212.         get_food();
  213.         snake->count++;
  214.         if (snake->count % LEVELUP == 0)
  215.         {/* 当蛇吃LEVELUP个食物时,速度加快20毫秒并且升一级 */
  216.             snake->speed -= 20;
  217.         }
  218.     }
  219. }
  220. /* 穿墙 */
  221. void through_wall()
  222. {   /* 当蛇碰到移动方向的边界时,蛇身穿过边界从相对的另一边出现。*/
  223.     if (key == 72 && snake->Y[snake->length - 1] == 0)//上键
  224.     {
  225.         snake->Y[snake->length - 1] = HIGH - 2;
  226.     }
  227.     if (key == 77 && snake->X[snake->length - 1] == WIDE * 2 - 2)//右键
  228.     {
  229.         snake->X[snake->length - 1] = 2;
  230.     }
  231.     if (key == 80 && snake->Y[snake->length - 1] == HIGH - 1)//下键
  232.     {
  233.         snake->Y[snake->length - 1] = 1;
  234.     }
  235.     if (key == 75 && snake->X[snake->length - 1] == 0)//左键
  236.     {
  237.         snake->X[snake->length - 1] = (WIDE - 2) * 2;
  238.     }
  239. }

  240. void GameOver()
  241. {
  242.     system("cls");
  243.     SetPos(WIDE, HIGH / 2);
  244.     printf("游戏结束!");
  245.     ShowMenu();
  246.     SetPos(0, HIGH);
  247.     exit(0);
  248.     getch();
  249. }
  250. /* 判断蛇的死亡 */
  251. void die()
  252. {
  253.     for (i = 0; i < snake->length - 1; i++)
  254.     {   /* 当蛇头碰到蛇身,蛇死亡。 */
  255.         if (snake->X[snake->length - 1] == snake->X[i] && snake->Y[snake->length - 1] == snake->Y[i])
  256.         {
  257.             GameOver();
  258.         }
  259.     }
  260. }
  261. /* 得到用户输入 */
  262. void GetKey()
  263. {
  264.     switch (key)
  265.     {
  266.     case 27://Esc键--结束游戏
  267.     {
  268.         GameOver();
  269.         break;
  270.     }
  271.     case 32://空格键--暂停游戏
  272.     {
  273.         SetPos(INFO_X + 13, HIGH - 5);
  274.         Setcolor(5, 0);
  275.         Sleep(500);
  276.         printf("游戏暂停,按方向键继续!");
  277.         Setcolor(9, 0);
  278.         SetPos(0, HIGH);
  279.         break;
  280.     }
  281.     case 72://上键
  282.     {
  283.         move_snake();
  284.         snake->Y[snake->length - 1] -= 1;
  285.         break;
  286.     }
  287.     case 77://右键
  288.     {
  289.         move_snake();
  290.         snake->X[snake->length - 1] += 2;
  291.         break;
  292.     }
  293.     case 80://下键
  294.     {
  295.         move_snake();
  296.         snake->Y[snake->length - 1] += 1;
  297.         break;
  298.     }
  299.     case 75://左键
  300.     {
  301.         move_snake();
  302.         snake->X[snake->length - 1] -= 2;
  303.         break;
  304.     }
  305.     }
  306. }
  307. /* 开始游戏 */
  308. void GameStar()
  309. {
  310.     key = 77;                 //初始化蛇向右移动
  311.     SetTitle();             //设置控制台标题和大小
  312.     Setcolor(4, 0);
  313.     Table();                //初始化游戏界面
  314.     init_snake();           //初始化蛇身
  315.     get_food();             //初始化第一个食物
  316.     while (1)
  317.     {
  318.         Cleanlin(INFO_X, HIGH - 5);
  319.         ShowMenu();
  320.         end[0] = snake->X[0];
  321.         end[1] = snake->Y[0];
  322.         j = 0;
  323.         if (kbhit())
  324.         {/* 判断是否按下键盘,如果按下,ch接收键盘输入 */
  325.             key = getch();
  326.             if (kbhit())
  327.             {/* 如果长按键盘,则加速 */
  328.                 Sleep(20);
  329.                 j = 1;
  330.             }
  331.         }
  332.         GetKey();
  333.         through_wall();
  334.         eat_food();
  335.         print_snake();
  336.         die();
  337.         if (j == 0)
  338.         {
  339.             Sleep(snake->speed);        //延迟时间
  340.         }
  341.         else
  342.         {
  343.             Sleep(10);
  344.         }
  345.     }
  346. }
  347. /* 游戏结束 */

  348. int main()
  349. {
  350.     GameStar();
  351.     return 0;
  352. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-6 16:34:01 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-6 18:13:43 | 显示全部楼层
6666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-6 18:38:47 | 显示全部楼层
6
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-6 21:27:05 | 显示全部楼层

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-7 19:20:38 From FishC Mobile | 显示全部楼层
真想知道
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 19:44:37 | 显示全部楼层
谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-13 15:41:18 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-13 16:20:27 | 显示全部楼层
6666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-13 19:15:54 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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