鱼C论坛

 找回密码
 立即注册
查看: 2435|回复: 1

[已解决]C语言关于打飞机游戏的小问题

[复制链接]
发表于 2019-10-16 23:36:42 | 显示全部楼层 |阅读模式
8鱼币

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <windows.h>
  5. #define High 25
  6. #define Width 50

  7. int position_x, position_y;
  8. int enemy_x, enemy_y;
  9. int canvas[High][Width] = {0};
  10. int score;

  11. void gotoxy(int x, int y)
  12. {
  13.         HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  14.     COORD pos;
  15.     pos.X = x;
  16.     pos.Y = y;
  17.     SetConsoleCursorPosition(handle, pos);
  18. }

  19. void starup()
  20. {
  21.         position_x = High - 1;
  22.         position_y = Width / 2;
  23.         enemy_x = 0;
  24.         enemy_y = position_y;
  25.         canvas[position_x][position_y] = 1;
  26.         canvas[enemy_x][enemy_y] = 3;
  27.         score = 0;
  28. }

  29. void show()
  30. {
  31.         gotoxy(0, 0);
  32.         int i, j;
  33.         for(i = 0; i < High; i++)
  34.         {
  35.                 for(j = 0; j < Width; j++)
  36.                 {
  37.                         if(canvas[i][j] == 0)
  38.                                 printf(" ");
  39.                         if(canvas[i][j] == 1)
  40.                                 printf("*");
  41.                         if(canvas[i][j] == 2)
  42.                                 printf("|");
  43.                         if(canvas[i][j] == 3)
  44.                                 printf("@");
  45.                 }
  46.                 printf("\n");
  47.         }
  48.        
  49.         printf("score = %d", score);
  50.         Sleep(20);
  51. }

  52. void updateWithoutInput()
  53. {       
  54.         //子弹的移动
  55.         int i, j;
  56.         for(i = 0; i < High; i++)
  57.                 for(j = 0; j < Width; j++)
  58.                 {
  59.                         if(canvas[i][j] == 2)
  60.                         {                               
  61.                                 if((i == enemy_x) && (j == enemy_y))       
  62.                                 {
  63.                                         score++;
  64.                                         canvas[enemy_x][enemy_y] = 0;    //敌机被打中消失
  65.                                         enemy_x = 0;                     //产生新的敌机
  66.                                         enemy_y = rand() % Width;
  67.                                         canvas[enemy_x][enemy_y] = 3;
  68.                                         canvas[i][j] = 0;                //子弹消失
  69.                                 }
  70.                                
  71.                                 canvas[i][j] = 0;
  72.                                 if(i > 0)
  73.                                         canvas[i - 1][j] = 2;           //i, j动态的移动
  74.                         }
  75.                        
  76.                 }
  77.                
  78.         //敌机碰撞我机游戏结束       
  79.         if(enemy_x == position_x && enemy_y == position_y)
  80.         {
  81.                 printf("\n游戏结束\n");
  82.                 Sleep(3000);
  83.                 system("pause");
  84.                 exit(0);
  85.         }
  86.        
  87.         //敌机跑出屏幕外
  88.         if(enemy_x > High)
  89.         {
  90.                 canvas[enemy_x][enemy_y] = 0;
  91.                 enemy_x = 0;
  92.                 enemy_y = rand() % Width;
  93.                 canvas[enemy_x][enemy_y] = 3;
  94.                 score--;
  95.         }
  96.        
  97.         //敌机下落
  98.         static int speed = 0;
  99.         if(speed < 10)
  100.                 speed++;
  101.         if(speed == 10)
  102.         {
  103.                 canvas[enemy_x][enemy_y] = 0;
  104.                 enemy_x++;
  105.                 speed = 0;
  106.                 canvas[enemy_x][enemy_y] = 3;       
  107.         }
  108.                                                                                         //问题所在
  109.         /*为什么这样写就会出错?
  110.                 canvas[enemy_x][enemy_y] = 0;
  111.                 enemy_x++;
  112.                 canvas[enemy_x][enemy_y] = 3;
  113.                 Sleep(50);     延迟50ms再执行        */
  114. }

  115. void updateWithInput()
  116. {
  117.         if(kbhit())
  118.         {
  119.                 char input = getch();
  120.                 if(input == 'a')
  121.                 {
  122.                         canvas[position_x][position_y] = 0;
  123.                         position_y--;
  124.                         canvas[position_x][position_y] = 1;
  125.                 }
  126.                 if(input == 'd')
  127.                 {
  128.                         canvas[position_x][position_y] = 0;
  129.                         position_y++;
  130.                         canvas[position_x][position_y] = 1;
  131.                 }
  132.                 if(input == 'w')
  133.                 {
  134.                         canvas[position_x][position_y] = 0;
  135.                         position_x--;
  136.                         canvas[position_x][position_y] = 1;
  137.                 }
  138.                 if(input == 's')
  139.                 {
  140.                         canvas[position_x][position_y] = 0;
  141.                         position_x++;
  142.                         canvas[position_x][position_y] = 1;
  143.                 }
  144.                 if(input == ' ')
  145.                         canvas[position_x - 1][position_y] = 2;     //固定的发射位置
  146.         }
  147. }

  148. int main()
  149. {
  150.         starup();
  151.         while(1)
  152.         {
  153.                 show();
  154.                 updateWithoutInput();
  155.                 updateWithInput();
  156.         }
  157.         return 0;
  158. }
复制代码


正确结果:击中敌机后敌机会消失,并且子弹发射速度很快
如图 2019-10-16 (3).png 2019-10-16 (2).png

改用Sleep()则会出现击中敌机后,敌机并没有消失的现象,而且子弹发射速度慢,连成一条直线
2019-10-16 (6).png


求大佬帮忙,小白真的一脸懵逼
最佳答案
2019-10-16 23:36:43
兄弟,这程序我调试了一下,发现之所以第二种写法会出现敌机打中不消失,是因为子弹和敌机是同时一个上升一个下降,导致他们错位不可出现 子弹x==敌机x 这种情况,所以在不会进入if语句把敌机清理重新生成。自己分析一下吧

最佳答案

查看完整内容

兄弟,这程序我调试了一下,发现之所以第二种写法会出现敌机打中不消失,是因为子弹和敌机是同时一个上升一个下降,导致他们错位不可出现 子弹x==敌机x 这种情况,所以在不会进入if语句把敌机清理重新生成。自己分析一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-16 23:36:43 | 显示全部楼层    本楼为最佳答案   
兄弟,这程序我调试了一下,发现之所以第二种写法会出现敌机打中不消失,是因为子弹和敌机是同时一个上升一个下降,导致他们错位不可出现 子弹x==敌机x 这种情况,所以在不会进入if语句把敌机清理重新生成。自己分析一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 16:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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