当前位置:   article > 正文

C语言控制台简单实现贪吃蛇(附完整源码)_c语言实现贪吃蛇游戏源代码

c语言实现贪吃蛇游戏源代码

        “笔者刚学完c语言基础语法,本着练习的心态用控制台实现了贪吃蛇游戏,于是有了本篇。”

效果预览:

目录

一、预备知识

1、kbhit()

2、getch()

3、system()

4、rand()

二、基本思路

三、代码实现

1、变量声明

2、主程序

3、按键检测

4、食物判定

5、尾部判定加清楚

6、蛇体默认移动、死亡判定

7、源码


公众号摸鱼老K同步更新,感谢关注~


一、预备知识

        基本的语法就不多赘述了,本篇主要介绍基础学习不常涉及到的函数

1、kbhit()

        用于非阻塞地响应键盘输入事件,在本项目中用于检测按键控制蛇体移动。

        功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0

2、getch()

        从stdio流中读字符,即从控制台读取一个字符,但不显示在屏幕上,getch()会暂停输出控制台,直到按下一个键为止,它不使用任何缓冲区来存储输入字符,输入的字符将立即返回,而无需等待回车键。

        返回值:读取的字符的ASCII码值(整数)。

3、system()

int system(const char * command)

        在windows系统中,system函数直接在控制台调用一个command命令。这些命令可以通过system(“HELP”)获取,我们在这只使用system("cls")来清除屏幕输出。

        返回值:命令执行成功返回0,执行失败返回-1。

4、rand()

        rand()函数用于产生一个随机数,其内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。调用rand()函数会得到一个在0-RAND_MAX。RAND_MAX在头文件stdlib.h中定义。

        我们还可以通过rand()%(n-m+1)+m这个公式实现指定范围(m,n)内的随机数。

二、基本思路

        实现思路就是通过清空控制台再打印输出,如此循环,实现动画效果。

        定义出蛇头,蛇身,蛇尾,程序难点就在蛇体运动和蛇尾判定。首先明确大体过程,蛇头不断朝着正向前进,并且可以通过按键改变方向。蛇的整体运动其实就是蛇头前移,之后在蛇头后面打印出一个蛇身,最后是清楚蛇的末尾,这样就能实现蛇的动态。

        再一个难点是蛇身拐点,也就是多一个拐点蛇身就多处一个运动的矢量,本例程是将拐点xy坐标以及方向存储在三个数组中,通过这三个值判断尾端的移动。这样的好处是编程逻辑清楚简单,相应缺点就是数组大小有限,并且不能释放无用的内存。当你熟练了指针用法之后也可以通过链表存储来改进。这里笔者还不熟练,今后学到可能会回头来优化(刚开始就挖坑~)

        食物就通过随机数生成,死亡判定就直接判断头坐标下一个内容(是墙或者蛇身判定死亡)。

三、代码实现

1、变量声明

  1. //蛇头和蛇身
  2. char head = '#', body = '*';
  3. //蛇头的坐标值,长度,拐点个数
  4. int x = 20, y = 10, length = 10, change = 0;
  5. //记录拐点信息,方向用1233代表wasd
  6. int xchange[999], ychange[999], decation[999] = {0};
  7. //食物坐标
  8. int xfood = 20, yfood = 30;
  9. //尾部坐标,尾部到达拐点标志
  10. int xtail, ytail, tailflag = 0;

2、主程序

  1. int main() {
  2. //尾部初始值
  3. xtail = x;
  4. ytail = y - length;
  5. while (1) {
  6. //按键检测函数
  7. if (kbhit())
  8. input();
  9. //蛇体默认移动,触发死亡条件break掉循环
  10. if (add())
  11. break;
  12. //尾部检测,清楚尾部的图案
  13. tail();
  14. //吃到食物尾部加长
  15. addlong();
  16. //更新屏幕显示
  17. system("cls");
  18. printf("\t\t\t成绩:%d\n", length);
  19. printf("%s", backgd);
  20. }
  21. system("cls");
  22. printf("游戏结束");
  23. return 0;
  24. }

3、按键检测

