这是我一年前写的代码了,现在把它展示出来。
由于是一年前的东西,所以界面和推箱子没法比 (但还是能看)。
将以下代码在 windows \color{red}\texttt{windows} windows 环境下编译:
#include <bits/stdc++.h>
#include <windows.h>
#include <unistd.h>
#include <conio.h>
using namespace std;
typedef long long ll;
ll n, s1 = 1, s2 = 1, t1 = 0, t2 = 0, s = 0, b, mn = INT_MAX, sg = 1, z, z1 = 0, z2 = 0, x, y, c, d, rs, mnt = INT_MAX;
char g;
double a;
string name1, name2;
struct game
{ // 多人结构体
string name;
int score, da;
long long t;
} w[101];
void HideTheCursor() // 光标隐藏部分
{
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (GetConsoleCursorInfo(hStdOut, &cciCursor))
{
cciCursor.bVisible = FALSE;
SetConsoleCursorInfo(hStdOut, &cciCursor);
}
}
void duoren() // 多人游戏
{
++s;
srand(time(0));
b = rand() % 10100 - 100;
w[s].da = b;
cout << setw(45) << "猜数游戏:答题界面" << endl;
printf("请玩家%d %s 答题\n\n", s, w[s].name.data());
printf("(系统已出好了题,尽快答题即可。)\n");
printf("****时间和答题次数将被系统记录****\n");
printf("温馨提示:答题范围是-100~10000的整数\n");
w[s].score = 1;
w[s].t = time(NULL);
cin >> a;
while (a != b)
{
if (a > b)
cout << "对不起,太大了,请再试一次" << endl;
else
cout << "对不起,太小了,请再试一次" << endl;
if (w[s].score == 10)
cout << "温馨提示:你已经回答了10次,请尽快完成答题!" << endl;
cin >> a;
++w[s].score;
}
w[s].t = time(NULL) - w[s].t;
cout << "恭喜你!你用了" << w[s].score << "次就答对了!" << endl;
cout << "本次用时:" << w[s].t << "秒\n\n";
system("pause");
system("cls");
if (s + 1 <= rs)
{
printf("请把电脑屏幕面向%s。\n\n", w[s + 1].name.data());
system("pause");
system("cls");
duoren();
}
}
bool cmp(game a, game b) // 多人sort结构体判断部分
{
return a.score < b.score || a.score == b.score && a.t < b.t || a.score == b.score && a.t == b.t && a.name < b.name;
}
void shuangren() // 双人游戏
{
int c1, c2;
++s;
s1 = 1;
s2 = 1;
system("cls");
cout << "系统提示:请把电脑面向" << name1 << endl
<< endl;
system("pause");
system("cls");
cout << setw(40) << "猜数游戏:第" << s << "局 round 1" << endl
<< "(" << name1 << ":出题界面)" << endl;
cout << "请出题,数字范围在-100~10000之间,不允许小数" << endl;
cin >> n;
while (n < -100 || n > 10000)
{
cout << "超出范围,请重新出题。" << endl;
cin >> n;
}
system("cls");
cout << setw(40) << "猜数游戏:第" << s << "局 round 1" << endl
<< "(" << name2 << ":答题界面)" << endl;
cout << "请答题(提示:数字范围是-100~10000之间的整数)" << endl;
cout << "(请尽可能快地答题,次数和时间会计入总成绩)" << endl;
c2 = time(NULL);
cin >> a;
while (a != n)
{
if (a > n)
cout << "对不起,太大了,请再试一次" << endl;
else
cout << "对不起,太小了,请再试一次" << endl;
if (s2 == 10)
cout << "温馨提示:你已经回答了10次,请尽快完成答题!" << endl;
cin >> a;
++s2;
}
c2 = time(NULL) - c2;
cout << "恭喜你!你用了" << s2 << "次就答对了!" << endl;
cout << "本次用时:" << c2 << "秒" << endl
<< endl;
system("pause");
system("cls");
cout << setw(40) << "猜数游戏:第" << s << "局 round 2" << endl
<< "(" << name2 << ":出题界面)" << endl;
cout << "请出题,数字范围在-100~10000之间,不允许小数" << endl;
cin >> n;
while (n < -100 || n > 10000)
{
n = 0;
cout << "超出范围,请重新出题。" << endl;
cin >> n;
}
system("cls");
cout << setw(40) << "猜数游戏:第" << s << "局 round 2" << endl
<< "(" << name1 << ":答题界面)" << endl;
cout << "请答题(提示:数字范围是-100~10000之间的整数)" << endl;
cout << "(请尽可能快地答题,次数和时间会计入总成绩)" << endl;
c1 = time(NULL);
cout << "**(" << name2 << "猜了" << s2 << "次,耗时" << c2 << "秒)**" << endl;
cin >> a;
while (a != n)
{
if (a > n)
cout << "对不起,太大了,请再试一次" << endl;
else
cout << "对不起,太小了,请再试一次" << endl;
if (s1 == 10)
cout << "温馨提示:你已经回答了10次,请尽快完成答题!" << endl;
cin >> a;
++s1;
}
c1 = time(NULL) - c1;
cout << "恭喜你!你用了" << s1 << "次就答对了!" << endl;
cout << "本次用时:" << c1 << "秒" << endl
<< endl;
system("pause");
system("cls");
cout << "系统提示:请把电脑面向双方" << endl
<< endl;
system("pause");
system("cls");
z1 += s1;
z2 += s2;
t1 += c1;
t2 += c2;
cout << "目前" << name1 << "成绩总和:" << z1 << "次," << t1 << "秒" << endl;
cout << "目前" << name2 << "成绩总和:" << z2 << "次," << t2 << "秒" << endl
<< endl;
system("pause");
system("cls");
cout << "请输入一个数字,表示是否退出游戏(退出请按0,继续游戏请按1)" << endl;
cout << "输入:";
while (1)
{
if (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
while (g != '0' && g != '1')
{
cout << "发现错误的命令,请重新输入。" << endl
<< "输入:";
while (1)
{
if (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
}
if (g == '0')
{
int flag1 = 1;
system("cls");
cout << setw(46) << "猜数游戏:最终结果" << endl
<< endl;
if (z1 < z2 || z1 == z2 && t1 < t2)
cout << setw(43) << "最终胜利者:" << name1 << endl
<< setw(45) << "用了:" << z1 << "次" << endl
<< setw(45) << "耗时:" << t1 << "秒" << endl;
else if (z1 > z2 || z1 == z2 && t1 > t2)
cout << setw(43) << "最终胜利者:" << name2 << endl
<< setw(45) << "用了:" << z2 << "次" << endl
<< setw(45) << "耗时:" << t2 << "秒" << endl;
else
cout << setw(43) << "双方平局,均猜了" << z1 << "次,耗时" << t1 << "秒。\n", flag1 = 2;
if (flag1 == 1)
cout << setw(45) << "恭喜你!" << endl;
else
cout << setw(45) << "恭喜你们!" << endl;
int ck1 = 28, ck2 = 24;
for (int i = 1; i <= 11; ++i)
{
cout << setw(ck1) << "win!";
++ck1;
cout << setw(ck2) << "win!";
cout << endl;
ck2 -= 2;
}
for (int i = 1; i <= 6; ++i)
cout << setw(ck1 + 1) << "win!" << endl;
for (int i = 1; i <= 11; ++i)
cout << "鼓掌! ";
}
else
{
system("cls");
if (s == 1)
{
cout << setw(45) << "简介" << endl
<< "游戏规则:系统会自动将双方的成绩累加,到最后的时候比总成绩。";
Sleep(5000);
}
shuangren();
} // 实现双人多次游戏
}
void h() // 单人游戏
{
++s;
x = s;
sg = 1;
srand(time(0));
b = rand() % 10100 - 100;
long long c = time(NULL);
cout << setw(45) << "猜数游戏:单人第" << x << "局" << endl;
cout << "请猜数,数的范围在-100~10000之间。" << endl;
cout << "(提示:电脑已随机生成一个数)" << endl;
cout << "****请尽快答题,时间将被系统记录。****" << endl;
cin >> a;
while (a != b)
{
if (a > b)
cout << "对不起,太大了,请再试一次" << endl;
else
cout << "对不起,太小了,请再试一次" << endl;
if (sg == 10)
cout << "温馨提示:你已经回答了10次,请尽快完成答题!" << endl;
cin >> a;
++sg;
}
c = time(NULL) - c;
cout << "恭喜你!你用了" << sg << "次就答对了!" << endl;
cout << "本次用时:" << c << "秒" << endl
<< endl;
if (sg < mn)
{
z = x;
mn = sg;
mnt = c;
}
else
{
if (sg == mn && c < mnt)
{
z = x;
mnt = c;
}
}
cout << "目前最高记录:第" << z << "局,用了" << mn << "次,用时" << mnt << "秒,加油!" << endl
<< endl;
system("pause");
system("cls");
cout << "请输入一个数字,表示是否退出游戏(退出请按0,继续游戏请按1)" << endl;
cout << "输入:";
while (1)
{
if (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
while (g != '0' && g != '1')
{
cout << "发现错误的命令,请重新输入。" << endl
<< "输入:";
while (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
Sleep(300);
if (g == '1')
{
system("cls");
h();
}
else
{
system("cls");
cout << setw(47) << "猜数游戏:最终结果" << endl
<< endl;
cout << setw(37) << "最终最高记录:第" << z << "局,用了" << mn << "次,耗时" << mnt << "秒" << endl;
cout << setw(42) << "恭喜你!" << endl;
int ck1 = 28, ck2 = 24;
for (int i = 1; i <= 11; ++i)
{
cout << setw(ck1) << "win!";
++ck1;
cout << setw(ck2) << "win!";
cout << endl;
ck2 -= 2;
}
for (int i = 1; i <= 6; ++i)
cout << setw(ck1 + 1) << "win!" << endl;
for (int i = 1; i <= 11; ++i)
cout << "恭喜! ";
} // 实现单人多次游戏
}
void caishuyouxi() // 猜数主程序
{
system("cls");
cout << setw(45) << "猜数游戏:模式选择" << endl;
cout << "请输入一个正整数,包含一个数字。" << endl;
cout << "请选择一个模式,单人游戏请打1,双人游戏请打2,多人游戏(三人及以上)请打3。" << endl;
cout << "输入:";
while (1)
{
if (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
while (g != '1' && g != '2' && g != '3')
{
cout << "发现错误的命令,请重新输入。" << endl
<< "输入:";
while (1)
{
if (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
}
s = 0;
if (g == '1' || g == '2')
{
system("cls");
}
if (g == '1')
{
z = 0, mn = INT_MAX, mnt = INT_MAX;
h();
}
else if (g == '2')
{
cout << "请输入双方的名称。" << endl;
cout << "玩家1:";
cin >> name1;
cout << "玩家2:";
cin >> name2;
cout << "恭喜你们,成功录入!" << endl;
Sleep(2000);
t1 = 0;
t2 = 0;
z1 = 0;
z2 = 0;
shuangren();
}
else if (g == '3')
{
printf("\n请输入游戏人数(3~100)\n人数:");
cin >> rs;
while (rs < 3 || rs > 100)
{
printf("超出范围,请重新输入\n人数:");
cin >> rs;
}
system("cls");
printf("请输入每个玩家的名字。\n(请务必牢记自己的编号)\n");
for (int i = 1; i <= rs; ++i)
{
printf("玩家%d:", i);
cin >> w[i].name;
}
printf("录入成功!");
Sleep(1900);
system("cls");
printf("请把电脑屏幕面向%s。", w[1].name.data());
system("pause");
system("cls");
duoren();
sort(w + 1, w + rs + 1, cmp);
cout << setw(45) << "最终排名" << endl;
for (int i = 1; i <= 3; ++i)
{
printf("第%d名:%s 用了%d次,耗时%d秒 答案:%d\n", i, w[i].name.data(), w[i].score, w[i].t, w[i].da);
}
printf("-------------------------------\n");
if (rs <= 10)
{
for (int i = 4; i <= rs; ++i)
{
printf("第%d名:%s 用了%d次,耗时%d秒 答案:%d\n", i, w[i].name.data(), w[i].score, w[i].t, w[i].da);
}
}
else
{
for (int i = 4; i <= 10; ++i)
{
printf("第%d名:%s 用了%d次,耗时%d秒 答案:%d\n", i, w[i].name.data(), w[i].score, w[i].t, w[i].da);
}
printf("-------------------------------\n");
printf("(只展示前十名)\n");
}
cout << endl;
int ck1 = 28, ck2 = 24;
for (int i = 1; i <= 11; ++i)
{
cout << setw(ck1) << "win!";
++ck1;
cout << setw(ck2) << "win!";
cout << endl;
ck2 -= 2;
}
for (int i = 1; i <= 6; ++i)
cout << setw(ck1 + 1) << "win!" << endl;
for (int i = 1; i <= 11; ++i)
cout << "恭喜! ";
}
system("pause");
system("cls");
cout << "请输入一个数字,表示是否重新开始游戏(重新开始请按1,退出程序请按0)" << endl;
while (1)
{
if (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
while (g != '1' && g != '0')
{
cout << "发现错误的命令,请重新输入。" << endl
<< "输入:";
while (1)
{
if (kbhit())
{
g = getch();
cout << g << endl;
break;
}
}
}
if (g == '0')
{
cout << "退出游戏。\n\n";
Sleep(1000);
return;
}
else
{
cout << "开始游戏!";
Sleep(1000);
caishuyouxi();
} // 实现多次执行程序
}
int main()
{
system("mode con cols=73");
HideTheCursor(); // 调用光标隐藏函数
system("color f5"); // 将程序底色设置为白色,字体颜色设置为紫色
caishuyouxi(); // 调用猜数主程序
system("pause");
return 0;
}
同样,如果有些电脑在编译运行后出现一堆乱码,在编译指令的后面加一句 -fexec-charset=gbk
即可,例如:
$ g++ 猜数游戏.cpp -o 猜数游戏.exe -fexec-charset=gbk
运行效果如下(我这里设置成了楷体,感觉会好看些):
这里的操作也很直白,直接按照要求输入即可。
介绍一下规则:
猜数规则:对于每一个输入的数,系统会判定与目标数的大小关系。
比较方式:以猜数次数为第一关键字,时间为第二关键字。
单人游戏:系统生成随机数,选手来猜测目标数,可多次游戏,系统按比较方式取最大值。
双人游戏:每一回合中两人互相出题,让对方猜这个数。
如果多次游戏,每一回合次数累加,时间累加,最后按上述方式比较谁获胜。
这种方式既考验每个人对对手的判断,也考验自己的猜数能力。
多人游戏:每个选手轮流猜数,目标数都为系统随机数,最后按照比较方式排名。
PS:一般使用二分法猜数,出题可以出负数(这一点坑人非常好用)
实际上不管按照那种方式游戏,都有点考验运气。但是,这对于每个人都是公平的,所以方法还是第一位的。
我个人推荐玩双人游戏,这样更考验实力。