用c语言写一个飞机大战小游戏
时间: 2024-01-01 17:04:12 浏览: 33
好的,以下是一个简单的飞机大战小游戏,基于C语言和SDL库实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <SDL2/SDL.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define ENEMY_COUNT 10
#define BULLET_COUNT 10
// 定义游戏对象
typedef struct {
SDL_Texture *texture;
int x;
int y;
int width;
int height;
int speed;
} GameObject;
// 初始化SDL
bool initSDL();
// 加载纹理
SDL_Texture* loadTexture(const char* path, SDL_Renderer* renderer);
// 绘制游戏对象
void renderGameObject(GameObject* gameObject, SDL_Renderer* renderer);
// 创建游戏对象
GameObject* createGameObject(const char* path, int x, int y, int width, int height, int speed, SDL_Renderer* renderer);
// 销毁游戏对象
void destroyGameObject(GameObject* gameObject);
// 移动游戏对象
void moveGameObject(GameObject* gameObject, int x, int y);
// 检测碰撞
bool checkCollision(GameObject* gameObject1, GameObject* gameObject2);
int main(int argc, char* args[]) {
if (!initSDL()) {
printf("Failed to initialize SDL\n");
return -1;
}
SDL_Window* window = SDL_CreateWindow("Plane War", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (!window) {
printf("Failed to create window\n");
return -1;
}
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (!renderer) {
printf("Failed to create renderer\n");
return -1;
}
// 创建游戏对象
GameObject* playerPlane = createGameObject("player.bmp", SCREEN_WIDTH / 2, SCREEN_HEIGHT - 50, 50, 50, 5, renderer);
GameObject* enemyPlanes[ENEMY_COUNT];
for (int i = 0; i < ENEMY_COUNT; ++i) {
enemyPlanes[i] = createGameObject("enemy.bmp", rand() % SCREEN_WIDTH, rand() % SCREEN_HEIGHT, 50, 50, 3, renderer);
}
GameObject* bullets[BULLET_COUNT];
for (int i = 0; i < BULLET_COUNT; ++i) {
bullets[i] = createGameObject("bullet.bmp", -100, -100, 10, 20, 10, renderer);
}
bool quit = false;
SDL_Event event;
int score = 0;
while (!quit) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
else if (event.type == SDL_KEYDOWN) {
switch (event.key.keysym.sym) {
case SDLK_LEFT:
moveGameObject(playerPlane, -playerPlane->speed, 0);
break;
case SDLK_RIGHT:
moveGameObject(playerPlane, playerPlane->speed, 0);
break;
case SDLK_UP:
moveGameObject(playerPlane, 0, -playerPlane->speed);
break;
case SDLK_DOWN:
moveGameObject(playerPlane, 0, playerPlane->speed);
break;
case SDLK_SPACE:
for (int i = 0; i < BULLET_COUNT; ++i) {
if (bullets[i]->y < 0) {
bullets[i]->x = playerPlane->x + playerPlane->width / 2 - bullets[i]->width / 2;
bullets[i]->y = playerPlane->y - bullets[i]->height;
break;
}
}
break;
}
}
}
// 移动子弹
for (int i = 0; i < BULLET_COUNT; ++i) {
if (bullets[i]->y < 0) {
continue;
}
bullets[i]->y -= bullets[i]->speed;
if (bullets[i]->y < 0) {
bullets[i]->x = -100;
bullets[i]->y = -100;
}
}
// 移动敌机
for (int i = 0; i < ENEMY_COUNT; ++i) {
enemyPlanes[i]->y += enemyPlanes[i]->speed;
if (enemyPlanes[i]->y > SCREEN_HEIGHT) {
enemyPlanes[i]->x = rand() % SCREEN_WIDTH;
enemyPlanes[i]->y = rand() % SCREEN_HEIGHT - 50;
}
// 检测碰撞
if (checkCollision(playerPlane, enemyPlanes[i])) {
printf("Game Over! Score: %d\n", score);
quit = true;
break;
}
for (int j = 0; j < BULLET_COUNT; ++j) {
if (bullets[j]->y < 0) {
continue;
}
if (checkCollision(enemyPlanes[i], bullets[j])) {
enemyPlanes[i]->x = rand() % SCREEN_WIDTH;
enemyPlanes[i]->y = rand() % SCREEN_HEIGHT - 50;
bullets[j]->x = -100;
bullets[j]->y = -100;
score += 10;
break;
}
}
}
// 绘制背景
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(renderer);
// 绘制游戏对象
renderGameObject(playerPlane, renderer);
for (int i = 0; i < ENEMY_COUNT; ++i) {
renderGameObject(enemyPlanes[i], renderer);
}
for (int i = 0; i < BULLET_COUNT; ++i) {
renderGameObject(bullets[i], renderer);
}
SDL_RenderPresent(renderer);
}
// 销毁游戏对象
destroyGameObject(playerPlane);
for (int i = 0; i < ENEMY_COUNT; ++i) {
destroyGameObject(enemyPlanes[i]);
}
for (int i = 0; i < BULLET_COUNT; ++i) {
destroyGameObject(bullets[i]);
}
// 退出SDL
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
bool initSDL() {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("Failed to initialize SDL: %s\n", SDL_GetError());
return false;
}
return true;
}
SDL_Texture* loadTexture(const char* path, SDL_Renderer* renderer) {
SDL_Surface* surface = SDL_LoadBMP(path);
if (!surface) {
printf("Failed to load image %s: %s\n", path, SDL_GetError());
return NULL;
}
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
if (!texture) {
printf("Failed to create texture from %s: %s\n", path, SDL_GetError());
return NULL;
}
SDL_FreeSurface(surface);
return texture;
}
void renderGameObject(GameObject* gameObject, SDL_Renderer* renderer) {
SDL_Rect rect = { gameObject->x, gameObject->y, gameObject->width, gameObject->height };
SDL_RenderCopy(renderer, gameObject->texture, NULL, &rect);
}
GameObject* createGameObject(const char* path, int x, int y, int width, int height, int speed, SDL_Renderer* renderer) {
GameObject* gameObject = (GameObject*)malloc(sizeof(GameObject));
gameObject->texture = loadTexture(path, renderer);
gameObject->x = x;
gameObject->y = y;
gameObject->width = width;
gameObject->height = height;
gameObject->speed = speed;
return gameObject;
}
void destroyGameObject(GameObject* gameObject) {
SDL_DestroyTexture(gameObject->texture);
free(gameObject);
}
void moveGameObject(GameObject* gameObject, int x, int y) {
gameObject->x += x;
gameObject->y += y;
if (gameObject->x < 0) {
gameObject->x = 0;
}
if (gameObject->x + gameObject->width > SCREEN_WIDTH) {
gameObject->x = SCREEN_WIDTH - gameObject->width;
}
if (gameObject->y < 0) {
gameObject->y = 0;
}
if (gameObject->y + gameObject->height > SCREEN_HEIGHT) {
gameObject->y = SCREEN_HEIGHT - gameObject->height;
}
}
bool checkCollision(GameObject* gameObject1, GameObject* gameObject2) {
if (gameObject1->x + gameObject1->width < gameObject2->x ||
gameObject1->x > gameObject2->x + gameObject2->width ||
gameObject1->y + gameObject1->height < gameObject2->y ||
gameObject1->y > gameObject2->y + gameObject2->height) {
return false;
}
return true;
}
```
在上述代码中,我们使用了SDL库来实现游戏的绘制和事件处理。具体来说,我们创建了三种游戏对象:玩家飞机、敌机和子弹。玩家飞机可以通过键盘控制上下左右移动,按下空格键可以发射子弹;敌机和子弹会自动移动,当敌机和子弹相撞时,敌机会被重新生成到随机位置,子弹则会消失;当玩家飞机和敌机相撞时,游戏结束。