您现在的位置是:首页 >技术交流 >C++生化危机3.0.1.cs.1(vs控制室编译)网站首页技术交流
C++生化危机3.0.1.cs.1(vs控制室编译)
简介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] != '