- 梗传奇 - ver 1.0(半夜更)
2025-08-27 23:45:03
发布于:上海
本游戏为方块传奇后的新游戏
1.0版本
鸣谢:python间谍
半夜爆改代码,看在这份上,求赞
改了名字输入的问题
发现是缓冲区的bug
#include <iostream>//是的,我就是这么无聊,真正意义上的万能头
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <limits>
#include <iomanip>
#include <sstream>
#include <windows.h>
#include <cstddef>
#include <conio.h>
using namespace std;
// 按键与常量宏定义(保持不变)
#define KEY_DOWN(VK_KEY) (GetAsyncKeyState(VK_KEY) & 0x8000)
#define KEY_ENTER VK_RETURN
#define KEY_ESC VK_ESCAPE
#define MAX_PROP 4
#define SAVE_FILE "梗传奇_存档.data"
// 全局变量(保持不变)
string player_name = "匿名玩家";
int player_health = 15;
int player_max_health = 15;
int player_mana = 8;
int player_max_mana = 8;
short props[MAX_PROP] = {0, 0, 0, 0};
string scene = "梗广场";
int chapter = 1;
int plot_step = 1;
double text_speed = 0.08;
bool is_new_game = false;
// 角色结构体(保持不变)
struct Character {
string name;
string type;
int health;
int attack;
string dialog;
};
// 初始化关键角色(保持不变)
Character npc[5] = {
{"梗小鬼", "NPC", 0, 0, "你也是来玩梗的吗?最近「烂梗魔王」把好多梗都污染了!"},
{"梗大师", "NPC", 0, 0, "玩梗要讲究时机,不然就成尬聊了...给你本《玩梗手册》,关键时刻能救命!"},
{"烂梗史莱姆", "敌人", 8, 2, ""},
{"尬聊幽灵", "敌人", 12, 3, ""},
{"烂梗魔王", "BOSS", 30, 5, "所有梗都该变成我的烂梗!哈哈哈!"}
};
// 清屏函数(保持不变)
void cls() {
system("cls");
}
// C++98 兼容的 to_string 函数(保持不变)
template <typename T>
string to_string(T value) {
ostringstream os;
os << value;
return os.str();
}
// 延时函数(保持不变)
int sleep_ms(double sec, bool can_skip = true) {
clock_t end_time = static_cast<clock_t>(sec * CLOCKS_PER_SEC) + clock();
for (clock_t now = clock(); now < end_time; now = clock()) {
if (can_skip && KEY_DOWN(KEY_ENTER)) {
return 1;
}
}
return 0;
}
// ########################## 关键修改:逐字显示函数 ##########################
void print_text(const string& content, bool can_skip = true) {
double speed = text_speed;
for (size_t i = 0; i < content.size(); ++i) {
// 实时检测Enter键:如果按下,直接输出剩余内容并退出循环
if (can_skip && KEY_DOWN(KEY_ENTER)) {
// 输出当前字符+剩余所有字符(避免遗漏当前循环的字符)
cout << content.substr(i);
cout.flush();
return; // 直接终止函数,跳过后续逐字逻辑
}
// 正常逐字输出
cout << content[i];
cout.flush();
// 延时期间仍允许按Enter加速(原逻辑保留)
if (sleep_ms(speed, can_skip)) {
speed = 0.001; // 加速显示(若未按Enter跳过,仅降低延时)
}
}
}
// ###########################################################################
// 对话函数(保持不变,依赖修改后的print_text)
void talk(const string& speaker, const string& content) {
cls();
if (!speaker.empty()) {
print_text("[" + speaker + "]:\n", false);
sleep_ms(0.2);
}
print_text(" " + content + "\n\n");
print_text("(按下Enter继续)");
cin.ignore(numeric_limits<streamsize>::max(), '\n');
string temp;
getline(cin, temp);
cls();
}
// 检查文件是否存在
bool file_exists(const string& path) {
WIN32_FIND_DATAA find_data;
HANDLE h_find = FindFirstFileA(path.c_str(), &find_data);
if (h_find == INVALID_HANDLE_VALUE) {
FindClose(h_find);
return false;
}
bool is_file = !(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
FindClose(h_find);
return is_file;
}
// 保存游戏存档
void save_game() {
ofstream save_file(SAVE_FILE, ios::out | ios::trunc);
if (!save_file.is_open()) {
talk("系统", "存档保存失败!请确保游戏目录有写入权限!");
return;
}
save_file << player_name << "|"
<< player_health << "|" << player_max_health << "|"
<< player_mana << "|" << player_max_mana << "|"
<< props[0] << "|" << props[1] << "|" << props[2] << "|" << props[3] << "|"
<< scene << "|" << chapter << "|" << plot_step << endl;
save_file.close();
talk("系统", "存档已保存!下次可从「继续游戏」进入当前进度~");
}
// 读取游戏存档(保持不变)
bool load_game() {
if (!file_exists(SAVE_FILE)) {
return false;
}
ifstream save_file(SAVE_FILE);
if (!save_file.is_open()) {
talk("系统", "存档读取失败!");
return false;
}
string line;
getline(save_file, line);
save_file.close();
size_t pos = 0;
string token;
int idx = 0;
while ((pos = line.find("|")) != string::npos) {
token = line.substr(0, pos);
switch (idx) {
case 0:
player_name = token;
break;
case 1:
player_health = atoi(token.c_str());
break;
case 2:
player_max_health = atoi(token.c_str());
break;
case 3:
player_mana = atoi(token.c_str());
break;
case 4:
player_max_mana = atoi(token.c_str());
break;
case 5:
props[0] = atoi(token.c_str());
break;
case 6:
props[1] = atoi(token.c_str());
break;
case 7:
props[2] = atoi(token.c_str());
break;
case 8:
props[3] = atoi(token.c_str());
break;
case 9:
scene = token;
break;
case 10:
chapter = atoi(token.c_str());
break;
case 11:
plot_step = atoi(token.c_str());
break;
}
line.erase(0, pos + 1);
idx++;
}
talk("系统", "存档读取成功!欢迎回来," + player_name + "!");
return true;
}
// 显示背包界面(保持不变,依赖修改后的print_text)
void show_bag() {
cls();
print_text("=== 你的背包 ===\n\n", false);
print_text("【道具列表】\n", false);
print_text("1. 梗图碎片 x" + to_string(props[0]) + "\n");
print_text(" - 效果:合成表情包的原料,集齐5个可合成1个表情包\n");
print_text("2. 表情包 x" + to_string(props[1]) + "\n");
print_text(" - 效果:使用后恢复3点血量(消耗1点体力)\n");
print_text("3. 玩梗手册 x" + to_string(props[2]) + "\n");
print_text(" - 效果:战斗中使用,降低敌人攻击力2点(持续3回合,消耗2点体力)\n");
print_text("4. 快乐水 x" + to_string(props[3]) + "\n");
print_text(" - 效果:恢复全部体力(无消耗)\n\n");
print_text("【玩家状态】\n", false);
print_text("血量:" + to_string(player_health) + "/" + to_string(player_max_health) + "\n");
print_text("体力:" + to_string(player_mana) + "/" + to_string(player_max_mana) + "\n\n");
print_text("(按下任意键返回主菜单)");
_getch();
cls();
}
bool mini_game_fight(Character& enemy) {
cls();
print_text("=== 战斗开始:对阵「" + enemy.name + "」===\n", false);
print_text("规则:当屏幕出现「正确梗」时,按下Enter即可造成伤害!\n");
print_text("敌人血量:" + to_string(enemy.health) + " | 敌人攻击力:" + to_string(enemy.attack) + "\n\n");
sleep_ms(1);
const string correct_meme[] = {"鸡你太美", "绝绝子", "退!退!退!", "你这背景太假了"};
const string wrong_meme[] = {"这是烂梗", "尬到抠脚", "换个梗吧", "没活可以咬打火机"};
int enemy_hp = enemy.health;
int player_hp = player_health;
int round = 0;
while (enemy_hp > 0 && player_hp > 0) {
round++;
print_text("=== 第" + to_string(round) + "回合 ===\n", false);
sleep_ms(0.5);
print_text("「" + enemy.name + "」发起攻击!\n");
print_text("你受到了" + to_string(enemy.attack) + "点伤害!\n");
player_hp -= enemy.attack;
if (player_hp < 0) player_hp = 0;
print_text("当前血量:" + to_string(player_hp) + "/" + to_string(player_max_health) + "\n\n");
sleep_ms(1);
print_text("轮到你反击!等待正确梗出现...\n");
clock_t start_time = clock();
bool hit = false;
int meme_idx = rand() % 4;
for (int i = 0; i < 8; i++) {
cls();
print_text("=== 反击阶段 ===\n", false);
print_text("敌人血量:" + to_string(enemy_hp) + "\n");
print_text("你的血量:" + to_string(player_hp) + "\n\n");
if (i == 4) {
print_text(">>> " + correct_meme[meme_idx] + " <<<(按Enter攻击!)\n");
if (KEY_DOWN(KEY_ENTER)) {
hit = true;
break;
}
} else {
print_text(">>> " + wrong_meme[rand() % 4] + " <<<(等待正确梗...)\n");
if (KEY_DOWN(KEY_ENTER)) {
print_text("错误!这是烂梗,反击失败!\n");
sleep_ms(0.8);
break;
}
}
sleep_ms(0.3);
}
if (hit) {
int damage = 3 + (props[2] > 0 ? 2 : 0);
print_text("成功匹配正确梗!\n");
print_text("你对「" + enemy.name + "」造成了" + to_string(damage) + "点伤害!\n");
enemy_hp -= damage;
if (enemy_hp < 0) enemy_hp = 0;
} else if (!KEY_DOWN(KEY_ENTER)) {
print_text("超时了!反击失败...\n");
}
sleep_ms(1.2);
}
cls();
if (enemy_hp <= 0) {
print_text("=== 战斗胜利! ===\n", false);
print_text("你成功击败了「" + enemy.name + "」!\n");
int reward = rand() % 3 + 1;
props[0] += reward;
print_text("获得奖励:梗图碎片 x" + to_string(reward) + "\n");
player_health = player_hp;
sleep_ms(1);
return true;
} else {
print_text("=== 战斗失败 ===", false);
print_text("\n你被「" + enemy.name + "」击败了...\n");
print_text("游戏将回到主菜单,进度未保存!\n");
sleep_ms(2);
return false;
}
}
// 第一章剧情(保持不变,依赖修改后的print_text/talk)
void chapter1_plot() {
switch (plot_step) {
case 1: {
talk("", "你醒来时,发现自己躺在一个满是「梗」的广场上——");
talk("", "地上刻着「鸡你太美」的涂鸦,路灯是「可达鸭」造型,连空气里都飘着「绝绝子」的声音...");
talk("梗小鬼", npc[0].dialog);
talk("", "「烂梗魔王?那是什么?」");
talk("梗小鬼", "就是把好梗变成烂梗的恶魔!它把「梗森林」的守护梗都污染了,现在连「梗广场」都要保不住了!");
plot_step = 2;
break;
}
case 2: {
talk("梗小鬼", "听说「梗大师」在「梗书店」,他可能有办法对抗烂梗魔王!你快去问问吧!");
scene = "梗书店";
talk("", "你来到梗书店,门口挂着「玩梗需谨慎,尬聊请绕行」的招牌。");
talk("梗大师", npc[1].dialog);
props[2] += 1;
talk("系统", "获得道具:玩梗手册 x1!");
plot_step = 3;
break;
}
case 3: {
talk("梗大师", "烂梗魔王的手下「烂梗史莱姆」已经闯进书店了!你得先打败它,才能继续前进!");
if (mini_game_fight(npc[2])) {
talk("梗大师", "干得好!不过这只是开始,烂梗魔王的主力在「梗城堡」,你需要更多「表情包」才能对抗它!");
talk("梗大师", "表情包可以用5个梗图碎片合成,你先去「梗森林」收集碎片吧!");
scene = "梗森林";
plot_step = 4;
save_game();
} else {
plot_step = 3;
}
break;
}
case 4: {
talk("", "你来到梗森林,这里的树木都是「熊猫头」造型,地上散落着不少梗图碎片。");
int get_fragment = rand() % 2 + 1;
props[0] += get_fragment;
talk("系统", "获得梗图碎片 x" + to_string(get_fragment) + "!当前碎片:" + to_string(props[0]));
if (props[0] >= 5) {
talk("系统", "梗图碎片已集齐5个,是否合成表情包?(Y/N)");
print_text("请选择:");
char choice;
cin >> choice;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
if (toupper(choice) == 'Y') {
props[0] -= 5;
props[1] += 1;
talk("系统", "合成成功!获得表情包 x1!");
}
}
talk("", "突然,一只「尬聊幽灵」从树后飘了出来!");
if (mini_game_fight(npc[3])) {
talk("系统", "你在尬聊幽灵身上找到了「梗城堡钥匙」!");
scene = "梗城堡";
plot_step = 5;
save_game();
} else {
plot_step = 4;
}
break;
}
case 5: {
talk("", "你用梗城堡钥匙打开大门,城堡里充满了「烂梗」的气息——");
talk("", "墙上的壁画是「退!退!退!」的循环动画,楼梯扶手刻着「你这背景太假了」的字样...");
talk("烂梗魔王", npc[4].dialog);
talk("", "「我不会让你污染所有梗的!」");
talk("烂梗魔王", "那就来试试吧!看看是你的好梗厉害,还是我的烂梗更胜一筹!");
if (mini_game_fight(npc[4])) {
talk("梗大师", "恭喜你击败了烂梗魔王!梗世界暂时恢复了和平...");
talk("梗大师", "不过听说「网络深海」还有更强大的「恶意玩梗怪」,你愿意继续守护梗世界吗?");
talk("", "「当然愿意!」");
chapter = 2;
plot_step = 1;
talk("系统", "第一章完成!解锁第二章:网络深海的危机!");
save_game();
} else {
plot_step = 5;
}
break;
}
}
}
// 第二章剧情(保持不变)
void chapter2_plot() {
switch (plot_step) {
case 1: {
talk("梗大师", "网络深海是梗的发源地,但最近出现了「恶意玩梗怪」,它会把正能量梗变成恶意梗!");
talk("梗大师", "我给你一瓶「快乐水」,关键时刻能恢复全部体力!");
props[3] += 1;
talk("系统", "获得道具:快乐水 x1!");
scene = "网络深海";
talk("", "你来到网络深海,这里像一片蓝色的数据流海洋,漂浮着各种「梗气泡」...");
talk("恶意玩梗怪", "又是来阻止我的?告诉你,所有梗都该用来嘲讽别人!");
talk("系统", "第二章剧情正在开发中,敬请期待后续版本!");
plot_step = 2;
save_game();
break;
}
case 2: {
talk("", "你暂时击退了恶意玩梗怪,但它逃走了...");
talk("梗大师", "看来需要更多伙伴才能彻底打败它,我们先回梗广场休整吧!");
scene = "梗广场";
plot_step = 2;
break;
}
}
}
void game_main() {
while (true) {
cls();
print_text("=== -梗传奇- ver.1.0 ===\n", false);
print_text("当前场景:" + scene + " | 章节:第" + to_string(chapter) + "章 | 剧情步骤:" + to_string(plot_step) + "\n\n");
print_text("1. 继续剧情\n");
print_text("2. 查看背包\n");
print_text("3. 保存游戏\n");
print_text("4. 返回主菜单\n");
print_text("请选择(1-4):");
int choice;
cin >> choice;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
switch (choice) {
case 1: {
if (chapter == 1) {
chapter1_plot();
} else if (chapter == 2) {
chapter2_plot();
} else {
talk("系统", "后续章节正在开发中,敬请期待!");
}
break;
}
case 2: {
show_bag();
break;
}
case 3: {
save_game();
break;
}
case 4: {
return;
}
default: {
talk("系统", "输入错误!请选择1-4之间的数字!");
break;
}
}
}
}
int main() {
srand(static_cast<unsigned int>(time(NULL)));
cls();
bool running = true;
print_text(" -梗传奇- ver.1.0\n", false);
print_text("—— 请勿随意转载使用 ——\n\n", false);
print_text("制作者:Jason_\n", false);
print_text("鸣谢:python卧底,灵感来源\n", false);
print_text("适配:C++98 标准(兼容所有Windows编译器)\n\n", false);
sleep_ms(2);
cls();
while (running) {
print_text("=== 主菜单 ===\n", false);
print_text("1. 新的游戏\n");
print_text("2. 继续游戏\n");
print_text("3. 游戏设置\n");
print_text("4. 关于游戏\n");
print_text("5. 退出游戏\n");
print_text("请选择(1-5):");
int choice;
cin >> choice;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cls();
switch (choice) {
case 1: {
is_new_game = true;
cls();
print_text("请输入你的名字:", false);
cout << endl;
cin.clear();
fflush(stdin);
char name_buf[100];
cin.getline(name_buf, 100);
player_name = string(name_buf);
if (player_name.empty() || player_name.find_first_not_of(" \t\n") == string::npos) {
player_name = "匿名玩家";
}
player_health = 15;
player_max_health = 15;
player_mana = 8;
player_max_mana = 8;
memset(props, 0, sizeof(props));
scene = "梗广场";
chapter = 1;
plot_step = 1;
talk("系统", "新游戏创建成功!欢迎你," + player_name + "!");
game_main();
break;
}
case 2: {
if (load_game()) {
game_main();
} else {
talk("系统", "未找到存档文件!请先创建新游戏!");
}
break;
}
case 3: {
talk("", "当前文字速度:" + to_string(text_speed) + "秒/字");
talk("", "请输入新的速度(0.02~0.2,数值越小越快):");
cin >> text_speed;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
if (text_speed < 0.02) text_speed = 0.02;
if (text_speed > 0.2) text_speed = 0.2;
talk("系统", "文字速度设置成功!新速度:" + to_string(text_speed) + "秒/字");
break;
}
case 4: {
talk("关于游戏", "- 梗传奇 - ver.1.0\n");
talk("关于游戏", "本次更新:半夜没事改bug,修复了输入名字一直都是匿名玩家的bug。求赞啊(2025年8月27日23:36)");
talk("关于游戏", "适配说明:兼容C++98标准,支持MSVC/MinGW/Clang编译器,仅支持Windows系统。");
talk("关于游戏", "后续更新:将新增第三章「梗星大战」、更多道具与敌人类型。");
break;
}
case 5: {
talk("系统", "确定要退出游戏吗?(Y/N)");
print_text("请选择:");
char confirm;
cin >> confirm;
if (toupper(confirm) == 'Y') {
running = false;
talk("系统", "感谢游玩 -梗传奇- !");
}
break;
}
default: {
talk("系统", "输入错误!请选择1-5之间的数字!");
break;
}
}
}
return 0;
}
全部评论 3
必须点👍
5天前 来自 上海
0谢
4天前 来自 上海
0
非常可以·
5天前 来自 上海
0有错误
希望你能改一下5天前 来自 安徽
0哪里?
5天前 来自 上海
0包改的
5天前 来自 上海
0namespace
5天前 来自 安徽
0
有帮助,赞一个