主函数,应该再定义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;
}










