搜索
查看: 246|回复: 1
打印 上一主题 下一主题

aaaaa 请求帮助就一条我没有搞懂

[复制链接]
跳转到指定楼层
楼主
 楼主| 发表于 2020-4-23 18:52:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
  1. #include<stdio.h>
  2. #include<easyx.h>
  3. #include<conio.h>

  4. #include<time.h>
  5. #define ROW 46
  6. #define COL 64
  7. //枚举
  8. enum game
  9. {
  10.   SPACE, WALL, SNAKE, FOOD, HEAD//空地  墙  蛇  食物
  11. };
  12. /************全局变量************/
  13. int mode = 0;      //游戏模式
  14. int score = 0;      //分数
  15. DWORD t1, t2;      //定义两个时间控制移动速度
  16. int map[ROW][COL];    //地图大小
  17. COORD snake[1024];    //蛇      typedef struct _COORD {SHORT X;SHORT Y;} COORD, *PCOORD;
  18. size_t SnakeSize;    //蛇的尺度    typedef unsigned int     size_t;
  19. char SnakeDir;      //蛇移动方向
  20. /************全局函数************/
  21. void start();  //开始界面
  22. void chose();  //选择模式  0:普通模式  1:穿墙模式  2:无敌模式
  23. void DrawMap();  //画图
  24. void init();  //初始化游戏数据
  25. void addfood();  //添加食物
  26. void ChangeDir();  //修改蛇的方向
  27. void move();//蛇的移动
  28. int main()
  29. {
  30.   initgraph(640, 480);
  31.   start();
  32.   outtextxy(260, 150, L"->");    //初始默认模式一
  33.   chose();
  34.   init();
  35.   while (1)
  36.   {
  37.     t2 = GetTickCount();
  38.     DrawMap();
  39.     if (kbhit())
  40.     {
  41.       ChangeDir();
  42.       move();

  43.       t2 = GetTickCount();
  44.       t1 = t2;
  45.     }
  46.     if (t2 - t1 > 50)
  47.     {
  48.       move();
  49.       t1 = t2;
  50.     }
  51.   }
  52.   getchar();
  53.   closegraph();
  54.   return 0;
  55. }
  56. void init()
  57. {
  58.   srand((unsigned)time(NULL));  //随机种子
  59.   setbkcolor(WHITE);        //设置背景颜色

  60.   memset(map, SPACE, sizeof(map));//初始化map数组为0即SPACE
  61.   //每一行的 第一个 和 最后一个 是墙
  62.   for (int i = 0; i < ROW; i++)
  63.   {
  64.     map[i][0] = map[i][COL - 1] = WALL;
  65.   }
  66.   //每一列的 第二个 和 倒数第二 个是墙
  67.   for (int j = 1; j < COL - 1; j++)
  68.   {
  69.     map[0][j] = map[ROW - 1][j] = WALL;
  70.   }
  71.   //定义蛇头和蛇的身体
  72.   map[3][5] = HEAD;
  73.   map[3][4] = map[3][3] = SNAKE;
  74.   //初始化蛇
  75.   SnakeSize = 3;  //蛇 长
  76.   SnakeDir = 'D';  //蛇方向向右
  77.   snake[0].X = 3;
  78.   snake[0].Y = 5;
  79.   snake[1].X = 3;
  80.   snake[1].Y = 4;
  81.   snake[2].X = 3;
  82.   snake[2].Y = 3;
  83.   addfood();
  84. }
  85. void start()
  86. {
  87.   setbkcolor(WHITE);    //设置窗口背景色为白色
  88.   cleardevice();      //刷新屏幕

  89.   setbkmode(TRANSPARENT);  //设置字体背景色为透明
  90.   settextcolor(BLACK);    //设置字体颜色为红色
  91.   /*****************游戏规则*****************/
  92.   outtextxy(290, 80, L"功能选择:");
  93.   outtextxy(280, 150, L"1.普通模式");
  94.   outtextxy(280, 200, L"2.穿墙模式");
  95.   outtextxy(280, 250, L"3.无敌模式");
  96.   outtextxy(200, 280, L"数字键 1,2,3 选择模式,Enter键进入游戏");
  97.   outtextxy(200, 300, L"字母键 W,S,A,D 方向键 上下左右 控制方向");
  98.   outtextxy(130, 350, L"相关内容:");
  99.   outtextxy(160, 380, L"关注微信公众号: 编程学习基地 获取源码");
  100.   outtextxy(160, 410, L"编程学习加群:  879098023");
  101. }
  102. void chose()
  103. {
  104.   while (1)
  105.   {
  106.     switch (getch())
  107.     {
  108.     case '1':
  109.       start();
  110.       outtextxy(260, 150, L"->");
  111.       mode = 0;
  112.       break;
  113.     case '2':
  114.       start();
  115.       outtextxy(260, 200, L"->");
  116.       mode = 1;
  117.       break;
  118.     case '3':
  119.       start();
  120.       outtextxy(260, 250, L"->");
  121.       mode = 2;
  122.       break;
  123.     case 13:
  124.       return;
  125.       break;
  126.     }
  127.   }
  128. }
  129. void DrawMap()
  130. {
  131.   BeginBatchDraw();  //开始绘图
  132.   setbkcolor(WHITE);  //设置背景颜色为白色
  133.   settextcolor(RGB(238,0,0));
  134.   cleardevice();    //清屏
  135.   WCHAR arr[10];    //保存成绩
  136.   wsprintf(arr, L"总分:%d", score);  //将成绩格式化输出到字符串arr中
  137.   outtextxy(0, 0, arr);        //显示成绩
  138.   for (int y = 0; y < ROW; y++)    //y轴方向向下
  139.   {
  140.     for (int x = 0; x < COL; x++)  //x轴方向下上
  141.     {
  142.       switch (map[y][x])
  143.       {
  144.       case SPACE:
  145.         break;
  146.       case WALL:
  147.         setlinecolor(BLACK);  
  148.         setfillcolor(RGB(238, 233, 233));  //灰色
  149.         fillrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  150.         break;
  151.       case SNAKE:
  152.         setlinecolor(RGB(0, 245, 255));    //绿色
  153.         setfillcolor(WHITE);
  154.         fillrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  155.         break;
  156.       case HEAD:
  157.         //画七彩蛇头
  158.         switch (rand() % 7)
  159.         {
  160.         case 0:
  161.           setfillcolor(RGB(255, 0, 0));    //红色 255 0 0
  162.           solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  163.           break;
  164.         case 1:
  165.           setfillcolor(RGB(255, 165, 0));    //橙  255 165 0
  166.           solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  167.           break;
  168.         case 2:
  169.           setfillcolor(RGB(255, 255, 0));    //黄  255 255 0
  170.           solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  171.           break;
  172.         case 3:
  173.           setfillcolor(RGB(0, 255, 0));    //绿色  0, 255, 0
  174.           solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  175.           break;
  176.         case 4:
  177.           setfillcolor(RGB(0, 255, 255));    //青  0 255 255
  178.           solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  179.           break;
  180.         case 5:
  181.           setfillcolor(RGB(0, 0, 255));    //蓝  0 0 255
  182.           solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  183.           break;
  184.         case 6:
  185.           setfillcolor(RGB(160, 32, 240));  //紫  160 32 240
  186.           solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  187.           break;
  188.         default:
  189.           break;
  190.         }
  191.         break;
  192.       case FOOD:
  193.         setfillcolor(RGB(255, 0, 0));      //红色
  194.         solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
  195.         break;
  196.       default:
  197.         break;
  198.       }
  199.     }
  200.   }
  201.   EndBatchDraw();
  202. }
  203. void addfood()
  204. {
  205.   int row, col;
  206.   do
  207.   {  
  208.     row = rand() % (ROW - 1) + 1;
  209.     col = rand() % (COL - 1) + 1;
  210.   } while (map[row][col] != SPACE);
  211.   map[row][col] = FOOD;
  212. }
  213. void ChangeDir()
  214. {
  215.   switch (getch())
  216.   {
  217.   case'A':
  218.   case'a':
  219.   case 75:
  220.     if (SnakeDir != 'D') SnakeDir = 'A';  //蛇不能后退
  221.     break;
  222.   case'D':
  223.   case'd':
  224.   case 77:
  225.     if (SnakeDir != 'A') SnakeDir = 'D';
  226.     break;
  227.   case'W':
  228.   case'w':
  229.   case 72:
  230.     if (SnakeDir != 'S') SnakeDir = 'W';
  231.     break;
  232.   case'S':
  233.   case's':
  234.   case 80:
  235.     if (SnakeDir != 'W') SnakeDir = 'S';
  236.     break;
  237.   case 32:
  238.     getch();
  239.     break;
  240.   default:
  241.     break;
  242.   }
  243. }
  244. void move()
  245. {
  246.   COORD next;    //蛇头的下一个位置
  247.   switch (SnakeDir)
  248.   {
  249.   case'A':
  250.     next.X = snake[0].X;
  251.     next.Y = snake[0].Y - 1;
  252.     break;
  253.   case'W':
  254.     next.X = snake[0].X - 1;
  255.     next.Y = snake[0].Y;
  256.     break;
  257.   case'D':
  258.     next.X = snake[0].X;
  259.     next.Y = snake[0].Y + 1;
  260.     break;
  261.   case'S':
  262.     next.X = snake[0].X + 1;
  263.     next.Y = snake[0].Y;
  264.     break;
  265.   default:
  266.     break;
  267.   }

  268.   switch (map[next.X][next.Y])
  269.   {
  270.   case SPACE://直接移动
  271.     map[snake[SnakeSize - 1].X][snake[SnakeSize - 1].Y] = SPACE;//地图蛇尾所在地置空
  272.     for (int i = SnakeSize - 1; i > 0; i--)            //蛇尾到蛇头整体移动一位
  273.     {
  274.       snake[i] = snake[i - 1];
  275.     }
  276.     map[snake[0].X][snake[0].Y] = SNAKE;            //蛇头置 蛇
  277.     snake[0] = next;                      //将下一个位置赋值给蛇头
  278.     map[snake[0].X][snake[0].Y] = HEAD;              //设置头
  279.     break;
  280.   case WALL:
  281.     if (mode)    //模式1模式2可穿墙
  282.     {
  283.       map[snake[SnakeSize - 1].X][snake[SnakeSize - 1].Y] = SPACE;//蛇尾置空
  284.       for (int i = SnakeSize - 1; i > 0; i--)            //蛇尾到蛇头整体移动一位
  285.       {
  286.         snake[i] = snake[i - 1];
  287.       }
  288.       map[snake[0].X][snake[0].Y] = SNAKE;            //蛇头置 蛇
  289.       switch (SnakeDir)                      //穿墙
  290.       {
  291.       case'A':next.Y = COL - 2; break;
  292.       case 'D':next.Y = 1; break;
  293.       case 'W': next.X = ROW - 2; break;
  294.       case 'S':next.X = 1; break;
  295.       default:
  296.         break;
  297.       }
  298.       snake[0] = next;                      //蛇头移动到新位置
  299.       map[snake[0].X][snake[0].Y] = HEAD;              //新的蛇头所在的位置
  300.     }
  301.     else {
  302.       MessageBox(GetHWnd(), L"游戏结束", L"SORRY", MB_OK);
  303.       exit(0);
  304.     }
  305.     break;
  306.   case SNAKE:
  307.     if (mode == 2)    //模式二无敌
  308.     {
  309.       break;
  310.     }
  311.     else {
  312.       MessageBox(GetHWnd(), L"游戏结束", L"SORRY", MB_OK);
  313.       exit(0);
  314.     }
  315.     break;
  316.   case FOOD://食物        蛇尾不变
  317.     for (int i = SnakeSize; i > 0; i--)              //蛇尾到蛇头整体移动一位
  318.     {
  319.       snake[i] = snake[i - 1];               
  320.     }
  321.     map[snake[0].X][snake[0].Y] = SNAKE;            //蛇头 置 蛇
  322.     snake[0] = next;                      //将下一个位置赋值给蛇头
  323.     score++;      //分数加一        
  324.     (SnakeSize)++;    //蛇尺度加一
  325.     map[snake[0].X][snake[0].Y] = HEAD;              //地图上重置蛇头
  326.     addfood();
  327.     break;
  328.   default:break;
  329.   }
  330. }
复制代码

沙发
发表于 2020-5-13 13:16:04 | 只看该作者
那一条啊???
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表