自己动手完成制作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;
}

点赞