由于坦克大战游戏比较复杂,涉及到游戏引擎、图形库等知识,因此这里只提供一个简单的控制台版坦克大战游戏代码作为参考。

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

#define MAP_WIDTH 20
#define MAP_HEIGHT 20

int map[MAP_HEIGHT][MAP_WIDTH]; // 地图数组
int player_x, player_y; // 玩家坐标
int enemy_x, enemy_y; // 敌人坐标
int bullet_x, bullet_y; // 子弹坐标
int bullet_dir; // 子弹方向

void init_game() // 初始化游戏
{
    int i, j;
    for (i = 0; i < MAP_HEIGHT; i++)
        for (j = 0; j < MAP_WIDTH; j++)
            map[i][j] = 0;
    player_x = MAP_WIDTH / 2;
    player_y = MAP_HEIGHT - 1;
    map[player_y][player_x] = 1;
    enemy_x = MAP_WIDTH / 2;
    enemy_y = 0;
    map[enemy_y][enemy_x] = 2;
    bullet_x = -1;
    bullet_y = -1;
}

void draw_map() // 绘制地图
{
    int i, j;
    system("cls"); // 清屏
    for (i = 0; i < MAP_HEIGHT; i++) {
        for (j = 0; j < MAP_WIDTH; j++) {
            if (map[i][j] == 0) printf(" ");
            if (map[i][j] == 1) printf("P");
            if (map[i][j] == 2) printf("E");
            if (map[i][j] == 3) printf("*");
        }
        printf("\n");
    }
}

void move_player(int dir) // 移动玩家
{
    int new_x = player_x, new_y = player_y;
    if (dir == 0) new_x--;
    if (dir == 1) new_x++;
    if (dir == 2) new_y--;
    if (dir == 3) new_y++;
    if (new_x < 0 || new_x >= MAP_WIDTH || new_y < 0 || new_y >= MAP_HEIGHT) return; // 边界检测
    if (map[new_y][new_x] != 0) return; // 碰撞检测
    map[player_y][player_x] = 0;
    player_x = new_x;
    player_y = new_y;
    map[player_y][player_x] = 1;
}

void move_enemy() // 移动敌人
{
    int dir = rand() % 4;
    int new_x = enemy_x, new_y = enemy_y;
    if (dir == 0) new_x--;
    if (dir == 1) new_x++;
    if (dir == 2) new_y--;
    if (dir == 3) new_y++;
    if (new_x < 0 || new_x >= MAP_WIDTH || new_y < 0 || new_y >= MAP_HEIGHT) return; // 边界检测
    if (map[new_y][new_x] != 0) return; // 碰撞检测
    map[enemy_y][enemy_x] = 0;
    enemy_x = new_x;
    enemy_y = new_y;
    map[enemy_y][enemy_x] = 2;
}

void fire_bullet() // 开火
{
    if (bullet_x != -1 || bullet_y != -1) return; // 已有子弹
    bullet_x = player_x;
    bullet_y = player_y - 1;
    bullet_dir = 2;
}

void move_bullet() // 移动子弹
{
    if (bullet_x == -1 || bullet_y == -1) return; // 没有子弹
    map[bullet_y][bullet_x] = 0;
    if (bullet_dir == 0) bullet_x--;
    if (bullet_dir == 1) bullet_x++;
    if (bullet_dir == 2) bullet_y--;
    if (bullet_dir == 3) bullet_y++;
    if (bullet_x < 0 || bullet_x >= MAP_WIDTH || bullet_y < 0 || bullet_y >= MAP_HEIGHT) { // 边界检测
        bullet_x = -1;
        bullet_y = -1;
        return;
    }
    if (map[bullet_y][bullet_x] == 2) { // 击中敌人
        map[bullet_y][bullet_x] = 0;
        enemy_x = MAP_WIDTH / 2;
        enemy_y = 0;
        map[enemy_y][enemy_x] = 2;
        bullet_x = -1;
        bullet_y = -1;
        return;
    }
    if (map[bullet_y][bullet_x] != 0) { // 击中障碍物
        map[bullet_y][bullet_x] = 3;
        bullet_x = -1;
        bullet_y = -1;
        return;
    }
    map[bullet_y][bullet_x] = 3;
}

int main()
{
    init_game();
    while (1) {
        draw_map();
        Sleep(100); // 延时,控制帧率
        if (_kbhit()) { // 检测键盘输入
            int key = _getch();
            if (key == 'a' || key == 'A') move_player(0);
            if (key == 'd' || key == 'D') move_player(1);
            if (key == 'w' || key == 'W') move_player(2);
            if (key == 's' || key == 'S') move_player(3);
            if (key == ' ') fire_bullet();
        }
        move_enemy();
        move_bullet();
    }
    return 0;
}

这个代码实现了基本的玩家移动、敌人移动、开火、子弹飞行、碰撞检测等功能,但是缺少了很多细节和优化,比如敌人可以穿过障碍物、子弹可以穿过敌人等问题。如果要实现更完整的坦克大战游戏,需要更复杂的代码和更多的知识。


原文地址: https://www.cveoy.top/t/topic/JtQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录