地空对战游戏(通常称为飞机大战)是一个经典的射击类游戏,在这个游戏中,玩家控制一架飞机(通常是飞机的图形或者符号),并与敌机进行对战。敌机会从上方飞来,玩家的任务是摧毁敌机并避免被敌机击中。游戏的难度通常随着时间的推移而增加。
为了实现这个游戏,我们可以在控制台上使用C语言来模拟地空对战。程序中的飞机(玩家控制的飞机)将可以左右移动,发射子弹攻击敌机,而敌机会向下方移动并随机产生。
项目设计
- 游戏面板:通过一个二维数组来表示游戏面板,显示玩家飞机和敌机的位置。
- 玩家控制:玩家可以通过键盘控制飞机的左右移动,并发射子弹。
- 敌机行为:敌机会从屏幕顶部逐行向下移动,玩家需要摧毁它们。
- 游戏逻辑:
- 玩家飞机和敌机通过键盘输入来控制。
- 游戏面板定期更新,确保实时显示敌机的移动和子弹的发射。
- 时间管理:利用系统时间来控制游戏刷新速度,模拟实时游戏体验。
C语言代码实现
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 40 // 游戏屏幕宽度
#define HEIGHT 20 // 游戏屏幕高度
#define MAX_BULLETS 5 // 最大子弹数
// 游戏状态
char screen[HEIGHT][WIDTH + 1]; // 游戏面板
int playerX = WIDTH / 2; // 玩家飞机位置(X坐标)
int playerY = HEIGHT - 2; // 玩家飞机位置(Y坐标)
int bullets[MAX_BULLETS][2]; // 子弹位置(每个子弹有X, Y坐标)
int bulletCount = 0; // 当前子弹数
// 敌机结构体
typedef struct {
int x, y; // 敌机位置
} Enemy;
Enemy enemies[10]; // 敌机数组
int enemyCount = 0; // 当前敌机数
// 初始化游戏屏幕
void init_screen() {
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
if (x == WIDTH - 1) {
screen[y][x] = '\0'; // 行末尾添加字符串终结符
} else {
screen[y][x] = ' '; // 空格表示屏幕的空白区域
}
}
}
}
// 显示屏幕
void display_screen() {
system("cls"); // 清屏(Windows特有,Linux可以使用system("clear"))
for (int y = 0; y < HEIGHT; y++) {
printf("%s\n", screen[y]);
}
}
// 初始化玩家飞机
void draw_player() {
screen[playerY][playerX] = '^'; // 玩家飞机用字符^表示
}
// 移动玩家飞机
void move_player() {
if (_kbhit()) { // 检测是否有键盘输入
char ch = _getch(); // 获取按下的键
if (ch == 'a' && playerX > 0) { // 'a' 左移
playerX--;
} else if (ch == 'd' && playerX < WIDTH - 1) { // 'd' 右移
playerX++;
} else if (ch == 'w' && playerY > 0) { // 'w' 上移
playerY--;
} else if (ch == 's' && playerY < HEIGHT - 1) { // 's' 下移
playerY++;
} else if (ch == ' ' && bulletCount < MAX_BULLETS) { // 空格键发射子弹
bullets[bulletCount][0] = playerX;
bullets[bulletCount][1] = playerY - 1; // 子弹从玩家飞机上方发射
bulletCount++;
}
}
}
// 绘制敌机
void draw_enemies() {
for (int i = 0; i < enemyCount; i++) {
if (enemies[i].y < HEIGHT) {
screen[enemies[i].y][enemies[i].x] = 'X'; // 敌机用字符'X'表示
}
}
}
// 敌机移动
void move_enemies() {
for (int i = 0; i < enemyCount; i++) {
enemies[i].y++;
if (enemies[i].y >= HEIGHT) {
// 如果敌机超过屏幕底部,重新生成到顶部
enemies[i].y = 0;
enemies[i].x = rand() % WIDTH;
}
}
}
// 绘制子弹
void draw_bullets() {
for (int i = 0; i < bulletCount; i++) {
if (bullets[i][1] >= 0) {
screen[bullets[i][1]][bullets[i][0]] = '|'; // 子弹用字符'|'表示
}
}
}
// 移动子弹
void move_bullets() {
for (int i = 0; i < bulletCount; i++) {
bullets[i][1]--;
}
}
// 子弹和敌机碰撞检测
void check_collisions() {
for (int i = 0; i < bulletCount; i++) {
for (int j = 0; j < enemyCount; j++) {
if (bullets[i][0] == enemies[j].x && bullets[i][1] == enemies[j].y) {
// 子弹击中敌机,消除子弹和敌机
bullets[i][1] = -1; // 将子弹位置设置为无效
enemies[j].y = -1; // 将敌机位置设置为无效
}
}
}
}
// 随机生成敌机
void generate_enemies() {
if (enemyCount < 10 && rand() % 20 == 0) { // 每20次循环有一定几率生成敌机
enemies[enemyCount].x = rand() % WIDTH;
enemies[enemyCount].y = 0;
enemyCount++;
}
}
int main() {
srand(time(NULL)); // 初始化随机数生成器
init_screen(); // 初始化游戏屏幕
while (1) {
// 清空屏幕
init_screen();
// 移动玩家飞机
move_player();
draw_player(); // 绘制玩家飞机
// 移动敌机
move_enemies();
draw_enemies(); // 绘制敌机
// 移动子弹
move_bullets();
draw_bullets(); // 绘制子弹
// 检测碰撞
check_collisions();
// 随机生成敌机
generate_enemies();
// 刷新屏幕
display_screen();
// 稍微延时,控制游戏的刷新速度
Sleep(100); // Windows平台可以使用Sleep函数(100毫秒延时)
}
return 0;
}
代码解析
-
屏幕初始化和绘制:
init_screen()
函数用来初始化整个屏幕,并将所有位置填充为空格。display_screen()
函数将当前的游戏屏幕输出到控制台。
-
玩家控制:
- 玩家可以通过按
a
、d
键来左右移动,按w
、s
键来上下移动。按空格键发射子弹。 - 玩家飞机的位置通过
playerX
和playerY
来控制。
- 玩家可以通过按
-
敌机生成和移动:
- 敌机通过
generate_enemies()
随机生成,每次生成时,敌机的X坐标随机,Y坐标为0(即从顶部生成)。 - 敌机会下移,达到屏幕底部时会重新出现在顶部。
- 敌机通过
-
子弹控制:
- 子弹从玩家飞机的上方发射,子弹会向上移动。如果子弹与敌机碰撞,则敌机和子弹都会被删除。
-
碰撞检测:
- 每帧都进行碰撞检测,检查子弹和敌机是否重合。如果有碰撞,子弹和敌机会被“销毁”。
-
控制游戏刷新:
- 使用
Sleep(100)
函数来控制游戏更新的频率,每100毫秒更新一次屏幕。
- 使用
扩展功能
- 计分系统:可以增加计分功能,玩家每摧毁一个敌机,得1分。可以在屏幕上显示当前分数。
- 敌机AI:敌机可以有更复杂的行为,例如随机左右移动,或者发射子弹反击玩家。
- 生命值:玩家可以有有限的生命值,撞上敌机或者被敌机击中时扣除生命值。
- 图形化界面:可以通过图形库(如SDL)实现更加精美的图形界面,使游戏更具互动性和可玩性。
总结
这个简单的地空对战游戏通过C语言和控制台图形实现了玩家与敌机之间的对抗。使用了键盘输入来控制玩家飞机,使用了随机生成和移动来控制敌机的行为。通过碰撞检测,玩家可以发射子弹并摧毁敌机。这是一个基础的C语言游戏开发练习,适合初学者熟悉C语言的基本操作和游戏逻辑。