鱼C论坛

 找回密码
 立即注册
查看: 991|回复: 7

[已解决]C++贪吃蛇错误

[复制链接]
发表于 2020-7-5 22:33:23 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <graphics.h>
  4. #include <Windows.h>
  5. #include <conio.h>
  6. #include <time.h>

  7. /********************************
  8. *        初始化蛇                intiSnake
  9. *        画蛇                        drawSnake
  10. *        移动蛇                        moveSnake
  11. *        按键处理                keyDown
  12. *        初始化食物                initFood
  13. *        画食物                        drawFood
  14. *        吃食物                        eatFood
  15. *        蛇什么时候死亡        SnakeDie
  16. *********************************/
  17. void initSnake();
  18. void drawSnake();
  19. void moveSnake();
  20. void keyDown();
  21. void initFood();
  22. void drawFood();
  23. void eatFood();
  24. void snakeDie();
  25. //void showGrade();

  26. //坐标
  27. struct point_XY {       

  28.         int x;
  29.         int y;

  30. };

  31. //蛇属性
  32. struct {

  33.         int num;                                //蛇的节数
  34.         point_XY snakeXY[100];  //最多100节
  35.         char postion;                        //方向
  36.         int flag;                                //判断是否蛇死亡

  37. }snake;

  38. //食物的属性
  39. struct {

  40.         point_XY foodXY;        //食物坐标(X和Y)
  41.         int eatGrade;                //吃掉食物所得分数
  42.         int flag;                    //食物是否存在

  43. }food;

  44. //枚举方向  模拟键码值
  45. enum movPostion {

  46.         right = 72, left = 75, down = 77, up = 80        //对应上下左右键的键码值

  47. };

  48. HWND hwnd;
  49. int speed = 50;

  50. int main() {
  51.        
  52.         using namespace std;

  53.         srand((unsigned int)time(NULL));
  54.         hwnd = initgraph(640, 480);
  55.         setbkcolor(WHITE);                //窗口颜色为白White
  56.         cleardevice();                        //刷新
  57.         initSnake();                        //创建蛇
  58.         snake.flag = 0;
  59.         initFood();                                //创建食物
  60.         //showGrade();                        //显示分数
  61.        
  62.         while (true) {
  63.                 cleardevice();                //刷新背景
  64.                 drawSnake();                //画蛇
  65.                 moveSnake();                //移动蛇
  66.                 //snakeDie();
  67.                 //if (snake.flag == 1) break;
  68.                 if (food.flag != 1) initFood();                //初始化食物
  69.                 if (food.flag == 1) drawFood();                //画食物

  70.                 eatFood();

  71.                 while (_kbhit()) {

  72.                         keyDown();                //如果有键盘输入,检测输入

  73.                 }

  74.                 Sleep(speed);                        //间隔时间50ms
  75.                
  76.         }

  77.         getchar();

  78.         return 0;
  79. }

  80. //初始化蛇
  81. void initSnake() {

  82.         snake.num = 3;        //初始化时为三节
  83.        
  84.         snake.snakeXY[0].x = 0;
  85.         snake.snakeXY[0].y = 0;       
  86.        
  87.         snake.snakeXY[1].x = 10;        //间隔10像素
  88.         snake.snakeXY[1].y = 0;

  89.         snake.snakeXY[2].x = 20;
  90.         snake.snakeXY[2].y = 0;

  91.         snake.postion = right;                //初始化方向为右

  92.         food.flag = 0;
  93.        
  94. }

  95. //画蛇
  96. void drawSnake() {

  97.         for (int i = 0; i < snake.num; i++) {

  98.                 setlinecolor(BLACK);        //矩形边框颜色为黑Black
  99.                 setfillcolor(BLUE);                //矩形内部颜色为蓝blue
  100.                 fillrectangle(snake.snakeXY[i].x, snake.snakeXY[i].y, snake.snakeXY[i].x + 10, snake.snakeXY[i].y + 10);

  101.         }

  102. }

  103. //移动蛇
  104. void moveSnake() {
  105.         //除蛇第一节以外的移动坐标处理
  106.         for (int i = snake.num - 1; i > 0; i--) {

  107.                 snake.snakeXY[i].x = snake.snakeXY[i - 1].x;
  108.                 snake.snakeXY[i].y = snake.snakeXY[i - 1].y;

  109.         }
  110.        
  111.         //第一节坐标处理
  112.         switch (snake.postion) {

  113.         case right:
  114.                 snake.snakeXY[0].x += 10;
  115.                 break;
  116.         case left:
  117.                 snake.snakeXY[0].x -= 10;
  118.                 break;
  119.         case down:
  120.                 snake.snakeXY[0].y += 10;
  121.                 break;
  122.         case up:
  123.                 snake.snakeXY[0].y -= 10;
  124.                 break;
  125.         default:
  126.                 break;

  127.         }

  128. }

  129. //按键处理
  130. void keyDown() {

  131.         char userKey;
  132.         userKey = _getch();
  133.        
  134.         switch (userKey) {

  135.         case right:
  136.                 if (snake.postion != down) snake.postion = up;
  137.                 break;
  138.         case left:
  139.                 if (snake.postion != right) snake.postion = left;
  140.                 break;
  141.         case down:
  142.                 if (snake.postion != left) snake.postion = right;
  143.                 break;
  144.         case up:
  145.                 if (snake.postion != up) snake.postion = down;
  146.                 break;
  147.         case 112:
  148.                 speed = 10;
  149.                 break;
  150.         case 113:
  151.                 speed = 20;
  152.                 break;
  153.         case 114:
  154.                 speed = 30;
  155.                 break;
  156.         case 115:
  157.                 speed = 40;
  158.                 break;
  159.         case 116:
  160.                 speed = 50;
  161.                 break;
  162.         case 117:
  163.                 speed = 60;
  164.                 break;
  165.         case 118:
  166.                 speed = 70;
  167.                 break;
  168.         case 119:
  169.                 speed = 80;
  170.                 break;
  171.         case 120:
  172.                 speed = 90;
  173.                 break;
  174.         case 121:
  175.                 speed = 100;
  176.                 break;
  177.         case 122:
  178.                 speed = 110;
  179.                 break;
  180.         case 123:
  181.                 speed = 120;
  182.                 break;
  183.         default:
  184.                 break;

  185.         }

  186. }

  187. //初始化食物
  188. void initFood() {

  189.         food.foodXY.x = rand() % 65 * 10;        //坐标一定要是10的倍数
  190.         food.foodXY.y = rand() % 48 * 10;
  191.         food.flag = 1;
  192.        
  193.         for (int i = 0; i < snake.num; i++) {

  194.                 //如果坐标重复,重新生成
  195.                 if (food.foodXY.x == snake.snakeXY[i].x and food.foodXY.y == snake.snakeXY[i].y) {
  196.                
  197.                         food.foodXY.x = rand() % 65 * 10;
  198.                         food.foodXY.y = rand() % 48 * 10;

  199.                 }

  200.         }
  201. }

  202. //画食物
  203. void drawFood() {

  204.         fillrectangle(food.foodXY.x, food.foodXY.y, food.foodXY.x + 10, food.foodXY.y + 10);
  205.         setlinecolor(BLACK);        //矩形边框颜色为黑Black
  206.         setfillcolor(BLUE);                //矩形内部颜色为蓝blue

  207. }

  208. //吃食物
  209. void eatFood() {

  210.         //蛇变长了
  211.         if (snake.snakeXY[0].x == food.foodXY.x and snake.snakeXY[0].y == food.foodXY.y) {

  212.                 snake.num++;
  213.                 food.eatGrade += 10;
  214.                 food.flag = 0;

  215.         //重新画食物

  216.                 void drawFood();

  217.         }

  218. }

  219. //判断蛇死亡
  220. void snakeDie() {

  221.         if (snake.snakeXY[0].x > 640 or snake.snakeXY[0].x < 0 or snake.snakeXY[0].y > 480 or snake.snakeXY[0].y < 0) {

  222.                 outtextxy(200, 200, "你撞南墙了!");
  223.                 MessageBox(hwnd, "GameOver!!!", "你撞墙了!!!", MB_OK);
  224.                 snake.flag = 1;                        //蛇死亡,游戏结束

  225.         }
  226.         for (int i = 1; i < snake.num; i++) {

  227.                 if (snake.snakeXY[0].x == snake.snakeXY[i].x and snake.snakeXY[0].y == snake.snakeXY[i].y) {

  228.                         outtextxy(200, 200, "你撞自己了!");
  229.                         MessageBox(hwnd, "GameOver!!!", "你自杀了!!!", MB_OK);                //蛇死亡,游戏结束
  230.                         snake.flag = 1;                //蛇死亡,游戏结束

  231.                 }

  232.         }

  233. }
