命令行人机对战五子棋.docx
《命令行人机对战五子棋.docx》由会员分享,可在线阅读,更多相关《命令行人机对战五子棋.docx(16页珍藏版)》请在冰豆网上搜索。
![命令行人机对战五子棋.docx](https://file1.bdocx.com/fileroot1/2023-1/28/39d5560f-51ab-4372-8f63-b8f005910fed/39d5560f-51ab-4372-8f63-b8f005910fed1.gif)
命令行人机对战五子棋
////////////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&vec);
voidBegin(char(*flag)[y],vector&vec);
intworkOutGains(inti,vector&vec);
//初始化容器
voidinintVecQ(vector&vec,char(*flag)[y])
{
for(inti=0;ifor(intj=0;jvec.push_back(point(flag[i][j],i,j));
}
//初始化棋盘
voidinit(char(*flag)[y])
{
intnumbleW[y];
intnumbleH[x];
for(inti=0;inumbleW[i]=i;
for(inti=0;inumbleH[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;inumbleW[i]=i;
for(inti=0;inumbleH[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;ifor(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&vec)
{
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&vec)
{
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&vec)
{
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&vec)
{
init(flag);//初始化棋盘
inintVecQ(vec,flag);//初始化容器信息
peopleA(flag,vec);
}
//计算某点的收益
intworkOutGains(inti,vector&vec)
{
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];
vectorvectorQ;//定义棋盘信息容器
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&vec)
{
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&vec)
{
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&vec)
{
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&vec)
{
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