#include <iostream.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include "Nim.h"
int Nim::rand_ab(int a, int b)
{
long ltime;
unsigned int seed;
ltime=time(NULL);
seed=(unsigned) ltime/2;
srand(seed);
return a+rand()%(b-a+1);
}
// 设置NMarbles数(在10~100之间)
// 设置人先手还是机器先手
// 设置机器与人对弈采用的方式(通过提示信息,由用户决定机器是否采用聪明方式)
void Nim::setNim()
{ char answer1[10];
NMarbles=rand_ab(10, 100);
cout<<"Do you want the computer to play in Smart mode?"<<endl;
cout<<"Enter: yes, no, or don't care):"<<endl;
if( rand_ab(0, 1))
HTurn=true;
else
HTurn=false;
cin>>answer1;
if(!strcmp(answer1,"yes" ))
SMode=true;
else
SMode=false;
gameStatus();
}
void Nim::playGame()
{
do
{
if (HTurn)
computerTurn();
else
humanTurn();
} while (!gameOver());
}
void Nim::humanTurn()
{
int n,m;
n= NMarbles/2;
cout<<"Please pick at least one marble, but no more than "<<n<<"marble(s):";
cin>>m;
while((m>n&&m!=1)||m<=0)
{
cout<<m<<"is invalid number,please enter again!"<<endl;
cout<<"Please pick at least one marble, but no more than"<<n<<"marble(s)";
cin>>m;
}
NMarbles=NMarbles-m;
gameStatus();
HTurn=true ;
}
void Nim::computerTurn()
{
int a=1,b=0,c,i,n;
if(SMode)
{
while(a<=NMarbles)
{ a=a*2; b++;
}
b=b-1;
a=1;
for(i=1;i<=b;i++)
a=a*2;
n=a-1;
if(b==3||b==7||b==15||b==31||b==63)
c=rand_ab(1, NMarbles/2);
else
c=NMarbles-n;//取走的
NMarbles=n;
cout<<"The Computer picks"<<c<<"marble(s)"<<endl;
gameStatus();
HTurn=false;
}
else
{
if( NMarbles==1)
i=1;
else
i=rand_ab(1, NMarbles/2);
NMarbles=NMarbles-i;
cout<<"The Computer picks"<<i<<"marble(s)"<<endl;
gameStatus();
if(NMarbles==0)
HTurn=false;
HTurn=false;
}
}
void Nim::gameStatus()
{
cout<<"Current pile size = "<< NMarbles << endl;
}
bool Nim::gameOver()
{
if (NMarbles>=1)
return false;
if (HTurn)
cout<<"Sorry. You lose.\n";
else
cout<<"You win.\n";
return true;
}