自己动手完成制作nim石子问题(ps:在只有一堆的情况下)

关于问题的数学原理,可以参看布鲁迪Richard A.Brualdi)写的组合数学,这里不赘述,直接上代码,请指教

#include <iostream>
using namespace std;




int CpuNum(int EqualNum,int Sum)//转载请注明出处http://my.csdn.net/u010632868,CSDN 第25个比利
{
if(Sum % EqualNum == 0)
{
int Cpu = rand()%(EqualNum);
if(Cpu != 0)
{
return Cpu;
}
else
{
return Cpu+1;
}
}
else
{
return Sum - (Sum/EqualNum)*EqualNum;
}
}


int main()
{
//
//初始化过程
int Sum;
cout<<"请输入石子的总数 : "<<endl;
cin>>Sum;
while(Sum <= 0)
{
cout<<"输入错误,请重新输入"<<endl;
cin>>Sum;
}
int MaxNum;
cout<<"请输入允许的取石子的最大数量 (注意石子的数量应该大于等于2)"<<endl;
cin>>MaxNum;
while(MaxNum < 2)
{
cout<<"输入错误,请重新输入"<<endl;
cin>>MaxNum;
}
int EqualNum = MaxNum+1;
int BOOL;
cout<<"请选择先手还是后手,如果先手请输入‘1’,后手请输入‘0’"<<endl;
cin>>BOOL;
//初始化完成
//


//游戏开始//转载请注明出处http://my.csdn.net/u010632868,CSDN 第25个比利
int Game;
int Cpu;
if(BOOL)
{
while(true)
{
//玩家输入
cout<<"请选择你要取出的石子的数量"<<endl;
cin>>Game;
while(Game > MaxNum || Game < 1)
{
cout<<"输入错误,请重新输入"<<endl;
cout<<"请选择你要取出的球的数量"<<endl;
cin>>Game;
}
Sum-=Game;
cout<<"您选择取出的石子个数为 : "<<Game<<endl;
cout<<"当前还剩的石子的数量为 : "<<Sum<<endl;
cout<<endl;
if(Sum == 0)
{
cout<<"恭喜你您赢得了游戏胜利"<<endl;
break;
}


//电脑计算输入
Cpu = CpuNum(EqualNum,Sum);
Sum-=Cpu;
cout<<"电脑选择取出的石子个数为 : "<<Cpu<<endl;
cout<<"当前还剩的石子的数量为 : "<<Sum<<endl;
cout<<endl;
if(Sum == 0)
{
cout<<"很遗憾,您输了"<<endl;
break;
}
}
}
else//转载请注明出处http://my.csdn.net/u010632868,CSDN 第25个比利
{
while(true)
{
//电脑计算输入
Cpu = CpuNum(EqualNum,Sum);
Sum-=Cpu;
cout<<"电脑选择取出的石子个数为 : "<<Cpu<<endl;
cout<<"当前还剩的石子的数量为 : "<<Sum<<endl;
cout<<endl;
if(Sum == 0)
{
cout<<"很遗憾,您输了"<<endl;
break;
}

//玩家输入
cout<<"请选择你要取出的石子的数量"<<endl;
cin>>Game;
while(Game > MaxNum || Game < 1)
{
cout<<"输入错误,请重新输入"<<endl;
cout<<"请选择你要取出的球的数量"<<endl;
cin>>Game;
}
Sum-=Game;
cout<<"您选择取出的石子个数为 : "<<Game<<endl;
cout<<"当前还剩的石子的数量为 : "<<Sum<<endl;
cout<<endl;
if(Sum == 0)
{
cout<<"恭喜你您赢得了游戏胜利"<<endl;
break;
}
}
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值