#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
using namespace std;
int san = 100, clue = 0, day = 1, deathCount = 0;
string playerName;
bool hasDiary = false, hasPhoto = false, hasKey = false;
bool metGhost = false, savedGirl = false;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
void setColor(int c) { SetConsoleTextAttribute(hConsole, c); }
void slowPrint(string t, int s = 32) {
for (char ch : t) {
cout << ch;
Sleep(s);
}
}
void showTitle(string t, int c) {
system("cls");
setColor(c);
cout << "=== " << t << " ===\n\n";
setColor(7);
}
void gameStart() {
showTitle("搬 家 第 一 天", 11);
cout << "请输入你的名字:";
cin >> playerName;
system("cls");
setColor(14);
cout << "========================================\n";
cout << " 2023年10月15日\n";
cout << "========================================\n\n";
setColor(7);
slowPrint(playerName + ",你刚租下这套便宜得不正常的公寓。\n");
Sleep(800);
slowPrint("房东是个眼神空洞的老太太,临走前用极低的声音说:\n");
Sleep(800);
setColor(12);
slowPrint("'记住,晚上11点后……千万别出门!'\n\n");
setColor(7);
Sleep(1200);
cout << "你收拾行李时,发现前房客留下的三样东西:\n";
cout << "1. 一本破旧的日记本\n";
cout << "2. 一张泛黄的照片\n";
cout << "3. 一把生锈的钥匙\n";
cout << "你只能带走一样,请选择:";
char choice = getch();
if (choice == '1') {
hasDiary = true;
slowPrint("\n你拿起了日记本……封面很凉。\n");
} else if (choice == '2') {
hasPhoto = true;
slowPrint("\n你拿起了照片……照片在微微发烫。\n");
} else if (choice == '3') {
hasKey = true;
slowPrint("\n你拿起了钥匙……上面有淡淡的血腥味。\n");
} else {
slowPrint("\n你什么都没拿……也许会后悔。\n");
}
Sleep(1000);
slowPrint("\n夜深了,窗外下起冰冷的雨……\n");
Sleep(1500);
}
void diaryEvent() {
showTitle("日 记 本", 14);
slowPrint("你翻开日记本,字迹又乱又尖:\n\n");
Sleep(800);
setColor(12);
cout << "「10月10日」\n";
setColor(7);
slowPrint("她又站在走廊尽头了……我不敢看她的脸。\n");
Sleep(800);
cout << "\n";
setColor(12);
cout << "「10月11日」\n";
setColor(7);
slowPrint("邻居说,十年前有个红衣女孩跳楼了。\n");
Sleep(800);
cout << "\n";
setColor(12);
cout << "「10月12日」\n";
setColor(7);
slowPrint("地下室的门……我好像听到里面在哭。钥匙不见了。\n");
Sleep(800);
clue += 3;
cout << "\n\n线索 +3,当前线索:" << clue << "\n";
cout << "按任意键继续..."; getch();
}
void photoEvent() {
showTitle("泛 黄 的 照 片", 14);
slowPrint("照片上是两个小女孩,红衣、白衣。\n");
Sleep(800);
slowPrint("背面写着:‘妹妹,对不起……’\n");
Sleep(800);
slowPrint("突然,红衣女孩的眼睛……转向了你。\n");
san -= 8;
clue += 2;
cout << "\n\n理智 -8,线索 +2\n";
cout << "按任意键继续..."; getch();
}
void firstNight() {
showTitle("第 一 夜 - 噩 梦", 12);
slowPrint("你躺在床上,雨声越来越诡异……\n");
Sleep(1000);
slowPrint("梦里,楼顶风很大,红衣女孩背对着你。\n");
Sleep(1000);
slowPrint("‘救救我……’她缓缓转过头……\n");
Sleep(1200);
cout << "\n你猛地惊醒!时间:凌晨 3:33\n";
setColor(12);
cout << "窗户外……贴着一个红色的人影!\n";
setColor(7);
cout << "\n你会:\n";
cout << "1. 闭眼假装没看见\n";
cout << "2. 靠近窗户查看\n";
cout << "3. 躲进被子发抖\n";
char choice = getch();
if (choice == '1') {
slowPrint("\n你紧闭双眼,拼命告诉自己是幻觉……\n");
Sleep(1000);
slowPrint("几分钟后,窗外安静了。\n");
} else if (choice == '2') {
slowPrint("\n你靠近窗户……一张惨白的脸贴在玻璃上!\n");
san -= 30;
slowPrint("你几乎窒息……\n");
} else {
slowPrint("\n你缩在被子里,听着窗外的指甲刮擦声……\n");
san -= 12;
}
cout << "\n按任意键继续..."; getch();
}
void meetNeighbor() {
showTitle("第" + to_string(day) + "天 - 邻 居", 14);
slowPrint("走廊里,一个老婆婆靠着墙,眼神浑浊。\n");
Sleep(1000);
slowPrint("‘新来的吧……那间房,死过人。’\n");
Sleep(1000);
slowPrint("‘十年前,小琪跳楼了。她姐姐小玲,从此失踪。’\n");
Sleep(1000);
slowPrint("‘她们……就是为了一个小小的发卡。’\n");
clue += 2;
cout << "\n线索 +2\n";
cout << "\n你要问:\n";
cout << "1. 她们为什么吵架?\n";
cout << "2. 地下室有什么?\n";
cout << "3. 怎么让她安息?\n";
char choice = getch();
if (choice == '1') {
slowPrint("\n‘小琪摔坏了姐姐最珍贵的发卡……’\n");
clue++;
} else if (choice == '2') {
slowPrint("\n‘地下室是小琪死前待最久的地方……门锁着。’\n");
if (hasKey) slowPrint("\n你摸了摸口袋里的钥匙,它在震动。\n");
} else if (choice == '3') {
slowPrint("\n‘找到她没说出口的道歉……她就能安息。’\n");
slowPrint("去地下室,但……千万别待到午夜。\n");
}
cout << "\n按任意键继续..."; getch();
}
void basementEvent() {
showTitle("地 下 室", 8);
setColor(8);
cout << "空气冰冷潮湿,到处是腐烂味……\n\n";
setColor(7);
if (!hasKey) {
slowPrint("门锁得死死的,你根本打不开。\n");
slowPrint("你必须找到钥匙才能继续。\n");
cout << "\n按任意键返回..."; getch();
return;
}
slowPrint("钥匙插进去,发出‘咔嗒’一声……像骨头断裂。\n");
Sleep(1000);
slowPrint("黑暗深处,有个破旧的木箱子。\n");
cout << "\n你选择:\n";
cout << "1. 打开箱子\n";
cout << "2. 查看墙壁\n";
cout << "3. 立刻离开\n";
char choice = getch();
if (choice == '1') {
slowPrint("\n箱子里有一支粉色发卡,还有一封皱巴巴的信。\n");
Sleep(800);
slowPrint("‘姐姐,对不起……我不是故意的。我在顶楼等你。’\n");
clue += 4;
savedGirl = true;
} else if (choice == '2') {
slowPrint("\n墙上全是指甲抓痕……深到嵌进水泥里。\n");
san -= 20;
} else {
slowPrint("\n你疯了一样逃出地下室……心脏狂跳。\n");
return;
}
cout << "\n按任意键继续..."; getch();
}
void rooftopFinal() {
showTitle("第7天 - 顶 楼", 12);
if (!savedGirl) {
slowPrint("楼顶风像哭声一样嘶吼。\n");
Sleep(1000);
slowPrint("红衣女孩飘到你面前:‘你根本不想帮我……’\n");
Sleep(1000);
slowPrint("她的脸开始腐烂,眼睛流出黑血……\n");
san -= 999;
slowPrint("\n你脚下一空,从楼顶坠落……\n");
slowPrint("从此,这栋楼又多了一个不肯离开的人。\n");
setColor(12);
cout << "\n===== 坏结局:第三位住客 =====\n";
setColor(7);
} else {
slowPrint("你在水箱后面找到了发卡,冰凉冰凉。\n");
Sleep(1000);
slowPrint("红衣女孩安静地出现,没有恐怖,只有委屈。\n");
Sleep(1000);
slowPrint("‘你……拿到我的信了?’\n");
Sleep(1000);
slowPrint("你把发卡递给她。她轻轻笑了。\n");
Sleep(1000);
slowPrint("‘姐姐……我终于可以去找你了。’\n");
slowPrint("红衣慢慢变淡,消失在风里。\n");
setColor(10);
cout << "\n===== 好结局:姐妹和解 =====\n";
cout << " 公寓恢复了平静……\n";
setColor(7);
}
cout << "\n按任意键结束游戏..."; getch();
}
void randomEvent() {
vector<string> events = {
"电梯镜子里,你身后站着一个红衣女孩",
"水龙头流出的水,是淡红色的",
"走廊尽头传来小女孩的哭声",
"你的房门,自己轻轻开了一条缝",
"窗户上,慢慢印出一个手掌印",
"电视自动打开,播放十年前的跳楼新闻"
};
vector<string> reacts = {
"你吓得不敢动", "你立刻关掉水龙头",
"你捂住耳朵快跑", "你冲过去把门反锁",
"你用衣服擦掉它", "你颤抖着关掉电视"
};
int r = rand() % events.size();
showTitle("诡 异 事 件", 12);
slowPrint(events[r] + "……\n");
Sleep(800);
slowPrint(reacts[r] + "。\n");
san -= 6;
cout << "\n理智 -6\n";
cout << "按任意键继续..."; getch();
}
bool checkSanity() {
if (san <= 0) {
showTitle("理 智 崩 溃", 12);
slowPrint("你再也分不清现实和鬼魂……\n");
Sleep(1000);
slowPrint("你永远留在了这栋诅咒的公寓里。\n");
deathCount++;
cout << "\n重新开始游戏?(y/n):";
if (getch() == 'y') {
san = 100; clue = 0; day = 1;
hasDiary = hasPhoto = hasKey = false;
metGhost = savedGirl = false;
return true;
}
return false;
}
if (san < 30) {
setColor(12);
cout << "\n!! 警告:理智极低,你快要崩溃了 !!\n";
setColor(7);
Sleep(1200);
}
return true;
}
void daySummary() {
showTitle("第" + to_string(day) + "天 · 总结", 10);
cout << "==========================\n";
cout << "理智值:" << san << "/100\n";
cout << "线索 :" << clue << "\n";
cout << "持有物:";
if (hasDiary) cout << "日记本 ";
if (hasPhoto) cout << "照片 ";
if (hasKey) cout << "钥匙 ";
if (!hasDiary && !hasPhoto && !hasKey) cout << "无";
cout << "\n==========================\n\n";
cout << "按任意键进入下一天...";
getch();
}
int main() {
srand(time(0));
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(hConsole, &cursorInfo);
cursorInfo.bVisible = false;
SetConsoleCursorInfo(hConsole, &cursorInfo);
system("title 规则怪谈:红衣女孩 · 增强版");
system("mode con cols=68 lines=28");
setColor(12);
cout << "╔════════════════════════════════╗\n";
cout << "║ 规 则 怪 谈 ║\n";
cout << "║ - 红 衣 女 孩 - ║\n";
cout << "╚════════════════════════════════╝\n\n";
setColor(7);
slowPrint("本故事根据真实都市传说改编……\n", 40);
Sleep(1500);
gameStart();
while (day <= 7) {
if (day == 1)
firstNight();
else if (day == 2 && hasDiary)
diaryEvent();
else if (day == 2 && hasPhoto)
photoEvent();
else if (day == 3)
meetNeighbor();
else if (day == 4)
basementEvent();
else if (day >= 5 && day <= 6) {
randomEvent();
if (!checkSanity()) break;
randomEvent();
if (!checkSanity()) break;
} else if (day == 7) {
rooftopFinal();
break;
}
if (!checkSanity()) {
if (san <= 0) {
san = 100; clue = 0; day = 1;
hasDiary = hasPhoto = hasKey = false;
metGhost = savedGirl = false;
continue;
}
}
daySummary();
day++;
}
cursorInfo.bVisible = true;
SetConsoleCursorInfo(hConsole, &cursorInfo);
return 0;
}