#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;
}
![](https://profile-avatar.csdnimg.cn/2dd18c8deaf3461ba3e9082dc51a14c6_qq_74335669.jpg!4)
我希望这个BOSS被我击中三次之后消失,可我不知道出了什么问题,研究了半天,感觉应该是逻辑上的,但我实在不明白。关于#c语言#的问题,请各位专家解答!
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注
不知道你这个问题是否已经解决, 如果还没有解决的话:- 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7580074
- 以下回答由chatgpt基于相关博客总结生成:
我很高兴能够回答你的问题,但是你没有提出任何具体问题。请告诉我你需要解决的具体问题,我将尽力为你提供帮助。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决评论 打赏 举报无用 1
悬赏问题
- ¥15 找别人艾特你然后删除的微博
- ¥15 idea做图书管理系统,要求如下
- ¥15 最短路径分配法——多路径分配
- ¥15 SQL server 2022安装程序(英语)无法卸载
- ¥15 关于#c++#的问题:把一个三位数的素数写在另一个三位数素数的后面
- ¥15 求一个nao机器人跳舞的程序
- ¥15 anaconda下载后spyder内无法正常运行
- ¥20 统计PDF文件指定词语的出现的页码
- ¥50 分析一个亿级消息接收处理策略的问题?
- ¥20 uniapp 朋友圈分享单页面自定义操作