C++语言设计实现五子棋

2020-01-06 19:33:36王旭

主函数,应该再定义game类进行优化,不过设计的时候没有考虑周全,还是按照C的思想写了。


#include "ai.h"
#include <stdlib.h>


int main()
{
 system("mode con cols=150 lines=150 ");
 system("color 27");
 chessboard bd;
 chess now;
 result final;
 int mode;
 gps(5,40,"==============欢迎使用简易五子棋!==============");
 gps(10,50,">>>>输入1或2进行模式选择<<<<");
 gps(11,50,"   <1> 双人对战 ");
 gps(12,50,"   <2> 人机对战 ");
 do{
 cout<<endl<<"                 input mode:";
 cin>>mode;
 }while(mode != 1 && mode != 2);
 
 //双人对战
 if (mode==1)
 {
loop1: now.set_color(black);//执黑先行
 bd.clear();
 bd.display(); //初始化棋盘
 setpos(110,0);
 cout<<"对局开始,黑旗先行";
 //循环判断上一次落子结果,收集下一次输入,直到棋局出结果
 do{ 
 now.set_point();//输入
 final=bd.judge(now);
 //判断是否违规
 while(final==error)//犯规输入则重新输入
 {
  system("cls");
  bd.display();
  setpos(110,10);
  cout<<"犯规(输入坐标已有棋子)!";
  now.set_point();
  final=bd.judge(now);
 }
 //正确落子后更新棋盘
 bd.update(now);
 bd.display();
 //反转下一步走棋的颜色
 if(now.get_color()==black)
  now.set_color(white);
  else
  now.set_color(black);
 
 }while(final==go_on);
 switch (final)
 {
 case go_on:
  break;
 case error:
  break;
 case draw:
  setpos(110,10);
  cout<<"平局:游戏结束";
  break;
 case black_win:
  setpos(110,10);
  cout<<"黑旗获胜:游戏结束";
  break;
 case white_win:
  setpos(110,10);
  cout<<"白旗获胜:游戏结束";
  break;
 default:
  break;
 }
 setpos(110,11);
 cout<<"是否继续下一局?Y/N";
 char flag;
 cin>>flag;
 if(flag == 'Y')
  goto loop1;
 }
 if(mode == 2)
 {
 chess ai_ch;
 system("cls");
 gps(5,40,"==============欢迎使用简易五子棋!==============");
 gps(10,50,">>>>输入1或2进行模式选择<<<<");
 gps(11,50,"   <1> 执黑先行 ");
 gps(12,50,"   <2> 执白后行 ");
 do{
  cout<<endl<<"                 input mode:";
  cin>>mode;
 }while(mode != 1 && mode != 2);
 if(mode == 1)
 {
loop2: now.set_color(black);//执黑先行
  bd.clear();
  bd.display(); //初始化棋盘
  Ai afago(bd,white);
  setpos(110,0);
  cout<<"对局开始,请您落子";
  now.set_point();
  bd.update(now);
  ai_ch.set_color(white);
  ai_ch.set_point(left(now.drop_point(),false));
  bd.update(ai_ch);
  bd.display();
  //循环判断上一次落子结果,收集下一次输入,直到棋局出结果
  do{ 
  now.set_point();//输入
  final=bd.judge(now);
  //判断是否违规
  while(final==error)//犯规输入则重新输入
  {
   system("cls");
   bd.display();
   setpos(110,10);
   cout<<"犯规(输入坐标已有棋子)!";
   now.set_point();
   final=bd.judge(now);
  }
  //正确落子后更新棋盘
  bd.update(now);
  if(final != black_win)
  {
   ai_ch=afago.set_chess();
   final=bd.judge(ai_ch);
   bd.update(ai_ch);
   bd.display();
  }else{bd.display();}
  }while(final==go_on);
  switch (final)
  {
  case go_on:
   break;
  case error:
   break;
  case draw:
   setpos(110,10);
   cout<<"平局:游戏结束";
   break;
  case black_win:
   setpos(110,10);
   cout<<"恭喜您棋艺高超,战胜了AI:游戏结束";
   break;
  case white_win:
   setpos(110,10);
   cout<<"电脑获胜,请继续努力提高自己:游戏结束";
   break;
  default:
   break;
  }
  setpos(110,11);
  cout<<"是否继续下一局?Y/N";
  char flag;
  cin>>flag;
  if(flag=='Y')
  goto loop2;
 }
 if(mode == 2)
 {
loop3: ai_ch.set_color(black);//AI执黑先行
  now.set_color(white);
  bd.clear(); //初始化棋盘
  Ai afago(bd,black);
  ai_ch.set_point(7,7);
  bd.update(ai_ch);
  bd.display(); 
  setpos(110,0);
  cout<<"对局开始,请您落子";
  //循环判断上一次落子结果,收集下一次输入,直到棋局出结果
  do{ 
  now.set_point();//输入
  final=bd.judge(now);
  //判断是否违规
  while(final==error)//犯规输入则重新输入
  {
   system("cls");
   bd.display();
   setpos(110,10);
   cout<<"犯规(输入坐标已有棋子)!";
   now.set_point();
   final=bd.judge(now);
  }
  //正确落子后更新棋盘
  bd.update(now);
  if(final != white_win)
  {
  ai_ch=afago.set_chess();
  final=bd.judge(ai_ch);
  bd.update(ai_ch);
  bd.display();
  }else{bd.display();}
  }while(final==go_on);
  switch (final)
  {
  case go_on:
   break;
  case error:
   break;
  case draw:
   setpos(110,10);
   cout<<"平局:游戏结束";
   break;
  case white_win:
   setpos(110,10);
   cout<<"恭喜您棋艺高超,战胜了AI:游戏结束";
   break;
  case black_win:
   setpos(110,10);
   cout<<"电脑获胜,请继续努力提高自己:游戏结束";
   break;
  default:
   break;
  }
  setpos(110,11);
  cout<<"是否继续下一局?Y/N";
  char flag;
  cin>>flag;
  if(flag=='Y')
  goto loop3;
 }
 }
 return 0;
 
}