您现在的位置是:首页 >技术交流 >C++生化危机3.0.1.cs.1(vs控制室编译)网站首页技术交流

C++生化危机3.0.1.cs.1(vs控制室编译)

喵星人工作室 2025-03-06 12:01:02
简介C++生化危机3.0.1.cs.1(vs控制室编译)

本游戏又作者花了很长时间制作,100%原创

舍弃了以往文字游戏风格,因处于测试阶段,暂时没有其他玩法

wasd键移动,方向键发射子弹,f键互动,

由于测试阶段还没有成功界面,也暂时没办法通关游戏和过剧情

预计2月9日进行第二次测试,会发布第二代测试版本,请大家积极关注制作者的主页

在游戏中可打开作者主页

如果想在其他C++软件编译,就把代码第一行删除

下载链接:文件     密码:gnxb

以下是游戏代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>  // 包含 _kbhit() 和 _getch() 函数
#include <windows.h>  // 包含 Sleep() 和 system("cls")
#include <cstdlib>
#include <ctime>
#include <shellapi.h>  // 用于打开网址

// 设置控制台为 UTF - 8 编码
void setConsoleToUTF8() {
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);
    std::ios::sync_with_stdio(false);
    std::wcout.imbue(std::locale(""));
    std::cout.imbue(std::locale(""));
}

// 地图的大小
const int MAP_WIDTH = 40;
const int MAP_HEIGHT = 20;
const int INFO_AREA_WIDTH = 20;

// 地图
char map[MAP_HEIGHT][MAP_WIDTH + INFO_AREA_WIDTH];

// 玩家初始位置
int playerX = MAP_WIDTH / 2;
int playerY = MAP_HEIGHT / 2;

// 3 个小怪物的位置
int enemyX[3];
int enemyY[3];
// 小怪物被击中次数
int enemyHitCount[3] = { 0 };

// 子弹和食物数量
int bullets = 5;
int foods = 5;

// 饥饿度,上限为 20
int hunger = 20;

// 血量,上限为 20
int hp = 20;

// 记录上次饥饿度减少的时间
DWORD lastHungerReductionTime = GetTickCount();
// 5 分钟对应的毫秒数,5 * 60 * 1000
const DWORD HUNGER_REDUCTION_INTERVAL = 5 * 60 * 1000;

// 初始化地图
void initMap() {
    for (int y = 0; y < MAP_HEIGHT; y++) {
        for (int x = 0; x < MAP_WIDTH + INFO_AREA_WIDTH; x++) {
            if (y == 0 || y == MAP_HEIGHT - 1 || x == 0 || x == MAP_WIDTH - 1) {
                map[y][x] = '#';  // 边界
            }
            else if (x >= MAP_WIDTH) {
                map[y][x] = ' ';  // 信息显示区域
            }
            else {
                map[y][x] = ' ';  // 空白区域
            }
        }
    }
    map[playerY][playerX] = 'i';  // 初始化玩家的位置

    // 初始化 3 个小怪物的位置
    srand(static_cast<unsigned int>(time(0)));
    for (int i = 0; i < 3; i++) {
        bool valid;
        do {
            valid = true;
            enemyX[i] = rand() % (MAP_WIDTH - 2) + 1;
            enemyY[i] = rand() % (MAP_HEIGHT - 2) + 1;
            // 检查是否和玩家或其他小怪物的位置重叠
            if (enemyX[i] == playerX && enemyY[i] == playerY) {
                valid = false;
            }
            for (int j = 0; j < i; j++) {
                if (enemyX[i] == enemyX[j] && enemyY[i] == enemyY[j]) {
                    valid = false;
                }
            }
        } while (!valid);
        map[enemyY[i]][enemyX[i]] = '&';
    }
}

// 更新信息显示区域
void updateInfo() {
    int infoX = MAP_WIDTH + 2;
    for (int y = 2; y < 10; y += 2) {
        for (int x = infoX; x < infoX + INFO_AREA_WIDTH - 2; x++) {
            map[y][x] = ' ';
        }
    }

    // 显示子弹数量
    int y = 2;
    sprintf(&map[y][infoX], "子弹: %d", bullets);

    // 显示食物数量
    y += 2;
    sprintf(&map[y][infoX], "食物: %d", foods);

    // 显示饥饿度
    y += 2;
    sprintf(&map[y][infoX], "饥饿度: %d", hunger);

    // 显示血量
    y += 2;
    sprintf(&map[y][infoX], "血量: %d", hp);

    // 显示饥饿度补充提示
    if (hunger < 20 && foods > 0) {
        y += 2;
        sprintf(&map[y][infoX], "按 f 补充饥饿度");
    }
}

