猜数字游戏实现

来源:互联网 发布:python mud游戏 编辑:程序博客网 时间:2024/05/09 10:59

一、具体实现代码

头文件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++;}elsefor(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;}