找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8425|回复: 0
收起左侧

一个简易的贪吃蛇小游戏C语言源码

[复制链接]
ID:274340 发表于 2018-3-25 10:10 | 显示全部楼层 |阅读模式
贪吃蛇源码,C语言

源程序如下:
  1. /*
  2. *程序名称:贪吃蛇v2.1
  3. *程序描述:一个简易的贪吃蛇小游戏
  4. *版本信息:v2.1
  5. *v1.1版本更新:1:加入菜单选择项
  6. *v1.2版本更新:1:修复菜单选择bug
  7. *v1.3班本更新:1:加入难度选择项
  8. *             2:增加键盘采集频率,大大增加操作灵敏度
  9. *             3:优化屏幕刷新频率,平衡刺眼的情况
  10. *v2.0版本更新:1:使用新的数据存储结构
  11. *             2:使用全新的蛇的形状,更加美观
  12. *             3:解决了1.X版本地图长宽不等距的问题
  13. *v2.1版本更新:1:修复蛇行进过程中快速切换方向至死亡的bug
  14. *             2:屏幕刷新改为蛇每前进一次刷新一次,闪屏更柔和
  15. *             3:更新退出后版本信息的输出
  16. */
  17. #include<stdio.h>
  18. #include<stdlib.h>
  19. #include<windows.h>
  20. #include<string.h>
  21. #include<time.h>
  22. #include<conio.h>

  23. int i;

  24. #define N 25
  25. #define M 22

  26. //结构体名的宏定义
  27. #define STRU_B struct board
  28. //结构体元素part的值定义
  29. #define bBORDER "◆"
  30. #define sHEAD "■"
  31. #define sBODY "◆"
  32. #define sTAIL "◇"
  33. #define bNONE "  "
  34. #define bFOOD "☆"
  35. //结构体元素drection的值定义
  36. #define UP 24
  37. #define DOWN 25
  38. #define RIGHT 26
  39. #define LEFT 27

  40. struct board{
  41.         char drection;
  42.         char part[4];
  43. };

  44. void print_first(void);
  45. int degree_difficulty(void);
  46. void start(int diff);
  47. void initialise_board(STRU_B(*p)[N]);
  48. void creat_sanke(STRU_B(*p)[N]);
  49. void show_board(STRU_B(*p)[N]);
  50. int move_snake(STRU_B(*p)[N], char drection);
  51. void delete_tail(STRU_B(*p)[N]);
  52. void lose(STRU_B(*p)[N]);
  53. void add_food(STRU_B(*p)[N]);
  54. void print_last();

  55. int main(void)
  56. {
  57.         print_first();
  58.         do
  59.         {
  60.                 start(degree_difficulty());
  61.                 printf("1:再来一局\n2:退出\n请选择:");
  62.                 fflush(stdin);
  63.                 scanf("%d", &i);
  64.         } while (i == 1);
  65.         print_last();
  66.         return 0;
  67. }

  68. void print_first(void)
  69. {
  70.         printf("*************欢迎来到贪吃蛇*************\n\n");
  71.         printf("使用键盘上、下、左、右键控制方向\n\n\n");
  72. }

  73. int degree_difficulty(void)
  74. {
  75.         int diff;
  76.         do
  77.         {
  78.                 printf("\n请选择难度:(1——3):");
  79.                 scanf("%d", &diff);
  80.                 switch (diff)
  81.                 {
  82.                 case 1:diff = 10; break;
  83.                 case 2:diff = 6; break;
  84.                 case 3:diff = 2; break;
  85.                 default:
  86.                         break;
  87.                 }
  88.                 if (2 <= diff && diff <= 10)
  89.                         return diff;
  90.                 printf("\n请输入正确的编号选择难度:(1——3):");
  91.         } while (1);
  92. }

  93. void start(int diff)
  94. {
  95.         STRU_B board[M][N];
  96.         char drection = RIGHT;
  97.         int isn_lose = 1, i, dc;

  98.         initialise_board(board);
  99.         creat_sanke(board);

  100.         while (isn_lose)
  101.         {
  102.                 dc = 0;
  103.                 system("CLS");
  104.                 show_board(board);
  105.                 for (i = 0; i < diff; i++)
  106.                 {
  107.                         if (GetKeyState(VK_UP) < 0 && drection != DOWN && dc == 0) drection = UP, dc++;
  108.                         if (GetKeyState(VK_DOWN) < 0 && drection != UP && dc == 0) drection = DOWN, dc++;
  109.                         if (GetKeyState(VK_LEFT) < 0 && drection != RIGHT && dc == 0) drection = LEFT, dc++;
  110.                         if (GetKeyState(VK_RIGHT) < 0 && drection != LEFT && dc == 0) drection = RIGHT, dc++;
  111.                         Sleep(10);
  112.                 }
  113.                 isn_lose = move_snake(board, drection);
  114.         }
  115.         system("CLS");
  116.         show_board(board);
  117. }

  118. void initialise_board(STRU_B(*p)[N])
  119. {
  120.         int i, j;
  121.         for (j = 0; j < N; j++)
  122.                 strcpy(p[0][j].part , bBORDER);
  123.         for (i = 1; i < M - 1; i++)
  124.                 for (j = 0; j < N; j++)
  125.                         if (j == 0 || j == (N - 1))
  126.                                 strcpy(p[i][j].part , bBORDER);
  127.                         else
  128.                                 strcpy(p[i][j].part , bNONE);
  129.         for (j = 0; j < N; j++)
  130.                 strcpy(p[M - 1][j].part , bBORDER);
  131. }

  132. void creat_sanke(STRU_B(*p)[N])
  133. {
  134.         p[M / 2][N / 2].drection = RIGHT;
  135.         strcpy(p[M / 2][N / 2].part , sHEAD);
  136.         p[M / 2][N / 2 - 1].drection = RIGHT;
  137.         strcpy(p[M / 2][N / 2 - 1].part , sBODY);
  138.         p[M / 2][N / 2 - 2].drection = RIGHT;
  139.         strcpy(p[M / 2][N / 2 - 2].part , sTAIL);
  140.         add_food(p);
  141. }

  142. void show_board(STRU_B(*p)[N])
  143. {
  144.         int i, j;
  145.         for (i = 0; i < M; i++)
  146.         {
  147.                 for (j = 0; j < N; j++)
  148.                         printf("%s", p[i][j].part);
  149.                 printf("\n");
  150.         }
  151. }

  152. int move_snake(STRU_B(*p)[N], char drection)
  153. {
  154.         int i, j, NH = 0;
  155.         for (i = 0; i < M; i++)
  156.                 for (j = 0; j < N; j++)
  157.                 {
  158.                 if (strcmp(p[i][j].part, bNONE) == 0 || strcmp(p[i][j].part, sBODY) == 0);

  159.                 else if (strcmp(p[i][j].part , sHEAD) == 0 && NH == 0)
  160.                 {
  161.                         p[i][j].drection = drection;
  162.                         switch (drection)
  163.                         {
  164.                         case UP:if (strcmp(p[i - 1][j].part , bBORDER) == 0) { lose(p); return 0; }
  165.                                         if (strcmp(p[i - 1][j].part , bFOOD) == 0) add_food(p);
  166.                                         else delete_tail(p);
  167.                                         p[i - 1][j] = p[i][j];
  168.                                         break;
  169.                         case DOWN:if (strcmp(p[i + 1][j].part, bBORDER) == 0) { lose(p); return 0; }
  170.                                           if (strcmp(p[i + 1][j].part, bFOOD) == 0) add_food(p);
  171.                                           else delete_tail(p);
  172.                                           p[i + 1][j] = p[i][j];
  173.                                           break;
  174.                         case LEFT:if (strcmp(p[i][j - 1].part, bBORDER) == 0) { lose(p); return 0; }
  175.                                           if (strcmp(p[i][j - 1].part, bFOOD) == 0) add_food(p);
  176.                                           else delete_tail(p);
  177.                                           p[i][j - 1] = p[i][j];
  178.                                           break;
  179.                         case RIGHT:if (strcmp(p[i][j + 1].part, bBORDER) == 0) { lose(p); return 0; }
  180.                                            if (strcmp(p[i][j + 1].part, bFOOD) == 0) add_food(p);
  181.                                            else delete_tail(p);
  182.                                            p[i][j + 1] = p[i][j];
  183.                                            break;
  184.                         }
  185.                         strcpy(p[i][j].part, sBODY);
  186.                         NH++;
  187.                 }
  188.                 }
  189.         return 1;
  190. }

  191. void delete_tail(STRU_B(*p)[N])
  192. {
  193.         int i, j, NT = 0;
  194.         for (i = 0; i < M; i++)
  195.                 for (j = 0; j < N; j++)
  196.                         if (strcmp(p[i][j].part, sTAIL) == 0 && NT == 0)
  197.                         {
  198.                                 switch (p[i][j].drection)
  199.                                 {
  200.                                 case UP:strcpy(p[i - 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
  201.                                         break;
  202.                                 case DOWN:strcpy(p[i + 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
  203.                                         break;
  204.                                 case LEFT:strcpy(p[i][j - 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
  205.                                         break;
  206.                                 case RIGHT:strcpy(p[i][j + 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);
  207.                                         break;
  208.                                 }
  209.                                 NT++;
  210.                         }
  211. }

  212. void lose(STRU_B(*p)[N])
  213. {
  214.         strcpy(p[M / 2][N / 3].part, "Yo");
  215.         strcpy(p[M / 2][N / 3 + 1].part, "u ");
  216.         strcpy(p[M / 2][N / 3 + 2].part, "lo");
  217.         strcpy(p[M / 2][N / 3 + 3].part, "se");
  218.         strcpy(p[M / 2][N / 3 + 4].part, "! ");
  219. }

  220. void add_food(STRU_B(*p)[N])
  221. {
  222.         int x, y;
  223.         srand(time(0));
  224.         x = (rand() % N - 2) + 1;
  225.         y = (rand() % M - 2) + 1;
  226.         while (strcmp(p[y][x].part, bNONE) != 0)
  227.         {
  228.                 x = (rand() % N - 2) + 1;
  229.                 y = (rand() % M - 2) + 1;
  230.         }
  231.         strcpy(p[y][x].part, bFOOD);
  232. }

  233. void print_last()
  234. {
  235.         system("CLS");
  236.         printf("\n\n\n********************************************************\n");
  237.         printf("*                                                      *\n");
  238.         printf("*                      贪吃蛇v2.1                      *\n");
  239.         printf("*                                                      *\n");
  240.         printf("********************************************************\n");
  241.         Sleep(1000);
  242. }
复制代码

所有资料51hei提供下载:
贪吃蛇.zip (2.08 KB, 下载次数: 19)

评分

参与人数 2黑币 +55 收起 理由
烟臣 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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