命令行人机对战五子棋.docx
- 文档编号:8309737
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:16
- 大小:16.99KB
命令行人机对战五子棋.docx
《命令行人机对战五子棋.docx》由会员分享,可在线阅读,更多相关《命令行人机对战五子棋.docx(16页珍藏版)》请在冰豆网上搜索。
命令行人机对战五子棋
////////////main.cpp
#include
#include
#include
#include"point.h"
#include"vertical.h"
#include"horizontal.h"
usingnamespacestd;
constintx=20;
constinty=20;
intMARK[]={0,1,10,100,1000,10000};
voidpeopleA(char(*flag)[y],vector
voidBegin(char(*flag)[y],vector
intworkOutGains(inti,vector
//初始化容器
voidinintVecQ(vector
{
for(inti=0;i for(intj=0;j vec.push_back(point(flag[i][j],i,j)); } //初始化棋盘 voidinit(char(*flag)[y]) { intnumbleW[y]; intnumbleH[x]; for(inti=0;i numbleW[i]=i; for(inti=0;i numbleH[i]=i; for(inti=0;i { cout< (2)< if(i==0) { for(intk=0;k { cout< } cout< cout<<""<<0; } for(intj=0;j { flag[i][j]='|'; cout<<"--"; cout< } cout< } } //画出指定棋盘 voiddraw(char(*flag)[y]) { intnumbleW[y]; intnumbleH[x]; for(inti=0;i numbleW[i]=i; for(inti=0;i numbleH[i]=i; for(inti=0;i { cout< (2)< if(i==0) { for(intk=0;k { cout< } cout< cout<<""<<0; } for(intj=0;j { cout<<"--"; cout< } cout< } } //判断输入坐标是否合法 boolcheck(inti,intj,char(*flag)[y]) { if(i<0||i>=x||j<0||j>=y) { cout<<"输入坐标不合法! 请重新输入! "< return0; } else { if(flag[i][j]=='X'||flag[i][j]=='O') { cout<<"该点已存在棋子,请重新输入! "< return0; } else { returntrue; } } } //判断是否胜利 booltest(char(*flag)[y],charc) { for(inti=0;i for(intj=0;j { if((c==flag[i][j]&&c==flag[i+1][j]&&c==flag[i+2][j]&&c==flag[i+3][j]&&c==flag[i+4][j]) ||(c==flag[i][j]&&c==flag[i][j+1]&&c==flag[i][j+2]&&c==flag[i][j+3]&&c==flag[i][j+4]) ||(c==flag[i][j]&&c==flag[i+1][j+1]&&c==flag[i+2][j+2]&&c==flag[i+3][j+3]&&c==flag[i+4][j+4])) { return1; } } return0; } //电脑出棋 voidcomputer(char(*flag)[y],vector { for(inti=0;i<399;++i) { if(vec[i].c=='|') vec[i].gains=workOutGains(i,vec); } intgain=vec[0].gains; intxx,yy; for(inti=1;i<=399;++i) { if(vec[i].c=='|') if(vec[i].gains>gain) { gain=vec[i].gains; xx=vec[i].h; yy=vec[i].w; } else { continue; } else { continue; } } flag[xx][yy]='O'; draw(flag); vec[xx*20+yy].c='O'; if(test(flag,'O')) { charf; cout<<"电脑胜利! 是否再来一局: 【Y】|【N】? "< cin>>f; if(f=='Y'||f=='y') Begin(flag,vec); } else { peopleA(flag,vec); } } //玩家B走棋 voidpeopleB(charflag[x][y],vector { inti,j; cout<<"玩家B出棋,请输入坐标: "< cin>>i>>j; while(! check(i,j,flag)) { cin>>i; cin>>j; } if(check(i,j,flag)) { flag[i][j]='O'; draw(flag); } if(test(flag,'O')) { charf; cout<<"玩家B胜利! 是否再来一局: 【Y】|【N】? "< cin>>f; if(f=='Y'||f=='y') Begin(flag,vec); } else { peopleA(flag,vec); } } //玩家A走棋 voidpeopleA(char(*flag)[y],vector { inti,j; cout<<"玩家A出棋,请输入坐标: "< cin>>i>>j; while(! check(i,j,flag)) { cin>>i; cin>>j; } if(check(i,j,flag)) { flag[i][j]='X'; draw(flag); vec[i*20+j].c='X'; } if(test(flag,'X')) { charf; cout<<"玩家A胜利! 是否再来一局: 【Y】|【N】? "< cin>>f; if(f=='Y'||f=='y') Begin(flag,vec); } else { computer(flag,vec); } } //开始游戏 voidBegin(char(*flag)[y],vector { init(flag);//初始化棋盘 inintVecQ(vec,flag);//初始化容器信息 peopleA(flag,vec); } //计算某点的收益 intworkOutGains(inti,vector { intm=MARK[horizontal(i,'O',vec)]+MARK[vertical(i,'O',vec)]+ MARK[slant(i,'O',vec)]+MARK[Rslant(i,'O',vec)]+ MARK[horizontal(i,'X',vec)]+MARK[vertical(i,'X',vec)]+ MARK[slant(i,'X',vec)]+MARK[Rslant(i,'X',vec)]; returnm; } intmain() { charflag[x][y]; vector Begin(flag,vectorQ); //for(inti=0;i //for(intj=0;j //{ //flag[i][j]='|'; //vectorQ.push_back(point(flag[i][j],i,j)); //} //vectorQ[21].c='O'; //cout< ////cout< system("pause"); return0; } /////////////point.h #ifndefPOINT_H #definePOINT_H classpoint { public: point(){}; point(charthec,intxx,intyy): c(thec),h(xx),w(yy),gains(0){} charc; intgains,h,w;//分别为该点的收益值和坐标 ~point(){}; }; #endif /////////horizontal.h #ifndefHORIZONTAL_H #defineHORIZONTAL_H #include"point.h" #include usingnamespacestd; //判断水平状态 inthorizontal(inti,charc,vector { intj,k; for(j=i-1;vec[j+1].w>0&&vec[j].c==c;--j) {} for(k=i+1;vec[k-1].w<19&&vec[k].c==c;++k) {} intm=k-j-1; if(vec[j+1].w==0) { if(vec[k].c=='|') returnm-1;// else { return0; } } elseif(vec[k-1].w==19) { if(vec[j].c=='|') returnm-1; else { return0; } } else { if(vec[j].c=='|'&&vec[k].c=='|') returnm; else { return0; } } } //判断正斜状态 intslant(inti,charc,vector { intj,k,m; for(j=i-1-20;vec[j+1+20].w>0&&vec[j+1+20].h>0&&vec[j].c==c;j=j-1-20) {} for(k=i+1+20;vec[k-1-20].w<19&&vec[k-1-20].h<19&&vec[k].c==c;k=k+1+20) {} m=(k-j)%20-1; if(vec[j+1+20].w==0||vec[j+1+20].h==0) { if(vec[k-1-20].w==19||vec[k-1-20].h==19) { return0; } elseif(vec[k].c=='|') { returnm-1; } else { return0; } } elseif(vec[j].c=='|') { if(vec[k-1-20].w==19||vec[k-1-20].h==19) returnm-1; elseif(vec[k].c=='|') returnm; else { returnm-1; } } else { if(vec[k-1-20].w==19||vec[k-1-20].h==19) return0; elseif(vec[k].c=='|') returnm-1; else { return0; } } } #endif //////vertical.h #ifndefVERTICAL_H #defineVERTICAL_H #include #include"point.h" usingnamespacestd; //判断纵向状态 intvertical(inti,charc,vector { intj,k; for(j=i-20;j>=0&&vec[j].c==c;j=j-20) {} for(k=i+20;k<=399&&vec[k].c==c;k=k+20) {} intm=(k-j)/20-1; if(j<0) { if(vec[k].c=='|') returnm-1; else { return0; } } elseif(k>399) { if(vec[j].c=='|') returnm-1; else { return0; } } else { if(vec[j].c=='|'&&vec[k].c=='|') returnm; else { returnm-1; } } } //判断反斜状态 intRslant(inti,charc,vector { intj,k,m; for(j=i+1-20;vec[j+20-1].h>0&&vec[j+20-1].w<19&&vec[j].c==c;j=j+1-20) { } for(k=i-1+20;vec[k+1-20].h<19&&vec[k+1-20].w>0&&vec[k].c==c;k=k-1+20) { } m=(k-j)/19-1; if(vec[j+20-1].h==0||vec[j+20-1].w==19) { if(vec[k].c=='|') returnm-1; else { return0; } } else { if(vec[j].c=='|') { if(vec[k+1-20].h==19||vec[k+1-20].w==0) returnm-1; elseif(vec[k].c=='|') returnm; else { returnm-1; } } else { if(vec[k].c=='|') returnm-1; else { return0; } } } } #endif
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 命令行 人机 五子棋
![提示](https://static.bdocx.com/images/bang_tan.gif)