用来记录拐点信息

  1. void input() {
  2. char key = getch();
  3. change++;
  4. xchange[change] = x;
  5. ychange[change] = y;
  6. if (key == 'w') {
  7. decation[change] = 1;
  8. }
  9. if (key == 'a') {
  10. decation[change] = 2;
  11. }
  12. if (key == 's') {
  13. decation[change] = 3;
  14. }
  15. if (key == 'd') {
  16. decation[change] = 4;
  17. }
  18. }

4、食物判定

如果蛇头移动到食物坐标length就会加一,并且再随机一个食物

  1. void addlong() {
  2. backgd[xfood][yfood] = 'X';
  3. if (x == xfood && y == yfood && change == 0) {
  4. length++;
  5. ytail--;
  6. xfood = rand() % 25 + 1;
  7. yfood = rand() % 77 + 1;
  8. }
  9. if (x == xfood && y == yfood && change != 0) {
  10. length++;
  11. if (decation[tailflag] == 1)
  12. xtail++;
  13. if (decation[tailflag] == 2)
  14. ytail++;
  15. if (decation[tailflag] == 3)
  16. xtail--;
  17. if (decation[tailflag] == 4)
  18. ytail--;
  19. xfood = rand() % 25 + 1;
  20. yfood = rand() % 77 + 1;
  21. }
  22. }

5、尾部判定加清楚

用tailflag去读取拐点信息,再进行相应的坐标偏移

  1. void tail() {
  2. if (tailflag == 0) {
  3. ytail++;
  4. if (ytail == ychange[tailflag + 1])
  5. tailflag++;
  6. } else {
  7. if (decation[tailflag] == 1) {
  8. xtail--;
  9. if (xtail == xchange[tailflag + 1]) {
  10. tailflag++;
  11. return;
  12. }
  13. }
  14. if (decation[tailflag] == 2) {
  15. ytail--;
  16. if (ytail == ychange[tailflag + 1]) {
  17. tailflag++;
  18. return;
  19. }
  20. }
  21. if (decation[tailflag] == 3) {
  22. xtail++;
  23. if (xtail == xchange[tailflag + 1]) {
  24. tailflag++;
  25. return;
  26. }
  27. }
  28. if (decation[tailflag] == 4) {
  29. ytail++;
  30. if (ytail == ychange[tailflag + 1]) {
  31. tailflag++;
  32. return;
  33. }
  34. }
  35. }
  36. }

6、蛇体默认移动、死亡判定

蛇头根据拐点进行坐标偏移,如果碰到“*”即为死亡

  1. int add() {
  2. clear();
  3. if (change == 0) {
  4. y++;
  5. backgd[x][y] = head;
  6. backgd[x][y - 1] = body;
  7. } else {
  8. if (decation[change] == 1) {
  9. if (backgd[x - 1][y] == '*')
  10. return 1;
  11. backgd[x - 1][y] = head;
  12. backgd[x][y] = body;
  13. x--;
  14. }
  15. if (decation[change] == 2) {
  16. if (backgd[x][y - 1] == '*')
  17. return 1;
  18. backgd[x][y - 1] = head;
  19. backgd[x][y] = body;
  20. y--;
  21. }
  22. if (decation[change] == 3) {
  23. if (backgd[x + 1][y] == '*')
  24. return 1;
  25. backgd[x + 1][y] = head;
  26. backgd[x][y] = body;
  27. x++;
  28. }
  29. if (decation[change] == 4) {
  30. if (backgd[x][y + 1] == '*')
  31. return 1;
  32. backgd[x][y + 1] = head;
  33. backgd[x][y] = body;
  34. y++;
  35. }
  36. }
  37. return 0;
  38. }

