物语先生. 2023-07-27 22:17 采纳率: 50%
浏览 12
已结题

我希望这个BOSS被我击中三次之后消失,可我不知道出了什么问题,研究了半天,感觉应该是逻辑上的,但我实在不明白。关于#c语言#的问题,请各位专家解答!


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define High 25      // 游戏界面的高度
#define Width 50     // 游戏界面的宽度
#define EnemyNum 5   // 敌人的数量
#define BOSS_High 1
#define BOSS_Width 1

int position_x, position_y;     // 飞机位置坐标
int boss_x,boss_y;
int canvas[High][Width] = {0};  // 游戏界面数组,用于显示游戏元素
int enemy_x[EnemyNum], enemy_y[EnemyNum];  // 敌人位置坐标
int left,right;
int BOSS_OP;

int score,boss_po;   // 分数
int BulletWidth;      // 子弹宽度
int EnemyMoveSpeed;   // 敌人移动速度

// 游戏初始化
void startup()
{
    position_x = High - 1;   // 飞机初始位置在界面底部中央
    position_y = Width / 2;
    boss_x = 0;
    boss_y = Width / 2;
    canvas[position_x][position_y] = 1;  // 在界面上设置飞机位置为1,表示飞机

    int k;
    for (k = 0; k < EnemyNum; k++)
    {
        enemy_x[k] = rand() % 2;         // 敌人的初始位置在界面的前两行随机位置
        enemy_y[k] = rand() % Width;     // 敌人的初始位置在界面的宽度范围内随机位置
        canvas[enemy_x[k]][enemy_y[k]] = 3;  // 在界面上设置敌人位置为3,表示敌人
    }
    
    left = boss_y - BOSS_Width;  // 的左边界
    right = boss_y + BOSS_Width;  // 的右边界
    BOSS_OP = 0;
    score = 0;        // 初始化分数为0
    boss_po = 0;
    BulletWidth = 0;  // 初始化子弹宽度为0
    EnemyMoveSpeed = 20;  // 初始化敌人移动速度为20
}

// 将控制台光标定位到指定的行和列位置
void gotoxy(int x, int y)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = y;
    pos.Y = x;
    SetConsoleCursorPosition(handle, pos);
}

