C++ 实现人机对弈四子棋

编写一个"人机对弈"的下棋程序,四个棋子连成一线即为赢。人走棋的合法输入为0-6。棋盘是垂直放置,棋子落到底部。

程序功能参考可执行程序game1.exe
说明:这个程序可以选择是计算机先走还是人先走,我们的作业不要求这样,固定为人先走,计算机后走即可

程序结构可以参考如下结构,也可以按自己思路。

class game//这是个抽象类,抽象的是所有人走一步,计算机走一步的对弈游戏
    {
    public:
  enum who { HUMAN, NEUTRAL, COMPUTER }; 
 
  game( ) { move_number = 0; }
  virtual ~game( ) { }
  who play( );   //人先走,计算机后走,返回值是游戏的赢者,后面给出了此函数的定义
    protected:
        //以下虚函数可以被覆盖,也可以不被覆盖
  virtual void display_message(const string& message)const;//在屏幕显示信息message
             virtual int get_user_move( )const;       // 输出"Your move,please:",然后接受用户输入,并将输入返回
  virtual who last_mover( ) const 
   { return (move_number % 2 == 1 ? HUMAN : COMPUTER); }
  virtual int moves_completed( ) const { return move_number; }
  virtual who next_mover( ) const
   { return (move_number % 2 == 0 ? HUMAN : COMPUTER); }
  
        // 以下虚函数必须被覆盖
     virtual void make_move(const int& move)//将棋子真正下到棋盘上,此函数被子类覆盖
       { ++move_number; }
     virtual void restart( ) { move_number = 0; }//开始新的棋局

        //以下为纯虚函数 
        virtual who winning( )const =0;        //返回胜利者 
     virtual void display_status( )  = 0;   //显示游戏棋盘的当前状态
     virtual bool is_game_over( )  = 0;     //如果游戏结束,返回真
    virtual bool is_legal(const int& move)  = 0;   //如果给定走法为合法,就返回真
        virtual void make_computer_move( )=0;    //计算计算机所有的可能的走法,选出一种最好的,并调用make_move(best_move)
      
 private:
  int move_number; //当前已走的步数
  void make_human_move( );   //调用 get_user_move( ),并用is_legal(move)判断是否合法输入,若是则调用make_move(move)
    };

class c4 : public game//这个类是我们具体要实现的“四子棋”
    {
    public:
     c4( ) {restart( );}
    protected:
  
                virtual void make_move(const int& move); // 修改data[][],many_used[]和most_recent_column的值,并调用game::make_move(move)
  virtual void restart( );    //将data[6][7]各元素置为NEUTRAL,将many_used[7]各元素置为0 ,再调用game::restart();
         virtual game::who winning( )const ;
         virtual void display_status( ) ;  //显示棋盘的状态
  virtual bool is_game_over( ) ;
  virtual bool is_legal(const int& move) ; 
  virtual void make_computer_move( );       
    private:       
  who data[6][7];   //6行7列,表示棋盘
  int many_used[7]; //表示各列中已有多少个棋子
  int most_recent_column;  //最近下的棋子在哪列
    };

//人先走,计算机后走,返回值是游戏的赢者
game::who game::play()
{
 restart();
 
 while(!is_game_over())
 {
  display_status(); 
 
  if(last_mover()==COMPUTER)
   make_human_move();
  else
   make_computer_move();
 }
 display_status();
 return winning();
}
        
void main()
{
 c4 instance;
 game::who winner;
 winner=instance.play();
 switch(winner)
 {
  case c4::HUMAN: cout<<"You win!"<<endl;break;
  case c4::COMPUTER: cout<<"I win!"<<endl;break;
  case c4::NEUTRAL: cout<<"A draw"<<endl;break;
 }
}
 
 

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。