测测你的手速!别踩白块!
开始后,你需要用最快的速度按下黑色数字按键。
游戏共有 3 种模式: 1.经典模式 2.限时模式 3.无尽模式
1.经典模式: 在最短时间内完成25次按键任务
2.限时模式: 在30s内完成尽可能多的按键任务
3.无尽模式: 不限时,按错为止
准备好了嘛?
按下对应数字(1 ~ 3)我们就开始了~
*注意:请将输入法改为英文!
#include <iostream>
#include <unistd.h>
#include <termio.h>
#include <ctype.h>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;
int mode; // 游戏模式 1.经典模式 2.限时模式 3.无尽模式
int getch()
{// 不回显的输入
struct termios nts, ots;
// 得到当前终端(0表示标准输入)的设置
if (tcgetattr(0, &ots) < 0) return EOF;
// 设置终端为Raw原始模式,该模式下所有的输入数据以字节为单位被处理
nts = ots;
cfmakeraw(&nts);
// 设置上更改之后的设置
if (tcsetattr(0, TCSANOW, &nts) < 0) return EOF;
// 设置还原成老的模式
int cr;
cr = getchar();
if (tcsetattr(0, TCSANOW, &ots) < 0) return EOF;
return cr;
}
// 打印1-4数字 num数字颜色标记为color
void print(int num, string color)
{
cout << "\033[0;0H";
if (mode == 1) cout << " ==== 经典模式 ====" << endl;
if (mode == 2) cout << " ==== 限时模式 ====" << endl;
if (mode == 3) cout << " ==== 无尽模式 ====" << endl;
cout << " ";
for (int i = 1; i <= 4; i++)
{
if (i == num)
{
if (color == "black")
cout << "\033[37;40m " << i << " \033[0m";
if (color == "green")
cout << "\033[37;42m " << i << " \033[0m";
if (color == "red")
cout << "\033[37;41m " << i << " \033[0m";
}
else
{
cout << "\033[30;47m " << i << " \033[0m";
}
}
cout << endl;
}
void intro() // 规则介绍
{
cout << "\033c" << flush;
cout << " =============================================" << endl;
cout << " 测测你的手速!别踩白块!" << endl;
cout << " 开始后,你需要用最快的速度按下黑色数字按键。" << endl;
cout << " 游戏共有 3 种模式: 1.经典模式 2.限时模式 3.无尽模式" << endl;
cout << " 1.经典模式: 在最短时间内完成25次按键任务" << endl;
cout << " 2.限时模式: 在30s内完成尽可能多的按键任务" << endl;
cout << " 3.无尽模式: 不限时,按错为止" << endl;
cout << " 准备好了嘛?" << endl;
cout << " 按下对应数字(1~3)我们就开始了~" << endl;
cout << " *注意:请将输入法改为英文!" << endl;
cout << " =============================================" << endl;
}
void game() // 游戏进程
{
srand(time(0));
int right = 0; // 按键次数
int start = time(0); // 开始时间
int tme = time(0) - start; // 已用时
cout << "\033c" << flush;
while (true)
{
// 结束游戏 1.经典模式 25次 2.限时模式 30s
if (mode == 1 && right >= 25) break;
if (mode == 2 && tme >= 30) break;
// 生成随机数
int r = rand() % 4 + 1;
print(r, "black");
// 获取按键
char ch = getch();
if (r == ch - '0') // 按键正确
{
right++;
print(r, "green");
usleep(100000);
tme = time(0) - start;
cout << " 已用时: " << tme << " s " << endl;
cout << " 按键数: " << right << " 次 "<< endl;
}
else // 按键错误
{
tme = time(0) - start;
cout << "\033c" << flush;
print(ch-'0', "red");
usleep(100000);
cout << " ==== GAME OVER! ====" << endl;
usleep(500000);
break;
}
}
// 游戏总结
cout << "\033c" << flush;
cout << " ==== 总结 ====" << endl;
cout << " 总用时: " << tme << " s" << endl;
cout << " 按键数: " << right << " 次" << endl;
cout << " 手 速: " << 1.0*right/tme << " 次/s" << endl;
cout << " ==============" << endl;
cout << " 按回车开始新游戏..." << endl;
getchar();
}
int main()
{
while (true)
{
intro();
char ch = getch();
if (ch >= '1' && ch <= '3')
{
mode = ch - '0'; // 设定模式
game();
}
else if (ch == 27) // ESC的ascii是27
{
cout << " 退出游戏!" << endl;
break;
}
else cout << " 输入有误,请再次输入!" << endl;
}
return 0;
}