// 隐藏控制台窗口中的光标
void HideCursor()
{
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

// 显示游戏界面
void show()
{
    gotoxy(0, 0);  // 清空命令行窗口
    int i, j;
    printf("得分:%d\n", score);  // 显示当前分数
    for (i = 0; i < High; i++)
    {
        for (j = 0; j < Width; j++)
        {
            if (canvas[i][j] == 0)
            {
                printf(" ");  // 显示空白位置
            }
            else if (canvas[i][j] == 1)
            {
                printf("A");  // 显示飞机
            }
            else if (canvas[i][j] == 2)
            {
                printf("|");  // 显示子弹
            }
            else if (canvas[i][j] == 3)
            {
                printf("V");  // 显示敌人
            }
            else if (canvas[i][j] == 4)
            {
                printf("*");  // 显示BOOS     
            }
            else if (canvas[i][j] == 5)
            {
                printf("Y");  // 显示BOOS    
            }
            else if (canvas[i][j] == 6)
            {
                printf("V");  // 显示BOOS    
            }
            
        }
        printf("\n");
    }
    
    Sleep(20);
}

// 在没有玩家输入的情况下更新游戏状态
void updatewithoutlnput()
{
    int i, j, k;
    for (i = 0; i < High; i++)
    {
        for (j = 0; j < Width; j++)
        {
            if (canvas[i][j] == 2)  // 子弹
            {
                for (k = 0; k < EnemyNum; k++)
                {
                    if ((i == enemy_x[k]) && (j == enemy_y[k]))  // 子弹与敌人碰撞
                    {
                        score++;  // 分数增加
                        if (score % 5 == 0 && EnemyMoveSpeed > 3)  // 每击败5个敌人,敌人移动速度   ,最小为3
                        {
                            EnemyMoveSpeed--;
                        }
                        if (score % 10 == 0)  // 每击败5个敌人,子弹宽度增加
                        {
                            BulletWidth++;
                        }
                        canvas[enemy_x[k]][enemy_y[k]] = 0;  // 敌人消失
                        enemy_x[k] = rand() % 2;  // 新的敌人出现在界面的前两行随机位置
                        enemy_y[k] = rand() % Width;  // 新的敌人出现在界面的宽度范围内随机位置
                        canvas[enemy_x[k]][enemy_y[k]] = 3;  // 在界面上设置新敌人位置为3,表示敌人
                        canvas[i][j] = 0;  // 子弹消失
                    }
                    if (i == boss_x-1 && j == boss_y || (j == boss_y-1 || j == boss_y+1))  // 子弹与BOSS碰撞
                    {
                        boss_po++;
                        if(boss_po == 3)
                        {
                            BOSS_OP = 0;
                            canvas[boss_x][boss_y] = 0;  
                            canvas[boss_x-1][boss_y] = 0;  
                            for (k = left; k <= right; k++)
                            {
                                canvas[boss_x-1][k] = 0;  
                            }
                            canvas[i][j] = 0;  // 子弹消失
                        }
                    }

                    canvas[i][j] = 0;  // 子弹向上移动,原位置设置为0
                    if (i > 0)
                    {
                        canvas[i - 1][j] = 2;  // 子弹向上移动后的位置设置为2,表示子弹
                    }
                }
            }
        }
    }

    static int speed = 0;
    if (speed < 20)
    {
        speed++;
    }

    for (k = 0; k < EnemyNum; k++)
    {
        if ((position_x == enemy_x[k]) && (position_y == enemy_y[k]) || ((position_x == boss_x) && (position_y == boss_y)))  // 飞机与敌人碰撞
        {
            printf("No!!!\n");
            Sleep(3000);
            system("pause");
            exit(0);  // 游戏结束
        }

        if (boss_x > High)  // BOSS移动到界面底部,游戏结束
        {
            printf("No!!!\n");
            Sleep(3000);
            system("pause");
            exit(0);  // 游戏结束
        }
        else if (enemy_x[k] > High)  // 敌人移动到界面底部,敌人消失,分数减少
        {
            canvas[enemy_x[k]][enemy_y[k]] = 0;  // 敌人消失
            enemy_x[k] = rand() % 2;  // 新的敌人出现在界面的前两行随机位置
            enemy_y[k] = rand() % Width;  // 新的敌人出现在界面的宽度范围内随机位置
            canvas[enemy_x[k]][enemy_y[k]] = 3;  // 在界面上设置新敌人位置为3,表示敌人
            score--;  // 分数减少
        }      
        if (BOSS_OP == 1 && speed == 5)  // 控制BOSS的移动速度
        {
            // BOSS向下移动,原位置设置为0
            canvas[boss_x][boss_y] = 0;  
            canvas[boss_x-1][boss_y] = 0;  
            for (k = left; k <= right; k++)
            {
                canvas[boss_x-1][k] = 0;  
            }
            boss_x++;
            speed = 0;
                        
            // BOSS向下移动后的位置设置为4,5,6,表示敌人
            for (k = left; k <= right; k++)
            {
                canvas[boss_x-1][k] = 5;  
            }
            canvas[boss_x-1][boss_y] = 4;
            canvas[boss_x][boss_y] = 6;
        }
        else if (speed == EnemyMoveSpeed)  // 控制敌人的移动速度
        {
            for (k = 0; k < EnemyNum; k++)
            {
                canvas[enemy_x[k]][enemy_y[k]] = 0;  // 敌人向下移动,原位置设置为0
                enemy_x[k]++;
                speed = 0;
                canvas[enemy_x[k]][enemy_y[k]] = 3;  // 敌人向下移动后的位置设置为3,表示敌人
            }
        }
    }
    
    if(score % 20 == 0 && canvas[boss_x][boss_y] == 0 && score != 0)        // 生成BOSS
    {
        int k;
        for (k = left; k <= right; k++)
        {
            canvas[boss_x-1][k] = 5;  // 
        }
        canvas[boss_x-1][boss_y] = 4;
        canvas[boss_x][boss_y] = 6;
        BOSS_OP = 1;
    }
}

// 根据玩家输入更新游戏状态
void updatewithlnput()
{
    char input;
    if (kbhit())  // 检测是否有键盘输入
    {
        input = getch();  // 获取键盘输入
        if ('p' == input || 'P' == input)
        {
            printf("游戏暂停\n");
            printf("重新开启游戏请按P");
            while (1)
            {
                input = getch();
                if ('p' == input || 'P' == input)
                {
                    break;
                }
            }
        }
        if (input == 'a' || input == 'A')  // 左移飞机
        {
            canvas[position_x][position_y] = 0;  // 飞机原位置设置为0
            position_y--;  // 飞机向左移动
            canvas[position_x][position_y] = 1;  // 飞机移动后的位置设置为1,表示飞机
        }
        else if (input == 'd' || input == 'D')  // 右移飞机
        {
            canvas[position_x][position_y] = 0;  // 飞机原位置设置为0
            position_y++;  // 飞机向右移动
            canvas[position_x][position_y] = 1;  // 飞机移动后的位置设置为1,表示飞机
        }
        else if (input == 'w' || input == 'W')  // 上移飞机
        {
            canvas[position_x][position_y] = 0;  // 飞机原位置设置为0
            position_x--;  // 飞机向上移动
            canvas[position_x][position_y] = 1;  // 飞机移动后的位置设置为1,表示飞机
        }
        else if (input == 's' || input == 'S')  // 下移飞机
        {
            canvas[position_x][position_y] = 0;  // 飞机原位置设置为0
            position_x++;  // 飞机向下移动
            canvas[position_x][position_y] = 1;  // 飞机移动后的位置设置为1,表示飞机
        }
        if (input == ' ')  // 发射子弹
        {
            int left_A = position_y - BulletWidth;  // 子弹的左边界
            int right_A = position_y + BulletWidth;  // 子弹的右边界
            if (left_A < 0)
            {
                left_A = 0;
            }
            if (right_A > Width - 1)
            {
                right_A = Width - 1;
            }
            int k;
            for (k = left_A; k <= right_A; k++)
            {
                canvas[position_x - 1][k] = 2;  // 在飞机上方一行设置子弹的位置为2,表示子弹
            }
        }
    }
}

int main()
{
    startup();  // 初始化游戏
    while (1)
    {
        show();  // 显示游戏界面
        updatewithoutlnput();  // 更新游戏状态(无玩家输入)
        updatewithlnput();  // 更新游戏状态(有玩家输入)
    }
    HideCursor();
    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-28 08:24
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7580074
    • 以下回答由chatgpt基于相关博客总结生成:

      我很高兴能够回答你的问题,但是你没有提出任何具体问题。请告诉我你需要解决的具体问题,我将尽力为你提供帮助。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月30日
  • 专家修改了标签 7月29日
  • 创建了问题 7月27日

悬赏问题

  • ¥15 找别人艾特你然后删除的微博
  • ¥15 idea做图书管理系统,要求如下
  • ¥15 最短路径分配法——多路径分配
  • ¥15 SQL server 2022安装程序(英语)无法卸载
  • ¥15 关于#c++#的问题:把一个三位数的素数写在另一个三位数素数的后面
  • ¥15 求一个nao机器人跳舞的程序
  • ¥15 anaconda下载后spyder内无法正常运行
  • ¥20 统计PDF文件指定词语的出现的页码
  • ¥50 分析一个亿级消息接收处理策略的问题?
  • ¥20 uniapp 朋友圈分享单页面自定义操作