鱼C论坛

 找回密码
 立即注册
查看: 2077|回复: 5

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

[复制链接]
发表于 2020-8-27 18:29:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Cool_Breeze 于 2020-8-27 20:34 编辑

# 思路来自(知乎 id = int)int
  1. https://zhuanlan.zhihu.com/p/104575319
复制代码

# 还有些功能没有写!

  1. /*
  2. @ BY COOL_BREEZE
  3. @ 2020-08-27
  4. */


  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<time.h>
  8. #include<conio.h>
  9. #include<windows.h>

  10. #define HIGHT 30
  11. #define WIDTH 100

  12. // dos窗口显示模式
  13. #define MODE(X, Y) "MODE CON COLS="#X" LINES="#Y
  14. #define HAD (GetStdHandle(STD_OUTPUT_HANDLE))

  15. // 蛇的结构体开辟内存空间
  16. #define CALLSNAKE ((SNAKEP)malloc(sizeof(SNAKEV)))

  17. void hidecursor(void); // 改变光标的显示方式
  18. void gotoxy_print(int x, int y, char icon); // 移动光标到指定位置打印图标
  19. void __init__(void); // 初始化边框
  20. void create_snake(void); // 生成蛇
  21. void move_snake(void); // 移动蛇
  22. void create_food(void); // 生成食物
  23. void get_keyborad_input(void); // 获取键盘值
  24. int hit_the_wall(void); // 蛇撞墙
  25. void game_method(void);

  26. typedef struct SNAKE
  27. {
  28.         int x;  
  29.         int y;
  30.         struct SNAKE* next;
  31. } SNAKEV, *SNAKEP;

  32. SNAKEP SNAKE_HEAD; //蛇头
  33. SNAKEP SNAKE_FOOD; //食物

  34. //蛇前进的方向
  35. #define U 0X48 // 上
  36. #define D 0X50 // 下
  37. #define L 0X4B // 左
  38. #define R 0X4D // 右
  39. #define S 0X7F // 空格 暂停

  40. char DIRECTION = L; // 默认蛇往左边移动
  41. char HEAD_ICON = 0XF;
  42. char BODY_ICON = 0XB;
  43. char FOOD_ICON = 0X24;
  44. char NULL_ICON = 0X20;

  45. int main(void)
  46. {
  47.         system(MODE(130, 30));
  48.         system("title 贪吃蛇游戏");
  49.         game_method();
  50.         hidecursor();
  51.         __init__();
  52.         SNAKE_FOOD = CALLSNAKE;
  53.         create_snake();
  54.         create_food();
  55.         int ser; // 延迟
  56.         while(1)
  57.         {
  58.                 ser = 0;
  59.                 move_snake();
  60.                 if (kbhit()) // 检查键盘是否被按下,非阻塞的 (相当于多线程)
  61.                 {
  62.                         get_keyborad_input();
  63.                         Sleep(20);
  64.                         ser = 1;
  65.                 }
  66.                 if (hit_the_wall())
  67.                 {
  68.                         gotoxy_print((WIDTH-8) / 2, HIGHT / 2, NULL_ICON);
  69.                         printf("游戏结束");
  70.                         system("pause >nul");
  71.                         break;
  72.                 }
  73.                 if (ser)
  74.                         Sleep(10);
  75.                 else Sleep(200);
  76.         }
  77.         return 0;
  78.        
  79. }

  80. void hidecursor(void)
  81. {
  82.         CONSOLE_CURSOR_INFO show = {1, 0};
  83.         SetConsoleCursorInfo(HAD, &show);
  84. }

  85. void gotoxy_print(int x, int y, char icon)
  86. {
  87.         COORD poin = {x, y}; // 结构体
  88.         SetConsoleCursorPosition(HAD, poin); // 跳转到窗口指定位置
  89.         printf("%c", icon);
  90. }

  91. void game_method(void)
  92. {
  93.         gotoxy_print(WIDTH + 5, HIGHT/2-7, NULL_ICON);
  94.         printf("DATE 2020-08-27");
  95.         gotoxy_print(WIDTH + 5, HIGHT/2-6, NULL_ICON);
  96.         printf("BY COOL_BREEZE");
  97.         gotoxy_print(WIDTH + 5, HIGHT/2-4, NULL_ICON);
  98.         printf("空格 暂停");
  99.         gotoxy_print(WIDTH + 5, HIGHT/2-3, NULL_ICON);
  100.         printf("向上 ↑");
  101.         gotoxy_print(WIDTH + 5, HIGHT/2-2, NULL_ICON);
  102.         printf("向下 ↓");
  103.         gotoxy_print(WIDTH + 5, HIGHT/2-1, NULL_ICON);
  104.         printf("向左 ←");
  105.         gotoxy_print(WIDTH + 5, HIGHT/2, NULL_ICON);
  106.         printf("向右 →");
  107. }

  108. void __init__(void)
  109. {
  110.         int i = 0;
  111.         gotoxy_print(0, 0, 0X1); // 角落  1
  112.         gotoxy_print(WIDTH-1, 0, 0X2); // 角落  2
  113.         for (i=1; i<WIDTH-1; i++) // 上下边框
  114.         {
  115.                 gotoxy_print(i, 0, 0X6);
  116.                 gotoxy_print(i, HIGHT-1, 0X6);
  117.         }
  118.         for (i=1;i<HIGHT-1; i++) // 左右边框
  119.         {
  120.                 gotoxy_print(0, i, 0X5);
  121.                 gotoxy_print(WIDTH-1, i, 0X5);
  122.         }
  123.         gotoxy_print(0, HIGHT-1, 0X3); // 角落  3
  124.         gotoxy_print(WIDTH-1, HIGHT-1, 0X4); // 角落  4
  125. }

  126. void create_snake(void)
  127. {
  128.         int i = 0,x = (WIDTH-6) / 2, y = HIGHT / 2; //在中心创建蛇
  129.         SNAKEP phead, pend;
  130.         for (; i<6; i++) // 蛇默认长度为6
  131.         {
  132.                 pend = CALLSNAKE;
  133.                 if (!i)
  134.                 {
  135.                         SNAKE_HEAD = phead = pend;
  136.                         pend->x = x;
  137.                         pend->y = y;
  138.                         gotoxy_print(SNAKE_HEAD->x, SNAKE_HEAD->y, HEAD_ICON);
  139.                 }
  140.                 else
  141.                 {
  142.                         phead->next = pend;
  143.                         pend->x = x + i; // 蛇身体在头右方
  144.                         pend->y = y;
  145.                         gotoxy_print(pend->x, pend->y, BODY_ICON);
  146.                         phead = pend;
  147.                 }
  148.         }
  149.         pend->next = NULL;
  150. }

  151. void move_snake(void)
  152. {
  153.         SNAKEP head = CALLSNAKE; // 蛇新的头部
  154.         switch (DIRECTION)
  155.         {
  156.                 case U:
  157.                                 head->x = SNAKE_HEAD->x;
  158.                                 head->y = SNAKE_HEAD->y - 1;
  159.                                 break;
  160.                 case D:
  161.                                 head->x = SNAKE_HEAD->x;
  162.                                 head->y = SNAKE_HEAD->y + 1;
  163.                                 break;
  164.                 case L:
  165.                                 head->x = SNAKE_HEAD->x - 1;
  166.                                 head->y = SNAKE_HEAD->y;
  167.                                 break;
  168.                 case R:
  169.                                 head->x = SNAKE_HEAD->x + 1;
  170.                                 head->y = SNAKE_HEAD->y;
  171.                                 break;
  172.                 case S:
  173.                                 system("pause >nul");
  174.                                 break;
  175.         }
  176.         head->next = SNAKE_HEAD; // 旧头部连接新头部 使旧头部成为身体
  177.         SNAKE_HEAD = head; // 获取头部
  178.         if (SNAKE_HEAD->x == SNAKE_FOOD->x && SNAKE_HEAD->y == SNAKE_FOOD->y) // 检查蛇是否吃到食物
  179.         {
  180.                 while (head) // 吃到了食物蛇蛇尾不需要释放
  181.                 {
  182.                         if (head == SNAKE_HEAD)
  183.                                 gotoxy_print(SNAKE_HEAD->x, SNAKE_HEAD->y, HEAD_ICON);
  184.                         else
  185.                                 gotoxy_print(head->x, head->y, BODY_ICON);
  186.                         head = head->next;
  187.                 }
  188.                 create_food();
  189.         }
  190.         else
  191.         {
  192.                 while (head->next->next) // 没吃到食物释放掉蛇尾
  193.                 {
  194.                         if (head == SNAKE_HEAD)
  195.                                 gotoxy_print(SNAKE_HEAD->x, SNAKE_HEAD->y, HEAD_ICON);
  196.                         else
  197.                                 gotoxy_print(head->x, head->y, BODY_ICON);
  198.                         head = head->next;
  199.                 }
  200.                 gotoxy_print(head->next->x, head->next->y, NULL_ICON);
  201.                 free(head->next);
  202.                 head->next = NULL;
  203.         }
  204. }

  205. void create_food(void)
  206. {
  207.         SNAKEP  temp;
  208.         while (1)
  209.         {
  210.                 srand(time(NULL)); // 获取新种子 生成新的随机数
  211.                 SNAKE_FOOD->x = rand() % (WIDTH - 2) + 1; // 确保坐标只会出现在表格内(不包括表格)
  212.                 SNAKE_FOOD->y = rand() % (HIGHT - 2) + 1; // 确保坐标只会出现在表格内(不包括表格)
  213.                 temp = SNAKE_HEAD;
  214.                 while(temp) // 食物落在蛇身上重新获取
  215.                 {
  216.                         if (temp->x == SNAKE_FOOD->x && temp->y == SNAKE_FOOD->y)
  217.                                 continue;
  218.                         else
  219.                         {
  220.                                 gotoxy_print(SNAKE_FOOD->x, SNAKE_FOOD->y, FOOD_ICON);
  221.                                 break;
  222.                         }
  223.                 }
  224.                 break;
  225.         }
  226. }

  227. void get_keyborad_input(void)
  228. {
  229.         int key = 0;
  230.     while (1)
  231.     {
  232.         key = getch();
  233.         if (key == 224) // 键盘方向键需要获取两次
  234.         {
  235.             key = getch();
  236.             if (key == U ||\
  237.                 key == D ||\
  238.                 key == L ||\
  239.                 key == R)
  240.             {
  241.                     DIRECTION = key;
  242.                     break;
  243.                         }
  244.             else continue;
  245.         }
  246.     }
  247. }

  248. int hit_the_wall(void)
  249. {
  250.         if (SNAKE_HEAD->x == 0 || SNAKE_HEAD->x == WIDTH-1 ||\
  251.                 SNAKE_HEAD->y == 0 || SNAKE_HEAD->y == HIGHT-1 )
  252.                 return 1;
  253.         return 0;
  254. }
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-27 21:29:27 | 显示全部楼层
看贴回帖是个好习惯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-27 21:33:37 | 显示全部楼层
weiter 发表于 2020-8-27 21:29
看贴回帖是个好习惯

程序哪里逻辑不对!卡卡的!难搞了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 21:34:04 | 显示全部楼层
Cool_Breeze 发表于 2020-8-27 21:33
程序哪里逻辑不对!卡卡的!难搞了!

我是学Python的……只是路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-3 07:20:16 | 显示全部楼层
复制下来 留着学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-18 05:58:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 22:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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