7、源码

  1. #include <stdio.h>
  2. char backgd[27][81] = {
  3. {"********************************************************************************\n"},
  4. {"* *\n"},
  5. {"* *\n"},
  6. {"* *\n"},
  7. {"* *\n"},
  8. {"* *\n"},
  9. {"* *\n"},
  10. {"* *\n"},
  11. {"* *\n"},
  12. {"* *\n"},
  13. {"* *\n"},
  14. {"* *\n"},
  15. {"* *\n"},
  16. {"* *\n"},
  17. {"* *\n"},
  18. {"* *\n"},
  19. {"* *\n"},
  20. {"* *\n"},
  21. {"* *\n"},
  22. {"* *\n"},
  23. {"* *\n"},
  24. {"* *\n"},
  25. {"* *\n"},
  26. {"* *\n"},
  27. {"* *\n"},
  28. {"******************************************************************************** "}
  29. };
  30. char head = '#', body = '*';
  31. int x = 20, y = 10, length = 1, change = 0;
  32. int xchange[999], ychange[999], decation[999] = {0};
  33. int xfood = 20, yfood = 30;
  34. int xtail, ytail, tailflag = 0;
  35. void clear() {
  36. backgd[xtail][ytail] = ' ';
  37. }
  38. void input() {
  39. char key = getch();
  40. change++;
  41. xchange[change] = x;
  42. ychange[change] = y;
  43. if (key == 'w') {
  44. decation[change] = 1;
  45. }
  46. if (key == 'a') {
  47. decation[change] = 2;
  48. }
  49. if (key == 's') {
  50. decation[change] = 3;
  51. }
  52. if (key == 'd') {
  53. decation[change] = 4;
  54. }
  55. }
  56. void addlong() {
  57. backgd[xfood][yfood] = 'X';
  58. if (x == xfood && y == yfood && change == 0) {
  59. length++;
  60. ytail--;
  61. xfood = rand() % 25 + 1;
  62. yfood = rand() % 77 + 1;
  63. }
  64. if (x == xfood && y == yfood && change != 0) {
  65. length++;
  66. if (decation[tailflag] == 1)
  67. xtail++;
  68. if (decation[tailflag] == 2)
  69. ytail++;
  70. if (decation[tailflag] == 3)
  71. xtail--;
  72. if (decation[tailflag] == 4)
  73. ytail--;
  74. xfood = rand() % 25 + 1;
  75. yfood = rand() % 77 + 1;
  76. }
  77. }
  78. void tail() {
  79. if (tailflag == 0) {
  80. ytail++;
  81. if (ytail == ychange[tailflag + 1])
  82. tailflag++;
  83. } else {
  84. if (decation[tailflag] == 1) {
  85. xtail--;
  86. if (xtail == xchange[tailflag + 1]) {
  87. tailflag++;
  88. return;
  89. }
  90. }
  91. if (decation[tailflag] == 2) {
  92. ytail--;
  93. if (ytail == ychange[tailflag + 1]) {
  94. tailflag++;
  95. return;
  96. }
  97. }
  98. if (decation[tailflag] == 3) {
  99. xtail++;
  100. if (xtail == xchange[tailflag + 1]) {
  101. tailflag++;
  102. return;
  103. }
  104. }
  105. if (decation[tailflag] == 4) {
  106. ytail++;
  107. if (ytail == ychange[tailflag + 1]) {
  108. tailflag++;
  109. return;
  110. }
  111. }
  112. }
  113. }
  114. int add() {
  115. clear();
  116. if (change == 0) {
  117. y++;
  118. backgd[x][y] = head;
  119. backgd[x][y - 1] = body;
  120. } else {
  121. if (decation[change] == 1) {
  122. if (backgd[x - 1][y] == '*')
  123. return 1;
  124. backgd[x - 1][y] = head;
  125. backgd[x][y] = body;
  126. x--;
  127. }
  128. if (decation[change] == 2) {
  129. if (backgd[x][y - 1] == '*')
  130. return 1;
  131. backgd[x][y - 1] = head;
  132. backgd[x][y] = body;
  133. y--;
  134. }
  135. if (decation[change] == 3) {
  136. if (backgd[x + 1][y] == '*')
  137. return 1;
  138. backgd[x + 1][y] = head;
  139. backgd[x][y] = body;
  140. x++;
  141. }
  142. if (decation[change] == 4) {
  143. if (backgd[x][y + 1] == '*')
  144. return 1;
  145. backgd[x][y + 1] = head;
  146. backgd[x][y] = body;
  147. y++;
  148. }
  149. }
  150. return 0;
  151. }
  152. int main() {
  153. xtail = x;
  154. ytail = y - length;
  155. while (1) {
  156. if (kbhit())
  157. input();
  158. if (add())
  159. break;
  160. tail();
  161. addlong();
  162. system("cls");
  163. printf("\t\t\t成绩:%d\n", length);
  164. printf("%s", backgd);
  165. }
  166. system("cls");
  167. printf("游戏结束");
  168. return 0;
  169. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/358840
推荐阅读
相关标签
  

闽ICP备14008679号