C++实现“23”抽签小游戏

开发工具与关键技术:VS 2015,C++ 基础

撰写时间:2019-05-08

“23”游戏为老师布置的作业,其规则如下:
“23” 游戏是一个双人游戏,道具是23根牙签,玩家轮流去1,2或3根牙签。拿到最后一根牙签的是输家。写程序和计算机玩“23”。总是玩家先走,轮到计算机时,它根据以下规则采取行动:

a.如果剩余多于4根,计算机就取走4-x根,x为玩家上次取走的牙签数
b.如果剩余2-4根牙签,计算机取走足够多的牙签,确保只剩1根
c.如果剩余1根牙签,计算机只能取走它并它并认输

玩家输入要取走的牙签数量时,程序应对输入的有效性进行检查。要确定玩家输入的数在1到3之间,而且试图取走的不能超过当前剩余的。

其实现代码如下:

#include<iostream>
#include<time.h>
#include<string>
using namespace std;

//游戏规则:拿到最后一根牙签的人 输

unsigned int total = 23;//牙签总数
unsigned int player_Count = 0;//玩家抽走牙签的数量
unsigned int computer_Count = 0;//计算机抽走牙签的数量
bool whoIsGo = 0;// 0 :计算机,1:玩家   

void player();//验证玩家输入有效性
void computer();//电脑判断规则抽取牙签
void checkWin();//判断输赢

void main()
{
   player();//玩家先操作
   //computer();//电脑先操作
}
验证玩家输入有效性
//验证玩家输入有效性
void player()
{
  whoIsGo = 1;//修改是玩家在玩

  unsigned int myCin = 0;//暂时存放我的输入值
  string s;//将输入的一堆字母数字符号组合 赋值给 s,达到清空输入流的目的

  cout << "请【玩家】输入想抽取牙签的数量:";
  cin >> myCin; cout << endl;		
  	
  if (cin.fail())//输入验证还是有问题,乱输还是有问题,如果输入数字在前字母在后,仍多次只读取数字
  {
  	cout << "输入无效!" << endl << endl;

  	//清空输入流缓存
  	cin.clear();//重置cin状态
  	cin.sync();
  	cin >> s;//将输入的一堆字母数字符号组合 赋值给 s,达到清空输入流的目的
  	player();//重新进入方法,再次输入
  }
  else
  {
  	player_Count = myCin;//输入正确,获取输入值
  	if ((player_Count > 3) || (player_Count < 1))
  	{
  		cout << "【玩家】每次只能抽取 1 至 3 根牙签!" << endl << endl;
  		player();//重新进入方法,再次输入
  	}
  	else if (player_Count > total)
  	{
  		cout << "【玩家】抽取的数量不能超过当前剩余的!" << endl << endl;
  		player();//重新进入方法,再次输入
  	}
  	else
  	{
  		total -= player_Count;//牙签数量减去玩家抽取的数量	
  		checkWin();//检查输赢
  	}
  }	
}

电脑判断规则抽取牙签
//电脑判断规则抽取牙签
void computer()
{
   whoIsGo = 0;//修改是计算机在玩
   if (total > 4)
   {
   		if (player_Count > 0)
   		{
   			computer_Count = 4 - player_Count; // 电脑抽取数量
   		}
   		else//在换成电脑先玩的情况下
   		{
   			srand(time(0));
   			const int randd = rand() % 3;
   			cout << randd;
   			if (randd == 0)
   			{ 
   				computer_Count = 3; 
   			}
   			else 
   			{ 
   				computer_Count = randd;
   			}
   		}
   		total -= computer_Count;//牙签数量减去电脑抽取数量
   		cout << "【计算机】抽取了 " << computer_Count << " 根牙签!" << endl << endl;
   }
   else if ((total > 2) || (total < 4))
   {
   		computer_Count = total - 1;
   		total = 1;//牙签数量减去电脑抽取数量
   		cout << "【计算机】抽取了 " << computer_Count << " 根牙签!" << endl << endl;
   }
   else
   {		
   }
   checkWin();
}

判断输赢
//判断输赢
void checkWin()
{
	cout << "剩余牙签数:" << total << endl << endl;
	if (total == 1)
	{
		if (whoIsGo == 1) {
			cout << "【计算机】拿走了最后一根牙签!!!" << endl << endl;
			cout << "【玩家】赢了!" << endl;
			cout << "【计算机】输了!" << endl << endl;
		}
		else
		{
			cout << "【玩家】只剩最后一根牙签了!!!" << endl << endl;
			cout << "【玩家】输了!" << endl;
			cout << "【计算机】赢了!" << endl << endl;
		}
		return;
	}
	else if (total == 0)//只有玩家会手贱拿走最后一根
	{
		cout << "【玩家】拿走了最后一根牙签!!!" << endl << endl;
		cout << "【玩家】输了!" << endl;
		cout << "【计算机】输了!" << endl << endl;
		return;
	}
	else
	{
		//继续往下执行
		if (whoIsGo == 0) //计算机在走
		{
			player();//玩家走
		}
		else
		{
			computer();//计算机走
		}
	}
实现效果

在这里插入图片描述
以上内容如有不正确的地方,或者有更好的方案,还请提出。
感谢您的浏览。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值