Snake 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <graphics.h>
  5. /*
  6. 复习:结构体、循环、函数、数组、eaxyx
  7. eaxyx:图形界面库
  8. */
  9. //做界面1,创建一个图形界面窗口
  10. //🐍的方向
  11. //🐍的速度
  12. //🐍的结构
  13. #define SNAKE_NUM 500 //蛇的最大节数
  14. enum DIR //表示🐍的方向
  15. {
  16. UP,
  17. DOWN,
  18. LEFT,
  19. RIGHT,
  20. };
  21. struct Snake
  22. {
  23. int size; //🐍的节数
  24. int dir; //🐍的方向
  25. int speed; //🐍的速度
  26. POINT coor[SNAKE_NUM]; //坐标
  27. }snake;
  28. //数据的初始化
  29. void GameInit()
  30. {
  31. //init 初始化 graph 图形化窗口 SHOWCONSOLE 显示控制台
  32. initgraph(640, 480);
  33. //初始化🐍
  34. snake.size = 3;
  35. snake.speed = 10;
  36. snake.dir = RIGHT; //初始化定义🐍的方向为RIGHT
  37. for (int i = snake.size - 1; i >= 0; i--)
  38. {
  39. snake.coor[i].x = 40 - 10 * i;
  40. snake.coor[i].y = 10;
  41. //printf("?%d %d", snake.coor[i].x, snake.coor[i].y);
  42. }
  43. //snake.coor[0].x = 40;
  44. //snake.coor[0].y = 10;
  45. //snake.coor[1].x = 30;
  46. //snake.coor[1].y = 10;
  47. //snake.coor[2].x = 20;
  48. //snake.coor[2].y = 10;
  49. }
  50. void GameDraw()
  51. {
  52. //双缓冲绘图
  53. BeginBatchDraw();
  54. //设置背景颜色
  55. setbkcolor(RGB(85, 0, 255));
  56. cleardevice();
  57. //绘制🐍
  58. //setfillcolor()
  59. for (int i = 0; i < snake.size; i++)
  60. {
  61. solidcircle(snake.coor[i].x, snake.coor[i].y, 5);
  62. }
  63. EndBatchDraw();
  64. }
  65. //移动🐍
  66. void snakeMove()
  67. {
  68. //移动是坐标发生改变
  69. //让身体跟着头移动
  70. for (int i = snake.size - 1; i > 0; i--)
  71. {
  72. snake.coor[i] = snake.coor[i - 1];
  73. }
  74. switch (snake.dir)
  75. {
  76. case UP:
  77. snake.coor[0].y -= snake.speed;
  78. if (snake.coor[0].y <= 0)//头跑出了上边界
  79. {
  80. snake.coor[0].y = 640;
  81. }
  82. break;
  83. case DOWN:
  84. snake.coor[0].y += snake.speed;
  85. break;
  86. case LEFT:
  87. snake.coor[0].x -= snake.speed;
  88. break;
  89. case RIGHT:
  90. snake.coor[0].x += snake.speed;
  91. break;
  92. }
  93. }
  94. //通过按键盘改变🐍的移动方向
  95. void keyControl()
  96. {
  97. //判断有没有按键盘,如果有按键,就返回真
  98. if (_kbhit())
  99. {
  100. //72 80 75 77 方向键上下左右键值
  101. switch (_getch())
  102. {
  103. case 'w':
  104. case 'W':
  105. case 72:
  106. if (snake.dir != DOWN)
  107. {
  108. snake.dir = UP;
  109. }
  110. break;
  111. case 's':
  112. case 'S':
  113. case 80:
  114. if (snake.dir != UP)
  115. {
  116. snake.dir = DOWN;
  117. }
  118. break;
  119. case 'a':
  120. case 'A':
  121. case 75:
  122. if (snake.dir != RIGHT)
  123. {
  124. snake.dir = LEFT;
  125. }
  126. break;
  127. case 'd':
  128. case 'D':
  129. case 77:
  130. if (snake.dir != LEFT)
  131. {
  132. snake.dir = RIGHT;
  133. }
  134. break;
  135. }
  136. }
  137. }
  138. int main()
  139. {
  140. GameInit();
  141. while (1)
  142. {
  143. GameDraw();
  144. snakeMove();
  145. keyControl();
  146. Sleep(20);
  147. }
  148. return 0;
  149. }