找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9029|回復(fù): 0
收起左側(cè)

一個(gè)簡(jiǎn)易的貪吃蛇小游戲C語(yǔ)言源碼

[復(fù)制鏈接]
ID:274340 發(fā)表于 2018-3-25 10:10 | 顯示全部樓層 |閱讀模式
貪吃蛇源碼,C語(yǔ)言

源程序如下:
  1. /*
  2. *程序名稱(chēng):貪吃蛇v2.1
  3. *程序描述:一個(gè)簡(jiǎn)易的貪吃蛇小游戲
  4. *版本信息:v2.1
  5. *v1.1版本更新:1:加入菜單選擇項(xiàng)
  6. *v1.2版本更新:1:修復(fù)菜單選擇bug
  7. *v1.3班本更新:1:加入難度選擇項(xiàng)
  8. *             2:增加鍵盤(pán)采集頻率,大大增加操作靈敏度
  9. *             3:優(yōu)化屏幕刷新頻率,平衡刺眼的情況
  10. *v2.0版本更新:1:使用新的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
  11. *             2:使用全新的蛇的形狀,更加美觀
  12. *             3:解決了1.X版本地圖長(zhǎng)寬不等距的問(wèn)題
  13. *v2.1版本更新:1:修復(fù)蛇行進(jìn)過(guò)程中快速切換方向至死亡的bug
  14. *             2:屏幕刷新改為蛇每前進(jìn)一次刷新一次,閃屏更柔和
  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. //結(jié)構(gòu)體名的宏定義
  27. #define STRU_B struct board
  28. //結(jié)構(gòu)體元素part的值定義
  29. #define bBORDER "◆"
  30. #define sHEAD "■"
  31. #define sBODY "◆"
  32. #define sTAIL "◇"
  33. #define bNONE "  "
  34. #define bFOOD "☆"
  35. //結(jié)構(gòu)體元素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:再來(lái)一局\n2:退出\n請(qǐng)選擇:");
  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("*************歡迎來(lái)到貪吃蛇*************\n\n");
  71.         printf("使用鍵盤(pán)上、下、左、右鍵控制方向\n\n\n");
  72. }

  73. int degree_difficulty(void)
  74. {
  75.         int diff;
  76.         do
  77.         {
  78.                 printf("\n請(qǐng)選擇難度:(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請(qǐng)輸入正確的編號(hào)選擇難度:(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. }
復(fù)制代碼

所有資料51hei提供下載:
貪吃蛇.zip (2.08 KB, 下載次數(shù): 19)


評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
煙臣 + 5 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表