#include <cstdlib>
#include <iostream>
#include <vector>
#include <thread>
void ClearScreen()
{
char const* cmd =
#if defined(_WIN32)
"cls";
#elif defined(__linux__)
"clear";
#endif
std::system(cmd);
}
int const HELP_OPTION = 99;
void HintWithSleep(char const* hint, int64_t seconds_would_wait = 0)
{
std::cout << hint << std::endl;
if (seconds_would_wait > 0)
{
std::this_thread::sleep_for(std::chrono::seconds(seconds_would_wait));
}
}
using Options = std::vector<char const*>;
int Select(char const* question, Options options)
{
do
{
std::cout << "\n" << question << "\n";
if (options.size() >= HELP_OPTION)
{
throw "扯淡吗?让用户做这么多选择?";
}
for (int i=0; i<options.size(); ++i)
{
std::cout << i+1 << ":\t" << options[i] << "\n";
}
std::cout << HELP_OPTION << ":\t 帮助\n";
std::cout << "请选择(1-" << options.size() << ",Ctrl+C 强行退出):";
int i;
std::cin >> i;
if (std::cin.fail())
{
std::cin.clear(); // 清除错误的流状态
std::cin.ignore();
throw "错误的输入(非法选择项)";
}
if (i == HELP_OPTION)
{
std::cout << "这一是款闻名全球的文字游戏,你只需输入选项开头的数字以\n"
"做出选择即可参与一场惊心动魄的大战!" << std::endl;
HintWithSleep("看明白了吗?即将开始重选", 4);
ClearScreen();
continue;
}
if (i < 1 || i > options.size())
{
std::cout << "你会不会玩啊!你得输入符合范围的选择!\n(碰上你们这种玩家真是烦死了!)" << std::endl;
}
return i;
}
while (false);
return -1;
}
void GameOver(char const* additions = nullptr)
{
std::cout << ">>>>>> 抱歉,你挂了!!!玩家村全村人民高兴的准备吃席 <<<<<<<"
<< std::endl;
if (additions && *additions)
{
std::cout << additions << std::endl;
}
}
enum class Result {YouLose /*你死了*/, YouWin /*你赢了*/, WrongRoad /*错误路径*/};
void ByeBye(Result r)
{
if ( r == Result::YouLose)
{
std::cout << "\n下次要努力哦!再见!\n" << std::endl;
} else if (r == Result::YouWin)
{
std::cout << "\n这不可能!算你狗屎运好!再见!\n" << std::endl;
}
}
Result OnBox()
{
int sel = Select("哇!遇见了一个盒子,要不要打开?", Options {
"那必须啊!", "还是苟点好……"
});
switch(sel)
{
case 1 : // 打开
HintWithSleep("盒子里弹一把小刀,刺向你的下体……", 3);
GameOver();
break;
case 2 :
HintWithSleep("没有打开宝盒,你拿不到信物。一只观察你很久的小狗冲上来咬住你的下体……", 3);
GameOver("但那只可爱的小狗狗说它已经吃饱了。");
break;
}
return Result::YouLose; // 这关反正要你死
}
Result OnBomb()
{
HintWithSleep("轰!!!\n突然,从天而降的地雷……", 3);
GameOver("(地雷说:我又没爆炸,他怎么挂了?答:被砸的)");
return Result::YouLose;
}
Result UnImplemented()
{
HintWithSleep("此路还在开发中,欢迎各大开发商参加招投标!", 1);
return Result::WrongRoad;
}
void Run()
{
int sel = Select("你掉入了洞穴!\n你的面前有三条路", Options{
"往前继续直走", "向左拐", "向右拐"
});
enum Dir {goStraight=1, turnLeft=2, turnRight=3};
switch(sel)
{
case goStraight:
ByeBye(OnBox()); //是的,直行必死
break;
case turnRight: // 是的,往右更是死
ByeBye(OnBomb());
break;
case turnLeft: // 往左没实现
UnImplemented(); // 唯一活路还没实现...
break;
}
}
int main()
{
for(;;)
{
try
{
Run();
auto c = Select("再来一把?", Options {"好!", "滚!"});
if (c == 2)
{
std::cout << "好吧!我滚了!" << std::endl;
break;
}
ClearScreen();
}
catch (char const* e)
{
std::cerr << "\n发像出现了异常:" << e << "……必须重来!" << std::endl;
HintWithSleep("系统正在努力重启中...", 2);
ClearScreen();
continue;
}
}
}