用C语言实现飞机大战小游戏代码
时间: 2024-01-30 17:02:12 浏览: 20
以下是一个简单的飞机大战游戏的C语言代码,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
// 定义游戏界面大小
#define WIDTH 50
#define HEIGHT 30
// 定义飞机形状
#define PLANE_WIDTH 5
#define PLANE_HEIGHT 3
char plane[PLANE_HEIGHT][PLANE_WIDTH] = {
{' ', '*', ' ', '*', ' '},
{'*', '*', '*', '*', '*'},
{'*', ' ', ' ', ' ', '*'}
};
// 定义子弹形状
#define BULLET_WIDTH 1
#define BULLET_HEIGHT 1
char bullet[BULLET_HEIGHT][BULLET_WIDTH] = {
{'|'}
};
// 定义敌机形状
#define ENEMY_WIDTH 7
#define ENEMY_HEIGHT 3
char enemy[ENEMY_HEIGHT][ENEMY_WIDTH] = {
{' ', ' ', '*', '*', '*', ' ', ' '},
{' ', '*', '*', '*', '*', '*', ' '},
{'*', ' ', '*', '*', '*', ' ', '*'}
};
// 定义游戏对象结构体
typedef struct object {
int x;
int y;
int width;
int height;
char** shape;
} Object;
// 定义游戏对象数组
Object bullets[100];
Object enemies[10];
// 定义游戏状态
int score = 0;
int isGameOver = 0;
// 隐藏光标函数
void hideCursor() {
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
// 清空屏幕函数
void clearScreen() {
system("cls");
}
// 绘制游戏界面函数
void drawGameBoard() {
int i, j;
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
if (i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) {
printf("#");
} else {
printf(" ");
}
}
printf("\n");
}
}
// 绘制游戏对象函数
void drawObject(Object* obj) {
int i, j;
for (i = 0; i < obj->height; i++) {
for (j = 0; j < obj->width; j++) {
if (obj->shape[i][j] != ' ') {
printf("\033[%d;%dH%c", obj->y + i, obj->x + j, obj->shape[i][j]);
}
}
}
}
// 初始化游戏对象函数
void initObject(Object* obj, int x, int y, int width, int height, char shape[height][width]) {
obj->x = x;
obj->y = y;
obj->width = width;
obj->height = height;
obj->shape = (char**)malloc(obj->height * sizeof(char*));
int i;
for (i = 0; i < obj->height; i++) {
obj->shape[i] = (char*)malloc(obj->width * sizeof(char));
int j;
for (j = 0; j < obj->width; j++) {
obj->shape[i][j] = shape[i][j];
}
}
}
// 销毁游戏对象函数
void destroyObject(Object* obj) {
int i;
for (i = 0; i < obj->height; i++) {
free(obj->shape[i]);
}
free(obj->shape);
}
// 移动游戏对象函数
void moveObject(Object* obj, int x, int y) {
obj->x += x;
obj->y += y;
}
// 发射子弹函数
void fireBullet(Object* plane) {
static int bulletCount = 0;
if (bulletCount >= 100) {
return;
}
bullets[bulletCount].x = plane->x + PLANE_WIDTH / 2;
bullets[bulletCount].y = plane->y - 1;
bullets[bulletCount].width = BULLET_WIDTH;
bullets[bulletCount].height = BULLET_HEIGHT;
bullets[bulletCount].shape = bullet;
bulletCount++;
}
// 生成敌机函数
void generateEnemy() {
static int enemyCount = 0;
if (enemyCount >= 10) {
return;
}
enemies[enemyCount].x = rand() % (WIDTH - ENEMY_WIDTH - 2) + 2;
enemies[enemyCount].y = 1;
enemies[enemyCount].width = ENEMY_WIDTH;
enemies[enemyCount].height = ENEMY_HEIGHT;
enemies[enemyCount].shape = enemy;
enemyCount++;
}
// 判断游戏对象是否碰撞函数
int isCollided(Object* obj1, Object* obj2) {
int i, j;
for (i = 0; i < obj1->height; i++) {
for (j = 0; j < obj1->width; j++) {
if (obj1->shape[i][j] != ' ') {
int x = obj1->x + j;
int y = obj1->y + i;
int m, n;
for (m = 0; m < obj2->height; m++) {
for (n = 0; n < obj2->width; n++) {
if (obj2->shape[m][n] != ' ') {
if (x == obj2->x + n && y == obj2->y + m) {
return 1;
}
}
}
}
}
}
}
return 0;
}
// 处理游戏逻辑函数
void handleGameLogic() {
int i, j;
// 移动子弹
for (i = 0; i < 100; i++) {
if (bullets[i].shape != NULL) {
moveObject(&bullets[i], 0, -1);
if (bullets[i].y < 1) {
destroyObject(&bullets[i]);
}
}
}
// 移动敌机
for (i = 0; i < 10; i++) {
if (enemies[i].shape != NULL) {
moveObject(&enemies[i], 0, 1);
if (enemies[i].y > HEIGHT - ENEMY_HEIGHT - 2) {
destroyObject(&enemies[i]);
}
}
}
// 判断子弹是否击中敌机
for (i = 0; i < 100; i++) {
if (bullets[i].shape != NULL) {
for (j = 0; j < 10; j++) {
if (enemies[j].shape != NULL) {
if (isCollided(&bullets[i], &enemies[j])) {
score++;
destroyObject(&bullets[i]);
destroyObject(&enemies[j]);
}
}
}
}
}
// 判断敌机是否撞上飞机
for (i = 0; i < 10; i++) {
if (enemies[i].shape != NULL) {
if (isCollided(&enemies[i], &enemies[i])) {
isGameOver = 1;
}
}
}
// 生成敌机
int randNum = rand() % 100;
if (randNum < 10) {
generateEnemy();
}
}
// 绘制游戏分数函数
void drawScore() {
printf("\033[%d;%dHScore: %d", HEIGHT + 1, 2, score);
}
// 绘制游戏结束画面函数
void drawGameOver() {
clearScreen();
printf("\033[%d;%dH", HEIGHT / 2, WIDTH / 2 - 5);
printf("Game Over!");
printf("\033[%d;%dH", HEIGHT / 2 + 1, WIDTH / 2 - 10);
printf("Your Score: %d", score);
}
// 主函数
int main() {
// 初始化随机数种子
srand(time(NULL));
// 隐藏光标
hideCursor();
// 清空屏幕
clearScreen();
// 绘制游戏界面
drawGameBoard();
// 初始化飞机
Object planeObj;
initObject(&planeObj, WIDTH / 2 - PLANE_WIDTH / 2, HEIGHT - PLANE_HEIGHT - 2, PLANE_WIDTH, PLANE_HEIGHT, plane);
// 游戏循环
while (!isGameOver) {
// 处理用户输入
if (_kbhit()) {
char key = _getch();
switch (key) {
case 'a':
moveObject(&planeObj, -1, 0);
break;
case 'd':
moveObject(&planeObj, 1, 0);
break;
case ' ':
fireBullet(&planeObj);
break;
}
}
// 处理游戏逻辑
handleGameLogic();
// 清空屏幕
clearScreen();
// 绘制游戏界面
drawGameBoard();
// 绘制飞机
drawObject(&planeObj);
// 绘制子弹
for (int i = 0; i < 100; i++) {
if (bullets[i].shape != NULL) {
drawObject(&bullets[i]);
}
}
// 绘制敌机
for (int i = 0; i < 10; i++) {
if (enemies[i].shape != NULL) {
drawObject(&enemies[i]);
}
}
// 绘制游戏分数
drawScore();
// 延时
Sleep(50);
}
// 绘制游戏结束画面
drawGameOver();
// 销毁飞机
destroyObject(&planeObj);
// 销毁子弹
for (int i = 0; i < 100; i++) {
if (bullets[i].shape != NULL) {
destroyObject(&bullets[i]);
}
}
// 销毁敌机
for (int i = 0; i < 10; i++) {
if (enemies[i].shape != NULL) {
destroyObject(&enemies[i]);
}
}
return 0;
}
```
这个代码实现的游戏比较简单,可能有些功能不太完善,但是可以作为学习C语言游戏开发的基础。