#include<iostream>
#include<vector>
#include<string>
#include<windows.h>
using namespace std;
void color(int x){
if(x>=0 & x<=15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
else{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
}
}
class qipan{
public:
int a[15][15];
qipan();
void paint1();
void play();
int AI();
int player(int,int,int);
int max1(int a1[4]);
int get1(int a1[4]);
int s;
int s1[2];
};
qipan::qipan(){ //棋盘类的构造函数
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
a[i][j]=0;
}
}
s=0;
s1[0]=-1;
s1[1]=-1;
}
int qipan::max1(int a1[4])
{
int temp=a1[0];
for(int i=1;i<4;i++)
if(a1[i]>temp)
{
temp=a1[i];
}
return temp;
}
int qipan::get1(int a1[4])
{
int temp=a1[0];
int tp1=1;
for(int i=1;i<4;i++)
if(a1[i]>temp)
{
temp=a1[i];
tp1=i+1;
}
return tp1;
}
void qipan::paint1() //绘制棋盘的函数
{
cout<<" ";
for(int i=0;i<15;i++)
{
if(i<=9){
cout<<i<<" ";
}
else
cout<<i<<"";
}
cout<<endl;
for(int i=0;i<15;i++)
{ if(i<=9){
cout<<i<<" ";
}
else
cout<<i<<" ";
for(int j=0;j<15;j++)
{
if(a[i][j]==0){
color(7);
cout<<"十";
}
else if(a[i][j]==1){
color(12); //显示红色棋子
cout<<"红";
}
else if(a[i][j]==2){
color(2); //显示蓝色棋子
cout<<"蓝";
}
}
cout<<endl;
}
}
int qipan::player(int x1,int y1,int z)
{
if(a[x1][y1]!=0){
cout<<"落子无效";
return 1;
}
a[x1][y1]=z;
//判断同一直线上位置是否有五子
int total=0;
for(int i=y1-1;i>=0;i--)
{
if(a[x1][i]==z)
total++;
else
break;
}
for(int i=y1+1;i<15;i++){
if(a[x1][i]==z)
total++;
else
break;
}
if(total>=4)
return 5; //获胜
//判断同一竖线上是否有五子
total=0;
for(int i=x1-1;i>=0;i--){
if(a[i][y1]==z)
total++;
else
break;
}
for(int i=x1+1;i<15;i++)
{
if(a[i][y1]==z)
total++;
else
break;
}
if(total>=4)
return 5; //获胜
//判断左斜线是否有五子
total=0;
for(int i=1;i<5;i++)
{
if(x1-i<0 || y1-i<0)
break;
if(a[x1-i][y1-i]==z)
total++;
else
break;
}
for(int i=1;i<5;i++){
if(x1+i>=15 || y1+i >=15)
break;
if(a[x1+i][y1+i]==z)
total++;
else
break;
}
if(total>=4)
return 5; //获胜
//判断右斜线是否有五子;
total=0;
for(int i=1;i<5;i++)
{
if(x1-i<0 || y1+i>=15)
break;
if(a[x1-i][y1+i]==z)
total++;
else
break;
}
for(int i=1;i<5;i++)
{
if(x1+i>=15 || y1-i<0)
break;
if(a[x1+i][y1-i]==z)
total++;
else
break;
}
if(total>=4)
return 5; //获胜
return 2; //落子有效,但未获胜
}
int qipan::AI(){
int t1=0;
// 判断自己有没有四子的情况
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
int total1=0;
int total2=0;
int total3=0;
int total4=0;
if(a[i][j]!=0)
continue;
for(int a1=1;a1<5;a1++) //判断水平线
{
if(j-a1<0)
break;
if(a[i][j-a1]==2)
total1++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(j+a1>=15)
break;
if(a[i][j+a1]==2)
total1++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断竖直部分
{
if(i-a1<0)
break;
if(a[i-a1][j]==2)
total2++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15)
break;
if(a[i+a1][j]==2)
total2++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断左斜线
{
if(i-a1<0 || j-a1<0)
break;
if(a[i-a1][j-a1]==2)
total3++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15 || j+a1>=15)
break;
if(a[i+a1][j+a1]==2)
total3++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断右斜线
{
if(i-a1<0 || j+a1>=15)
break;
if(a[i-a1][j+a1]==2)
total4++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15 || j-a1<0)
break;
if(a[i+a1][j-a1]==2)
total4++;
else
break;
}
int a1[4]={total1,total2,total3,total4};
int temp=max1(a1);
if(temp>=4)
{
a[i][j]=2;
// cout<<"AI已获胜";
return -1;
}
}
}
for(int i=0;i<15;i++) //判断对手是否有大于三子的情况
{
for(int j=0;j<15;j++)
{
int total1=0;
int total2=0;
int total3=0;
int total4=0;
if(a[i][j]==1 || a[i][j]==2)
continue;
for(int a1=1;a1<5;a1++) //判断水平线
{if(j-a1<0)
break;
if(a[i][j-a1]==1)
total1++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(j+a1>=15)
break;
if(a[i][j+a1]==1)
total1++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断竖直线
{
if(i-a1<0)
break;
if(a[i-a1][j]==1)
total2++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15)
break;
if(a[i+a1][j]==1)
total2++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断左斜线
{
if(i-a1<0 || j-a1<0)
break;
if(a[i-a1][j-a1]==1)
total3++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15 || j+a1>=15)
break;
if(a[i+a1][j+a1]==1)
total3++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断右斜线
{
if(i-a1<0 || j+a1>=15)
break;
if(a[i-a1][j+a1]==1)
total4++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15 || j-a1<0)
break;
if(a[i+a1][j-a1]==1)
total4++;
else
break;
}
int a1[4]={total1,total2,total3,total4};
int temp=max1(a1);
int tp1=get1(a1); //获取哪个方向上连子最多,1表示水平线,2代表竖直线,3代表左斜线,4代表右斜线
if(temp==3) //对手已经三子,此时要分情况,有边界的三子不用堵,没有边界的三子需要堵
{
if(tp1==1) //水平线有三子
{
int a1;
int tpx1=0;
for(a1=1;a1<=3;a1++)
{
// tpx1=0;
if(j-a1<0)
break;
if(a[i][j-a1]==1)
tpx1++;
else
break;
}
if(tpx1==3)
{
if(j-a1==0)
{
}
else if(j-a1-1>=0)
{
if(a[i][j-a1-1]==0)
{
a[i][j]=2;
return 0;
}
}
}
else if(tpx1==2)
{
a[i][j]=2;
return 0;
}
else if(tpx1==1)
{
a[i][j]=2;
return 0;
}
else if(tpx1==0)
{
if(j+a1==14)
{
}
else if(j+a1<14)
{
if(a[i][j+a1+1]==0)
{
a[i][j]=2;
return 0;
}
}
}
} //水平线三子情况判断结束
else if(tp1==2) //竖直线有三子的情况
{
int a1;
int tpx1=0;
for(a1=1;a1<=3;a1++)
{
// tpx1=0;
if(i-a1<0)
break;
if(a[i-a1][j]==1)
tpx1++;
else
break;
}
if(tpx1==3)
{
if(i-a1==0)
{
}
else if(i-a1-1>=0)
{
if(a[i-a1-1][j]==0)
{
a[i][j]=2;
return 0;
}
}
}
else if(tpx1==2)
{
a[i][j]=2;
return 0;
}
else if(tpx1==1)
{
a[i][j]=2;
return 0;
}
else if(tpx1==0)
{
if(i+a1==14)
{
}
else if(i+a1<14)
{
if(a[i+a1+1][j]==0)
{
a[i][j]=2;
return 0;
}
}
}
} //竖直线有三子情况判断结束
else if(tp1==3) //左斜线有三子的情况
{
int a1;
int tpx1=0;
for(a1=1;a1<=3;a1++)
{
// tpx1=0;
if(i-a1<0 || j-a1<0)
break;
if(a[i-a1][j-a1]==1)
tpx1++;
else
break;
}
if(tpx1==3)
{
if(i-a1==0 || j-a1==0)
{
}
else if(i-a1-1>=0 and j-a1-1>=0)
{
if(a[i-a1-1][j-a1-1]==0)
{
a[i][j]=2;
return 0;
}
}
}
else if(tpx1==2)
{
a[i][j]=2;
return 0;
}
else if(tpx1==1)
{
a[i][j]=2;
return 0;
}
else if(tpx1==0)
{
if(i+a1==14 || j+a1==14)
{
}
else if(i+a1<14 and j+a1<14)
{
if(a[i+a1+1][j+a1+1]==0)
{
a[i][j]=2;
return 0;
}
}
}
} //左斜线三子情况判断结束
else if(tp1==4) //判断右斜线有三子的情况
{
int a1;
int tpx1=0;
for(a1=1;a1<=3;a1++)
{
// tpx1=0;
if(i-a1<0 || j+a1 >14)
break;
if(a[i-a1][j+a1]==1)
tpx1++;
else
break;
}
if(tpx1==3)
{
if(i-a1==0 || j+a1==14)
{
}
else if(i-a1-1>=0 and j+a1+1<=14)
{
if(a[i-a1-1][j+a1+1]==0)
{
a[i][j]=2;
return 0;
}
}
}
else if(tpx1==2)
{
a[i][j]=2;
return 0;
}
else if(tpx1==1)
{
a[i][j]=2;
return 0;
}
else if(tpx1==0)
{
if(i+a1==14 || j-a1==0)
{
}
else if(i+a1<14 and j-a1>0)
{
if(a[i+a1+1][j-a1-1]==0)
{
a[i][j]=2;
return 0;
}
}
}
} //右斜线三子情况判断结束
} //对手有三子的情况 (if的括号)
else if(temp==4 || temp==5) //对手有四子或五子,一定要堵
{
a[i][j]=2;
return 0;
}
}
}
//判断对手连子情况结束,开始连自己五子
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
if(a[i][j]==2)
t1++;
}
}
if(t1==0)
{
a[7][7]=2;
return 0;
}
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
int total1=0;
int total2=0;
int total3=0;
int total4=0;
if(a[i][j]!=0)
continue;
for(int a1=1;a1<5;a1++) //判断水平线
{
if(j-a1<0)
break;
if(a[i][j-a1]==2)
total1++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(j+a1>=15)
break;
if(a[i][j+a1]==2)
total1++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断竖直部分
{
if(i-a1<0)
break;
if(a[i-a1][j]==2)
total2++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15)
break;
if(a[i+a1][j]==2)
total2++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断左斜线
{
if(i-a1<0 || j-a1<0)
break;
if(a[i-a1][j-a1]==2)
total3++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15 || j+a1>=15)
break;
if(a[i+a1][j+a1]==2)
total3++;
else
break;
}
for(int a1=1;a1<5;a1++) //判断右斜线
{
if(i-a1<0 || j+a1>=15)
break;
if(a[i-a1][j+a1]==2)
total4++;
else
break;
}
for(int a1=1;a1<5;a1++)
{
if(i+a1>=15 || j-a1<0)
break;
if(a[i+a1][j-a1]==2)
total4++;
else
break;
}
int a1[4]={total1,total2,total3,total4};
int temp=max1(a1);
if(temp>=4)
{
a[i][j]=2;
// cout<<"AI已获胜";
return -1;
}
if(temp>s)
{
s=temp;
s1[0]=i;
s1[1]=j;
}
}
}
s=0;
a[s1[0]][s1[1]]=2;
s1[0]=-1;
s1[1]=-1;
return 0;
}
void qipan::play()
{
while(1)
{ int x1,y1;
int temp= AI();
paint1();
cout<<endl;
if(temp==-1)
{
cout<<"AI已获胜";
Sleep(20000);
return ;
}
cout<<"AI已经落子"<<endl;
cout<<"请红方落子"<<endl;
cin>>x1>>y1;
temp=player(x1,y1,1);
cout<<endl;
if(temp==1){
while(temp==1){
paint1();
cout<<"红方落子无效,请重新落子";
cin>>x1>>y1;
temp=player(x1,y1,1);
cout<<endl;
}
}
if(temp==5){
paint1();
cout<<"恭喜红方获胜"<<endl;
Sleep(20000);
return ;
}
paint1();
cout<<endl;
}
}
int main()
{
qipan a;
a.paint1();
a.play();
}
亲测有效,输入数对下棋!!!!!!!!!