猜数字游戏实现

一、具体实现代码

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





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值