一、具体实现代码
头文件GuessNumber.h
#ifndef GUESSNUMBER_H_INCLUDED
#define GUESSNUMBER_H_INCLUDED
#include <cstdlib>
#include <iostream>
using namespace std;
class GuessNumber
{
public:
GuessNumber();
virtual ~GuessNumber();
void GameBegin();
void Output();
void Out();
void Input();
private:
bool Init();
int GetReplyManu(int *list);
int GetReplyAuto(int *list);
void Perm(int list[],int k,int m);
inline void Swap(int &a , int &b);
int nGnum;
int nNum;
int **pNum;
int *nTag;
int nTimes;
int nTotal;
};
#endif // GUESSNUMBER_H_INCLUDED
源文件 GuessNumber.cpp
#include "GuessNumber.h"
int nflag = 0;
GuessNumber::GuessNumber()
{
nGnum = 0;
nNum = 0;
pNum = NULL;
nTimes = 0;
nTotal = 0;
nTag = NULL;
}
GuessNumber::~GuessNumber()
{
int i;
for(i = 0;i < nTotal;i++)
delete [] pNum[i];
delete[] pNum;
pNum = NULL;
delete[] nTag;
nTag = 0;
}
bool GuessNumber::Init()
{
nTotal = 1;
int i = 0;
for(i = nNum;i > 0;i--)
nTotal *= i;
pNum = new int*[nTotal];
for(i = 0;i < nTotal;i++)
pNum[i] = new int[nNum];
int *list = new int[nNum];
for (i = 0;i < nNum;i++)
list[i] = i + 1;
Perm(list,0,nNum-1);
delete[] list;
return true;
}
void GuessNumber::Perm(int list[] ,int k,int m)
{
int i;
if(k == m)
{
for(i = 0;i <= m;i++)
pNum[nflag][i] = list[i];
nflag++;
}
else
for(i = k;i <= m;i++)
{
Swap(list[k],list[i]);
Perm(list,k + 1,m);
Swap(list[k],list[i]);
}
}
inline void GuessNumber::Swap(int& a,int& b)
{
int t = a;
a = b;
b = t;
}
int GuessNumber::GetReplyAuto(int *list)
{
int n = 0,i = 0;
for(i = 0;i < nNum;i++)
if(list[i] == nTag[i]) n++;
return n;
}
int GuessNumber::GetReplyManu(int *list)
{
int i,n;
cout<<"The number is: ";
for(i = 0;i < nNum;i++)
cout<<list[i];
cout<<" ?"<<endl;
cin>>n;
return n;
}
void GuessNumber::Output()
{
}
void GuessNumber::Input()
{
bool *b;
int i,t;
cout<<"Please input the number of digit: ";
cin>>nNum;
nTag = new int[nNum];
b = new bool[nNum + 1];
for(i = 1;i <= nNum;i++)
b[i] = false;
while(true)
{
cout<<"Please input the number you need me to guess:"<<endl;
cin>>nGnum;
t = nGnum;
for(i = 0;i < nNum;i++)
{
nTag[nNum-i-1] = t%10;
if(b[t%10])
{
cout<<"Duplicate digits exist."<<endl;
break;
}
else b[t%10] = true;
t /= 10;
}
if(i == nNum) break;
for(i = 1;i <= nNum;i++)
b[i] = false;
}
}
void GuessNumber::Out()
{
int i = 0,j = 0;
for(i = 0;i < nTotal ;i++)
{
for(j = 0;j < nNum ;j++)
cout<<pNum[i][j]<<" ";
cout<<endl;
}
cout<< nTotal<<endl;
for(i = 0;i < nNum ;i++)
cout<<nTag[i]<<" ";
cout<<endl<<endl;
}
void GuessNumber::GameBegin()
{
Input();
Init();
//Out();
int *nTemp[20];
int i,j,k,t = 1,m;
for(i = 0;i < 10;i++)
nTemp[i] = new int[nNum + 1];
for(i = 0;i < nNum;i++)
nTemp[0][i] = pNum[0][i];
char flag;
do
{
cout<<"Do you want to play manually or automatically(m/a): ";
cin>>flag;
}while(flag != 'm' && flag != 'a');
if(flag == 'a')
nTemp[0][nNum] = GetReplyAuto(pNum[0]);
else
nTemp[0][nNum] = GetReplyManu(pNum[0]);
nTimes++;
for(i = 1;i < nTotal;i++)
{
for(j = 0;j < t;j++)
{ m = 0;
for(k = 0;k < nNum;k++)
{
if(pNum[i][k] == nTemp[j][k])
m++;
}
if(m != nTemp[j][nNum])
break;
}
if(j == t)
{
if(flag == 'a')
m = GetReplyAuto(pNum[i]);
else
m = GetReplyManu(pNum[i]);
nTimes++;
if(m > nTemp[t-1][nNum])
{
for(k = 0;k < nNum;k++)
nTemp[t][k] = pNum[i][k];
nTemp[t][nNum] = m;
t++;
}
if(m == nNum)
break;
}
}
cout<<"I asked you "<<nTimes<<" Times."<<endl;
/*cout<<"The numbers which I asked you list by follow:"<<endl;
for(i = 0;i < t ;i++)
{
for(j = 0;j < nNum ;j++)
cout<<nTemp[i][j];
cout<<endl;
}*/
cout<<"The tag number is: ";
for(i = 0;i < nNum ;i++)
cout<<nTemp[t-1][i];
cout<<endl;
for(i = 0;i < 10;i++)
{
delete[] nTemp[i];
nTemp[i] = NULL;
}
}
测试Main.cpp
#include "GuessNumber.h"
int main()
{
GuessNumber game;
game.GameBegin();
return 0;
}