复制代码


照视频写了一个C++ easyX 贪吃蛇,作了一点修改,不加死亡判断函数就正常,加了就直接显示死亡,改了好久都不行(头大),希望有dalao帮忙看看。

最佳答案
2020-7-6 10:07:52
初始蛇的坐标不对,改一下initSnake()函数,把3个点的坐标反一下,再试试正常不
  1. void initSnake() {

  2.     snake.num = 3;           //初始化时为三节

  3.     snake.snakeXY[0].x = 20;
  4.     snake.snakeXY[0].y = 0;

  5.     snake.snakeXY[1].x = 10;  //间隔10像素
  6.     snake.snakeXY[1].y = 0;

  7.     snake.snakeXY[2].x = 0;
  8.     snake.snakeXY[2].y = 0;

  9.     snake.postion = right;    //初始化方向为右

  10.     food.flag = 0;

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

使用道具 举报

发表于 2020-7-5 22:57:03 | 显示全部楼层
没 graphics.h,看不了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-6 08:34:45 | 显示全部楼层

就去easyX官网下一个就可以了呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 08:45:57 | 显示全部楼层
换一个不要 graphics.h的版本看看呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-6 08:50:35 | 显示全部楼层
jhanker 发表于 2020-7-6 08:45
换一个不要 graphics.h的版本看看呗

先把这个问题解决了再说吧,而且我是觉得EasyX挺好的,和我之前学的turtle有点像
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 09:14:41 | 显示全部楼层
livcui 发表于 2020-7-6 08:50
先把这个问题解决了再说吧,而且我是觉得EasyX挺好的,和我之前学的turtle有点像

我以前写的版本的代码参考看看
https://fishc.com.cn/thread-173032-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 10:07:52 | 显示全部楼层    本楼为最佳答案   
初始蛇的坐标不对,改一下initSnake()函数,把3个点的坐标反一下,再试试正常不
  1. void initSnake() {

  2.     snake.num = 3;           //初始化时为三节

  3.     snake.snakeXY[0].x = 20;
  4.     snake.snakeXY[0].y = 0;

  5.     snake.snakeXY[1].x = 10;  //间隔10像素
  6.     snake.snakeXY[1].y = 0;

  7.     snake.snakeXY[2].x = 0;
  8.     snake.snakeXY[2].y = 0;

  9.     snake.postion = right;    //初始化方向为右

  10.     food.flag = 0;

  11. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2020-7-6 11:38:39 | 显示全部楼层
superbe 发表于 2020-7-6 10:07
初始蛇的坐标不对,改一下initSnake()函数,把3个点的坐标反一下,再试试正常不

谢了,一切正常了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 16:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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