【C++小游戏】猜数游戏

这是我一年前写的代码了,现在把它展示出来。
由于是一年前的东西,所以界面和推箱子没法比 (但还是能看)
将以下代码在 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:一般使用二分法猜数,出题可以出负数(这一点坑人非常好用)

实际上不管按照那种方式游戏,都有点考验运气。但是,这对于每个人都是公平的,所以方法还是第一位的。
我个人推荐玩双人游戏,这样更考验实力。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值