抢火柴游戏

一个游戏,规则如下:

一共30根火柴,由甲乙两依次取火柴,每次至少取一根,最多取两根,谁抢到最后一根就胜出。

设计一个机器和人玩的游戏。

策略:要抢到30,必须先抢到27,要抢到27,必须先抢到24,要抢到24 ,必须先抢到21,因此谁能拿到3的倍数谁赢。

就本题而言,谁先拿谁不利

设计:

让人选择谁先拿?

机器选择的策略是

如果剩余火柴数%3==0,随机拿1或2根

否则拿剩余火柴数%3根。

v 1、让人选择谁先拿?

› 从键盘输入谁先拿,如0代表计算机先拿,1代表人先拿,如果输入的是非法数字,做相应提示,并循环重输。

› 2、拿的过程是一个循环,在循环过程中,如果剩余根数为0,终止循环,并给出相应提示。

循环内部

v 2、如果人先拿

› 1)每次人拿时,人为输入1或2,同时要保证拿的数量要小于或等于剩余的数量,如果输入数字不合法,做相应提示,并循环重输。

› 2)每次拿时,提示用户还剩余多少根,人每拿一次(从键盘输入),火柴根数减少。

› 3)如果火柴减少到0根,那么人赢了,提示。break结束游戏。

› 4)轮到计算机拿,采用随机的方式,

v 所拿根数=rand( )%2 + 1

› 5)计算机每拿一次,火柴根数减少。

› 6)如果火柴减少到0根,那么计算机赢了,提示, break结束游戏。

循环内部

v 2、如果计算机先拿

› 1)计算机拿,采用随机的方式,所拿根数=rand( )%2 + 1

› 2)每次拿时,提示还剩余多少根,

› 3)计算机每拿一次,火柴根数减少。

› 4)如果火柴减少到0根,那么计算机赢了,提示, break结束游戏。

› 5)轮到人拿,每次人拿时,提示剩余根数多少,再人为输入1或同时要保证拿的数量要小于或等于剩余的数量,如果输入数字不合法,做相应提示,并循环重输。

› 6)人每拿一次(从键盘输入),火柴根数减少。

› 如果火柴减少到0根,那么人赢了,提示。break结束游戏。

cpp 复制代码
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
	int n=30;
	int youtake, computertake;
	int input;
	srand((unsigned)time(NULL));
	cout << "输入1则人先拿火柴,输入0则计算机先拿火柴,请输入你的选择:";
	do {

		cin >> input;		
		if (input != 1 && input != 0)
		{
			cout << "请输入1或0!" << endl;
			cout << "输入1则人先拿火柴,输入0则计算机先拿火柴,请输入你的选择:";
		}
	} while (input != 1 && input != 0);
	//选择人先拿火柴
	if (input == 1)
	{
		while (1)
		{
			cout << "剩余火柴数量:" << n << endl;
			cout << "本轮你要拿走多少根火柴?请输入:";
			do {
				cin >> youtake;
				if (youtake != 1 && youtake != 2)
				{
					cout << "注意:每次至少取一根,最多取两根!";
					cout << "本轮你要拿走多少根火柴?请输入:";
				}
			} while (youtake != 1 && youtake != 2);
			n = n - youtake;
			if (n == 0)
			{
				cout << endl;
				cout << "恭喜你,赢得本次抢火柴游戏!"; break;
			}
			else if (n % 3 == 0)
			{
				computertake = rand() % 2 + 1;
				cout << "本轮计算机拿走的火柴数量:" << computertake<<endl;
				cout << endl;
			}
			else
			{
				computertake = n % 3;
				cout << "本轮计算机拿走的火柴数量:" << computertake << endl;
				cout << endl;
			}
			n = n - computertake;
			if (n == 0)
			{
				cout << "很遗憾,你输了,本次抢火柴游戏计算机取得胜利!"; break;
			}
		}
	}
	//选择计算机先拿火柴
	else
	{
		while (1)
		{
			if (n % 3 == 0)
			{
				computertake = rand() % 2 + 1;
				cout << "本轮计算机拿走的火柴数量:" << computertake << endl;
				cout << endl;
			}
			else
			{
				computertake = n % 3;
				cout << "本轮计算机拿走的火柴数量:" << computertake << endl;
				cout << endl;
			}
			n = n - computertake;
			if (n == 0)
			{
				cout << "很遗憾,你输了,本次抢火柴游戏计算机取得胜利!"; break;
			}
			cout << "剩余火柴数量:" << n << endl;
			cout << "本轮你要拿走多少根火柴?请输入:";
			do {
				cin >> youtake;
				if (youtake != 1 && youtake != 2)
				{
					cout << "注意:每次至少取一根,最多取两根!";
					cout << "本轮你要拿走多少根火柴?请输入:";
				}
			} while (youtake != 1 && youtake != 2);
			n = n - youtake;
			if (n == 0)
			{
				cout << endl;
				cout << "恭喜你,赢得本次抢火柴游戏!"; break;
			}
		}
	}
	return 0;
}
相关推荐
Tairitsu_H1 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划
凯瑟琳.奥古斯特1 小时前
动态调优IoU提升OCR文本合并精度
开发语言·python·算法
布莱克6052 小时前
A* 算法详解:从原理到实现
开发语言·c++·算法
多弗朗皮卡丘2 小时前
C++ 智能指针
开发语言·c++·c++11·智能指针
段一凡-华北理工大学2 小时前
高炉炼铁机器视觉与智能识别十八讲~系列文章15:可靠性篇:防误报、容错与识别系统的鲁棒性设计
人工智能·算法·机器学习·高炉大模型·高炉机器视觉·高炉炼铁模型开发
进化中的刀盾兽2 小时前
从零实现 C++ AI 大模型接入 SDK(十):SessionManager 会话管理与多轮对话实现
c++
小成202303202652 小时前
C++~02运算符重载
开发语言·c++
某林2122 小时前
局部路径规划器 DWB:速度采样与评分权重的取值分析
人工智能·算法·架构·机器人·技术复盘
AI职业加油站2 小时前
模数共振行动解读|大模型应用工程师证书,匹配行业 RAG/Agent 落地人才需求
人工智能·学习·算法·职场和发展·职场发展
郑同学的笔记3 小时前
【c++随笔30】C++ 注册回调函数
开发语言·c++