鱼C论坛

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

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

[复制链接]
发表于 2019-10-16 23:36:42 | 显示全部楼层 |阅读模式
8鱼币
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define High 25
#define Width 50 

int position_x, position_y;
int enemy_x, enemy_y;
int canvas[High][Width] = {0};
int score;

void gotoxy(int x, int y)
{
        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

void starup()
{
        position_x = High - 1;
        position_y = Width / 2;
        enemy_x = 0;
        enemy_y = position_y;
        canvas[position_x][position_y] = 1;
        canvas[enemy_x][enemy_y] = 3;
        score = 0;
}

void show()
{
        gotoxy(0, 0);
        int i, j;
        for(i = 0; i < High; i++)
        {
                for(j = 0; j < Width; j++)
                {
                        if(canvas[i][j] == 0)
                                printf(" ");
                        if(canvas[i][j] == 1)
                                printf("*");
                        if(canvas[i][j] == 2)
                                printf("|");
                        if(canvas[i][j] == 3) 
                                printf("@");
                }
                printf("\n");
        }
        
        printf("score = %d", score);
        Sleep(20);
}

void updateWithoutInput()
{        
        //子弹的移动 
        int i, j;
        for(i = 0; i < High; i++)
                for(j = 0; j < Width; j++)
                {
                        if(canvas[i][j] == 2)
                        {                                
                                if((i == enemy_x) && (j == enemy_y))        
                                {
                                        score++;
                                        canvas[enemy_x][enemy_y] = 0;    //敌机被打中消失 
                                        enemy_x = 0;                     //产生新的敌机
                                        enemy_y = rand() % Width;
                                        canvas[enemy_x][enemy_y] = 3;
                                        canvas[i][j] = 0;                //子弹消失 
                                } 
                                
                                canvas[i][j] = 0;
                                if(i > 0)
                                        canvas[i - 1][j] = 2;           //i, j动态的移动 
                        }
                        
                }
                
        //敌机碰撞我机游戏结束        
        if(enemy_x == position_x && enemy_y == position_y)
        {
                printf("\n游戏结束\n");
                Sleep(3000);
                system("pause");
                exit(0);
        }
        
        //敌机跑出屏幕外
        if(enemy_x > High) 
        {
                canvas[enemy_x][enemy_y] = 0;
                enemy_x = 0;
                enemy_y = rand() % Width;
                canvas[enemy_x][enemy_y] = 3;
                score--;
        }
        
        //敌机下落 
        static int speed = 0;
        if(speed < 10)
                speed++;
        if(speed == 10)
        {
                canvas[enemy_x][enemy_y] = 0;
                enemy_x++;
                speed = 0;
                canvas[enemy_x][enemy_y] = 3;        
        }
                                                                                        //问题所在
        /*为什么这样写就会出错? 
                canvas[enemy_x][enemy_y] = 0;
                enemy_x++;
                canvas[enemy_x][enemy_y] = 3;
                Sleep(50);     延迟50ms再执行        */
}

void updateWithInput()
{
        if(kbhit())
        {
                char input = getch();
                if(input == 'a')
                {
                        canvas[position_x][position_y] = 0;
                        position_y--;
                        canvas[position_x][position_y] = 1;
                }
                if(input == 'd')
                {
                        canvas[position_x][position_y] = 0;
                        position_y++;
                        canvas[position_x][position_y] = 1;
                }
                if(input == 'w')
                {
                        canvas[position_x][position_y] = 0;
                        position_x--;
                        canvas[position_x][position_y] = 1;
                }
                if(input == 's')
                {
                        canvas[position_x][position_y] = 0;
                        position_x++;
                        canvas[position_x][position_y] = 1;
                }
                if(input == ' ')
                        canvas[position_x - 1][position_y] = 2;     //固定的发射位置 
        }
}

int main()
{
        starup(); 
        while(1)
        {
                show();
                updateWithoutInput();
                updateWithInput();
        }
        return 0;
}

正确结果:击中敌机后敌机会消失,并且子弹发射速度很快
如图 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语句把敌机清理重新生成。自己分析一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 21:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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