本游戏又作者花了很长时间制作,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] != '\0'; 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.youkuaiyun.com/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;
}