// 显示地图
void displayMap() {
    system("cls");  // 清屏
    updateInfo();
    for (int y = 0; y < MAP_HEIGHT; y++) {
        for (int x = 0; x < MAP_WIDTH + INFO_AREA_WIDTH; x++) {
            std::cout << map[y][x];
        }
        std::cout << std::endl;
    }
}

// 判断两个位置是否相邻
bool isAdjacent(int x1, int y1, int x2, int y2) {
    return (abs(x1 - x2) <= 1 && abs(y1 - y2) <= 1) && !(x1 == x2 && y1 == y2);
}

// 发射子弹
void shootBullet(int dx, int dy) {
    if (bullets > 0) {
        bullets--;
        int bulletX = playerX + dx;
        int bulletY = playerY + dy;
        while (bulletX > 0 && bulletX < MAP_WIDTH - 1 && bulletY > 0 && bulletY < MAP_HEIGHT - 1) {
            for (int i = 0; i < 3; i++) {
                if (enemyX[i] != -1 && bulletX == enemyX[i] && bulletY == enemyY[i]) {
                    enemyHitCount[i]++;
                    if (enemyHitCount[i] >= 2) {
                        map[enemyY[i]][enemyX[i]] = ' ';
                        enemyX[i] = -1;
                        enemyY[i] = -1;
                    }
                    return;
                }
            }
            bulletX += dx;
            bulletY += dy;
        }
    }
}

// 处理玩家移动和操作
void handleMovement(char input) {
    map[playerY][playerX] = ' ';  // 清空当前位置

    int newX = playerX;
    int newY = playerY;

    switch (input) {
    case 'w':
        if (playerY > 1) newY--;
        break;
    case 's':
        if (playerY < MAP_HEIGHT - 2) newY++;
        break;
    case 'a':
        if (playerX > 1) newX--;
        break;
    case 'd':
        if (playerX < MAP_WIDTH - 2) newX++;
        break;
    case 72: // 上箭头
        shootBullet(0, -1);
        break;
    case 75: // 左箭头
        shootBullet(-1, 0);
        break;
    case 77: // 右箭头
        shootBullet(1, 0);
        break;
    case 80: // 下箭头
        shootBullet(0, 1);
        break;
    case 'e': // 吃食物
        if (foods > 0) {
            foods--;
            hunger = hunger + 4;
            if (hunger > 20) {
                hunger = 20;
            }
        }
        break;
    case 'f': // 按 f 补充饥饿度
        if (foods > 0) {
            foods--;
            hunger = hunger + 2;
            if (hunger > 20) {
                hunger = 20;
            }
        }
        break;
    }

    // 检查新位置是否和小怪物重叠
    bool valid = true;
    for (int i = 0; i < 3; i++) {
        if (enemyX[i] != -1 && newX == enemyX[i] && newY == enemyY[i]) {
            valid = false;
        }
    }

    if (valid) {
        playerX = newX;
        playerY = newY;
    }

    // 检查是否和小怪物相邻
    for (int i = 0; i < 3; i++) {
        if (enemyX[i] != -1 && isAdjacent(playerX, playerY, enemyX[i], enemyY[i])) {
            hp = hp - 2;
            if (hp < 0) {
                hp = 0;
            }
        }
    }

    map[playerY][playerX] = 'i';  // 更新位置
}

// 移动小怪物
void moveEnemies() {
    for (int i = 0; i < 3; i++) {
        if (enemyX[i] == -1) continue;

        map[enemyY[i]][enemyX[i]] = ' ';  // 清空当前位置

        int newX = enemyX[i];
        int newY = enemyY[i];

        // 如果小怪物和玩家相邻,随机移动小怪物
        if (isAdjacent(playerX, playerY, enemyX[i], enemyY[i])) {
            bool validMove = false;
            int attempts = 0;
            while (!validMove && attempts < 4) {  // 最多尝试 4 次
                int dx = rand() % 3 - 1;  // -1, 0, 1
                int dy = rand() % 3 - 1;  // -1, 0, 1
                newX = enemyX[i] + dx;
                newY = enemyY[i] + dy;

                // 检查新位置是否在地图内且不和玩家或其他小怪物的位置重叠
                if (newX >= 1 && newX < MAP_WIDTH - 1 && newY >= 1 && newY < MAP_HEIGHT - 1 &&
                    !(newX == playerX && newY == playerY)) {
                    bool overlap = false;
                    for (int j = 0; j < 3; j++) {
                        if (i != j && enemyX[j] != -1 && newX == enemyX[j] && newY == enemyY[j]) {
                            overlap = true;
                            break;
                        }
                    }
                    if (!overlap) {
                        validMove = true;
                    }
                }
                attempts++;
            }
        }
        else {
            // 朝玩家的方向移动小怪物
            if (enemyX[i] < playerX && enemyX[i] < MAP_WIDTH - 2) {
                newX++;
            }
            else if (enemyX[i] > playerX && enemyX[i] > 1) {
                newX--;
            }
            else if (enemyY[i] < playerY && enemyY[i] < MAP_HEIGHT - 2) {
                newY++;
            }
            else if (enemyY[i] > playerY && enemyY[i] > 1) {
                newY--;
            }

            // 检查新位置是否和其他小怪物或玩家的位置重叠
            bool valid = true;
            if (newX == playerX && newY == playerY) {
                valid = false;
            }
            for (int j = 0; j < 3; j++) {
                if (i != j && enemyX[j] != -1 && newX == enemyX[j] && newY == enemyY[j]) {
                    valid = false;
                }
            }
            if (!valid) {
                newX = enemyX[i];
                newY = enemyY[i];
            }
        }

        enemyX[i] = newX;
        enemyY[i] = newY;

        // 检查是否和玩家相邻
        if (isAdjacent(playerX, playerY, enemyX[i], enemyY[i])) {
            hp = hp - 2;
            if (hp < 0) {
                hp = 0;
            }
        }

        map[enemyY[i]][enemyX[i]] = '&';  // 更新位置
    }
}

