最近做了个很FW的游戏
2025-05-18 16:47:56
发布于:浙江
#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <vector>
const int MAP_SIZE = 50;
char map[MAP_SIZE][MAP_SIZE];
int x = MAP_SIZE / 2;
int y = MAP_SIZE / 2;
// 手动定义 FOREGROUND_WHITE
const WORD FOREGROUND_WHITE = 0x0007;
std::vector<std::pair<int, int> > obstacles;
// 存储 * 的位置和移动方向 (x 偏移, y 偏移)
std::vector<std::pair<std::pair<int, int>, std::pair<int, int> > > projectiles;
// 存储爆炸产生的 * 及其剩余帧数
std::vector<std::pair<std::pair<int, int>, int> > explosionStars;
// 存储 & 的位置
std::pair<int, int> specialObstacle;
// 存储 & 发射的子弹 (这里用 `(` 表示)
std::vector<std::pair<int, int> > specialProjectiles;
int BULLET_COOLDOWN = 3; // 子弹冷却时间,单位为帧
int lastBulletShotFrame = -BULLET_COOLDOWN; // 上次发射子弹的帧,初始化为 - 冷却时间确保一开始就能发射
int frameCount = 0;
const int percentFrames = 10; // % 持续的帧数
// 新增:记录 % 的状态
bool isPercentGenerated = false;
int percentX, percentY;
int percentFramesLeft = 0;
// 难度等级对应的参数
int obstacleMoveInterval = 3; // # 每几帧移动一次,可按需调整
int obstacleSpawnInterval = 20; // 每几帧刷新一个 #
int specialProjectileFireInterval = 5; // & 发射子弹的间隔帧数,默认值,根据难度调整
// 初始化地图
void initMap() {
for (int i = 0; i < MAP_SIZE; ++i) {
for (int j = 0; j < MAP_SIZE; ++j) {
map[i][j] = '.';
}
}
map[y][x] = '@';
srand(static_cast<unsigned int>(time(NULL)));
// 初始化 & 的位置
specialObstacle = std::make_pair(rand() % MAP_SIZE, MAP_SIZE - 1);
map[specialObstacle.first][specialObstacle.second] = '&';
}
// 随机刷新 #
void spawnObstacle() {
int newX, newY;
do {
newX = rand() % MAP_SIZE;
newY = rand() % MAP_SIZE;
} while (std::abs(newX - x) <= 5 && std::abs(newY - y) <= 5);
if (map[newY][newX] != '%') {
map[newY][newX] = '#';
obstacles.push_back(std::make_pair(newY, newX));
}
}
// 让 # 靠近 @
void moveObstacles() {
static int obstacleMoveCounter = 0;
obstacleMoveCounter++;
if (obstacleMoveCounter < obstacleMoveInterval) {
return;
}
obstacleMoveCounter = 0;
for (size_t i = 0; i < obstacles.size(); ++i) {
int obsY = obstacles[i].first;
int obsX = obstacles[i].second;
int newObsY = obsY;
int newObsX = obsX;
if (obsX > x) newObsX--;
else if (obsX < x) newObsX++;
if (obsY > y) newObsY--;
else if (obsY < y) newObsY++;
if (newObsX == x && newObsY == y) {
for (int ab = 1; ab <= 50; ab++) {
std::cout << std::endl;
}
std::cout << "———————————————————————游戏结束———————————————————————" << std::endl;
Sleep(1000);
exit(0);
}
if (map[newObsY][newObsX] != '%') {
map[obsY][obsX] = '.';
map[newObsY][newObsX] = '#';
obstacles[i] = std::make_pair(newObsY, newObsX);
}
}
}
// 移动 *
void moveProjectiles() {
for (size_t i = 0; i < projectiles.size(); ++i) {
int projY = projectiles[i].first.first;
int projX = projectiles[i].first.second;
int dirY = projectiles[i].second.first;
int dirX = projectiles[i].second.second;
map[projY][projX] = '.';
// 检查是否碰到 #
for (size_t j = 0; j < obstacles.size(); ++j) {
int obsY = obstacles[j].first;
int obsX = obstacles[j].second;
if (projY == obsY && projX == obsX) {
// 删除 #
map[obsY][obsX] = '.';
obstacles.erase(obstacles.begin() + j);
// 删除 *
projectiles.erase(projectiles.begin() + i);
--i;
break;
}
}
if (i < projectiles.size()) {
projY = projectiles[i].first.first;
projX = projectiles[i].first.second;
dirY = projectiles[i].second.first;
dirX = projectiles[i].second.second;
int newY = projY + dirY;
int newX = projX + dirX;
// 检查是否到达边缘
if (newY >= 0 && newY < MAP_SIZE && newX >= 0 && newX < MAP_SIZE) {
map[newY][newX] = '*';
projectiles[i].first = std::make_pair(newY, newX);
} else {
projectiles.erase(projectiles.begin() + i);
--i;
}
}
}
}
// 移动 & 发射的子弹
void moveSpecialProjectiles() {
for (size_t i = 0; i < specialProjectiles.size(); ++i) {
int projY = specialProjectiles[i].first;
int projX = specialProjectiles[i].second;
map[projY][projX] = '.';
int newX = projX - 1;
if (newX >= 0) {
if (newX == x && projY == y) {
for (int ab = 1; ab <= 50; ab++) {
std::cout << std::endl;
}
std::cout << "———————————————————————游戏结束———————————————————————" << std::endl;
Sleep(1000);
exit(0);
}
map[projY][newX] = '(';
specialProjectiles[i] = std::make_pair(projY, newX);
} else {
specialProjectiles.erase(specialProjectiles.begin() + i);
--i;
}
}
}
// 处理爆炸产生的 *
void handleExplosionStars() {
for (size_t i = 0; i < explosionStars.size(); ++i) {
int starY = explosionStars[i].first.first;
int starX = explosionStars[i].first.second;
explosionStars[i].second--;
if (explosionStars[i].second <= 0) {
map[starY][starX] = '.';
explosionStars.erase(explosionStars.begin() + i);
--i;
}
}
}
// 绘制地图(优化显示使其更接近正方形)
void drawMap() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD bufferSize = {MAP_SIZE * 2, MAP_SIZE}; // 宽度乘以 2 来调整宽高比
COORD characterPos = {0, 0};
SMALL_RECT writeRegion = {0, 0, static_cast<SHORT>(MAP_SIZE * 2 - 1), static_cast<SHORT>(MAP_SIZE - 1)};
CHAR_INFO consoleBuffer[MAP_SIZE][MAP_SIZE * 2];
for (int i = 0; i < MAP_SIZE; ++i) {
for (int j = 0; j < MAP_SIZE; ++j) {
consoleBuffer[i][j * 2].Char.AsciiChar = map[i][j];
consoleBuffer[i][j * 2].Attributes = FOREGROUND_WHITE;
if (j < MAP_SIZE - 1) {
consoleBuffer[i][j * 2 + 1].Char.AsciiChar = ' '; // 插入空格来调整间距
consoleBuffer[i][j * 2 + 1].Attributes = FOREGROUND_WHITE;
}
}
}
WriteConsoleOutput(hConsole, (CHAR_INFO*)consoleBuffer, bufferSize, characterPos, &writeRegion);
}
// 新增:处理 % 的计时和爆炸
void handlePercent() {
if (isPercentGenerated) {
percentFramesLeft--;
if (percentFramesLeft <= 0) {
// 生成 5×5 的 * 矩阵
for (int i = -2; i <= 2; ++i) {
for (int j = -2; j <= 2; ++j) {
int newY = percentY + i;
int newX = percentX + j;
if (newY >= 0 && newY < MAP_SIZE && newX >= 0 && newX < MAP_SIZE) {
map[newY][newX] = '*';
explosionStars.push_back(std::make_pair(std::make_pair(newY, newX), 5)); // 设定存在 5 帧
// 检查是否碰到 #
for (size_t k = 0; k < obstacles.size(); ++k) {
int obsY = obstacles[k].first;
int obsX = obstacles[k].second;
if (newY == obsY && newX == obsX) {
// 删除 #
map[obsY][obsX] = '.';
obstacles.erase(obstacles.begin() + k);
--k;
}
}
}
}
}
isPercentGenerated = false;
}
}
}
// 处理按键输入
void handleInput() {
int newX = x;
int newY = y;
if (GetAsyncKeyState('A') & 0x8000) {
newX--;
}
if (GetAsyncKeyState('S') & 0x8000) {
newY++;
}
if (GetAsyncKeyState('D') & 0x8000) {
newX++;
}
if (GetAsyncKeyState('W') & 0x8000) {
newY--;
}
if (newX >= 0 && newX < MAP_SIZE && newY >= 0 && newY < MAP_SIZE && map[newY][newX] != '%') {
map[y][x] = '.';
x = newX;
y = newY;
map[y][x] = '@';
}
if (GetAsyncKeyState('J') & 0x8000) {
if (frameCount - lastBulletShotFrame >= BULLET_COOLDOWN) {
if (y > 0) {
map[y - 1][x] = '*';
projectiles.push_back(std::make_pair(std::make_pair(y - 1, x), std::make_pair(-1, 0)));
}
if (y < MAP_SIZE - 1) {
map[y + 1][x] = '*';
projectiles.push_back(std::make_pair(std::make_pair(y + 1, x), std::make_pair(1, 0)));
}
if (x > 0) {
map[y][x - 1] = '*';
projectiles.push_back(std::make_pair(std::make_pair(y, x - 1), std::make_pair(0, -1)));
}
if (x < MAP_SIZE - 1) {
map[y][x + 1] = '*';
projectiles.push_back(std::make_pair(std::make_pair(y, x + 1), std::make_pair(0, 1)));
}
lastBulletShotFrame = frameCount;
}
}
if (GetAsyncKeyState('K') & 0x8000) {
if (!isPercentGenerated) {
isPercentGenerated = true;
int direction = rand() % 4; // 0: 上, 1: 下, 2: 左, 3: 右
switch (direction) {
case 0:
if (y > 0) {
percentX = x;
percentY = y - 1;
} else {
isPercentGenerated = false;
}
break;
case 1:
if (y < MAP_SIZE - 1) {
percentX = x;
percentY = y + 1;
} else {
isPercentGenerated = false;
}
break;
case 2:
if (x > 0) {
percentX = x - 1;
percentY = y;
} else {
isPercentGenerated = false;
}
break;
case 3:
if (x < MAP_SIZE - 1) {
percentX = x + 1;
percentY = y;
} else {
isPercentGenerated = false;
}
break;
}
if (isPercentGenerated) {
percentFramesLeft = percentFrames;
map[percentY][percentX] = '%';
}
}
}
}
// & 发射子弹
void shootSpecialProjectile() {
static int fireCounter = 0;
fireCounter++;
if (fireCounter < specialProjectileFireInterval) {
return;
}
fireCounter = 0;
specialProjectiles.push_back(std::make_pair(specialObstacle.first, specialObstacle.second));
map[specialObstacle.first][specialObstacle.second] = '(';
}
int main() {
std::cout << "————————————" << std::endl;
std::cout << "—— 欢迎来到FW游戏 ——" << std::endl;
std::cout << "————————————" << std::endl;
std::cout << "请选择难度等级 "<< std::endl;
std::cout << "1-简单 "<< std::endl;
std::cout << "2-中等 "<< std::endl;
std::cout << "3-困难 "<< std::endl;
std::cout << "4-惨烈(千万别选,难的要S) "<< std::endl;
std::cout << "10086-更多的小游戏1 "<< std::endl;
std::cout << "54188-更多的小游戏2 "<< std::endl;
int difficulty;
while (true) {
std::cin >> difficulty;
if (difficulty == 1) {
obstacleMoveInterval = 3;
obstacleSpawnInterval = 20;
BULLET_COOLDOWN = 2;
specialProjectileFireInterval = 10;
break;
} else if (difficulty == 2) {
obstacleMoveInterval = 2;
obstacleSpawnInterval = 15;
BULLET_COOLDOWN = 3;
specialProjectileFireInterval = 7;
break;
} else if (difficulty == 3) {
obstacleMoveInterval = 2;
obstacleSpawnInterval = 10;
BULLET_COOLDOWN = 3;
specialProjectileFireInterval = 4;
break;
} else if (difficulty == 4) {
obstacleMoveInterval = 2;
obstacleSpawnInterval = 5;
BULLET_COOLDOWN = 3;
specialProjectileFireInterval = 2;
break;
} else if (difficulty == 10086) {
system("start https://crazygames.com/");return 0;
} else if (difficulty == 54188) {
system("start https://www.4399.com/");return 0;
} else {
std::cout << "输入错误,请重输: ";
}
}
std::cout << "请立马把输入法改为英文模式,并开启全屏" ;
int input;
std::cout << "\n请输入 1 开始游戏: "<< std::endl;
while (true) {
std::cin >> input;
if (input == 1) {
break;
} else {
std::cout << "输入错误,请输入 1 开始游戏: ";
}
}
initMap();
while (true) {
drawMap();
handleInput();
if (frameCount % obstacleSpawnInterval == 0) { // 每 obstacleSpawnInterval 帧刷新一个 #
spawnObstacle();
}
moveObstacles();
moveProjectiles();
moveSpecialProjectiles();
// & 跟随玩家的 y 坐标
map[specialObstacle.first][specialObstacle.second] = '.';
specialObstacle = std::make_pair(y, MAP_SIZE - 1);
map[specialObstacle.first][specialObstacle.second] = '&';
// & 发射子弹
shootSpecialProjectile();
handlePercent();
handleExplosionStars();
frameCount++;
Sleep(100);
}
return 0;
}
全部评论 4
d
2025-05-27 来自 浙江
0WORD CHAR_INFO 是啥啊
2025-05-18 来自 北京
0我相信大家不用新手教程都会玩(看
void handleInput()
子函数)2025-05-18 来自 浙江
0dddddddddd
2025-05-18 来自 浙江
0
有帮助,赞一个