// 减少饥饿度
void reduceHunger() {
    DWORD currentTime = GetTickCount();
    if (currentTime - lastHungerReductionTime >= HUNGER_REDUCTION_INTERVAL) {
        hunger = hunger - 2;
        if (hunger < 0) {
            hunger = 0;
        }
        lastHungerReductionTime = currentTime;
        if (hunger == 0) {
            hp = 0; // 饥饿度归零时,血量归零
        }
    }
}

// 显示游戏结束信息
void showGameOver() {
    system("cls");  // 清屏
    const char* gameOverText = "game over";
    for (int i = 0; gameOverText[i] != ''; i++) {
        std::cout << gameOverText[i];
        std::cout.flush();  // 立即输出字符
        Sleep(200);  // 延迟 200 毫秒
    }
    Sleep(5000);  // 等待 5 秒
}

// 显示开始界面
void showStartMenu() {
    system("cls");
    std::cout << "生化危机3.0.1.cs.1" << std::endl;
    std::cout << "1.开始游戏" << std::endl;
    std::cout << "2.查看成就" << std::endl;
    std::cout << "3.查看官网" << std::endl;
    std::cout << "4.相关信息" << std::endl;
    std::cout << "5.退出游戏" << std::endl;
}

// 显示成就界面
void showAchievementMenu() {
    system("cls");
    std::cout << "x.返回" << std::endl;
    std::cout << "这里是成就界面" << std::endl;
}

// 显示相关信息界面
void showRelatedInfo() {
    system("cls");
    std::cout << "作者:山岚" << std::endl;
    std::cout << "编码:喵星人工作室" << std::endl;
    std::cout << "x.返回" << std::endl;
}

// 打开网站
void openWebsite() {
    const char* url = "https://blog.csdn.net/zhaozirui8290?spm=1000.2115.3001.5343";
    HINSTANCE result = ShellExecuteA(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL);
    if ((INT_PTR)result <= 32) {
        std::cout << "打开网站失败!错误代码: " << (INT_PTR)result << std::endl;
        Sleep(2000);  // 等待 2 秒
    }
}

int main() {
    setConsoleToUTF8();
    srand(static_cast<unsigned int>(time(0)));

    char input;
    while (true) {
        showStartMenu();
        input = _getch();  // 获取输入

        if (input == '1') {
            // 开始游戏
            bullets = 5;
            foods = 5;
            hunger = 20;
            hp = 20;
            lastHungerReductionTime = GetTickCount();
            initMap();
            displayMap();
            while (true) {
                if (_kbhit()) {  // 检查是否有按键输入
                    input = _getch();  // 获取输入
                    if (input == 'w' || input == 'a' || input == 's' || input == 'd' ||
                        input == 72 || input == 75 || input == 77 || input == 80 || input == 'e' || input == 'f') {
                        handleMovement(input);
                        moveEnemies();
                        reduceHunger();
                        displayMap();
                    }
                    else if (input == 27) {  // 按 ESC 退出
                        break;
                    }
                }
                if (hp == 0) {
                    showGameOver();
                    break;
                }
                Sleep(100);  // 暂停一下,减少 CPU 占用
            }
        }
        else if (input == '2') {
            // 查看成就
            showAchievementMenu();
            while (true) {
                input = _getch();  // 获取输入
                if (input == 'x') {
                    break;  // 返回开始界面
                }
            }
        }
        else if (input == '3') {
            // 查看官网
            openWebsite();
        }
        else if (input == '4') {
            showRelatedInfo();
            while (true) {
                input = _getch();  // 获取输入
                if (input == 'x') {
                    break;  // 返回开始界面
                }
            }
        }
        else if (input == '5') {
            // 退出游戏
            break;
        }
    }

    return 0;
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。