#include<iostream>
using namespace std;
void check(int i,int j); //检查每条直线上的各方棋子的数量
int other(int b,int c);
void check_win(); //检查是否胜利
void begin(char ch);
void computer(); //电脑下棋
void user(); //用户下棋
int a[4][4],deep;
int line[3][3][2]; //全局变量,用来存放每条直线上的各方棋子数!
//第一维下标表示是行列还是对角线,第二维下标表示第几条直线
//第三维下标表示各方的棋子数!
void main()
{
char ch;
cout<<"欢迎与本机下#字棋!您的棋子将用#表示,电脑的棋子用X表示/n请选择先后手,输入u则您先手,输入c则电脑先手!(小写)/n"<<endl;
do
{
cin>>ch;
if(ch!='u'&&ch!='c') cout<<"您输入的数据不合法,请重新输入!"<<endl;
}while(ch!='u'&&ch!='c'); //非法处理
if(ch=='u') cout<<"您选择了您先手!/n"<<endl;
else if(ch=='c') cout<<"您选择了电脑先手/n"<<endl;
begin(ch);
}
void begin(char ch)
{
int i,j,k;
a[1][1]=1;
cout<<"/n 1 | 2 | 3 /n ——————/n 4 | 5 | 6 /n ——————/n 7 | 8 | 9 /n"<<endl;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{
if(j==1)
if(i==1);
else a [j]=a[3]+1;
else a[j]=a[j-1]+1;
} //初始化棋盘
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
line[j][k]=0;
deep=0;
if(ch=='u') user();
else computer();
}
void computer()
{
int i,j,flag=0,m; //flag判断是否落子
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if (line[j][0]==2&&line[j][1]==0&&flag==0)
{
m=other(i,j);
if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
else {a[m/3+1][m%3]=40; check(m/3+1,m%3);} //40是#的ASCII码减48
flag=1;
} //当某条直线上用户有两棋子而我方无棋子时,在该直线的另一点落子
if (line[j][1]==2&&line[j][0]==0&&flag==0)
{
m=other(i,j);
if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
else {a[m/3+1][m%3]=40; check(m/3+1,m%3);} //当某条直线上我方有两棋子而对方无棋子时,在该直线的另一点落子
flag=1;
}
if (line[j][1]==1&&line[j][0]==0&&flag==0)
{
m=other(i,j);
if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
else {a[m/3+1][m%3]=40; check(m/3+1,m%3);} //当某条直线上我方有一棋子而对方无棋子时,在该直线的另一点落子
flag=1;
}
}
if(flag==0)
if (a[2][2]==5)
{
a[2][2]=72;
flag=1;
check(2,2);
} //优先下第5个位置
else{
for(i=2;i<9&&flag==0&&a[j]==(i-1)*3+j;i+=2)
{
if(i%3==0) {a[3]=40;check(i/3,3);}
else {a=40; check(i/3+1,i%3);}
flag=1;
} //2,4,6,8其次
for(i=1;i<9&&flag==0&&a[j]==(i-1)*3+j;i+=2)
{
if(i%3==0) {a[3]=40;check(i/3,3);}
else {a=40; check(i/3+1,i%3);}
flag=1;
} //1,3,7,9再次
}
for(i=1;i<=3;i++)
{
cout<<" ";
for(j=1;j<=3;j++)
cout<<" "<<char(a[j]+48)<<" |";
cout<<"/n ——————"<<endl;
}
deep++;
if(flag==1) user();
else check_win();
}
void user()
{
int down;
cout<<"/n轮到您下了,请输入您要下的棋子位置:"<<endl;
do{
cin>>down;
if(down<1||down>9)
cout<<"数字不合法,请重新输入/n"<<endl;
if ((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down/3+1][down%3]!=down))
cout<<"您所输入的位置已经有棋子了,请重新输入/n"<<endl;
}while(down<1||down>9||((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down/3+1][down%3]!=down)));
//判断输入是否异常
if(down%3==0) {a[down/3][3]=-13; check(down/3,3);}
else {a[down/3+1][down%3]=-13;check(down/3+1,down%3);} //-13是X的ASCII码减48
deep++;
computer();
}
int other(int b,int c)
{
int i,m;
if(b<2)
{
if (b==0)
m=3*c+1;
if (b==1)
m=c+1;
for(i=m;i<m+3;i++)
{
if(i%3==0)
if(a[3]==i) return i;
else;
else if(a) return i;
}
} //水平与垂直直线的情况
if(b==2)
{
if(c==0)
{
if(a[1][1]==1) return 1;
if(a[2][2]==5) return 5;
if(a[3][3]==9) return 9;
}
if(c==1)
{
if(a[1][3]==3) return 3;
if(a[2][2]==5) return 5;
if(a[3][1]==7) return 7;
}
} //对角线的情况
}
void check(int i,int j)
{
if(a[j]==-13)
{
line[0][0]++;
line[1][j-1][0]++;
if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))
line[2][0][0]++;
if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))
line[2][1][0]++;
}
if(a[j]==40)
{
line[0][1]++;
line[1][j-1][1]++;
if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))
line[2][0][1]++;
if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))
line[2][1][1]++;
}
check_win();
}
void check_win()
{
int i,j,k;
bool end=false;
char ch;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<2;k++)
if(line[j][k]==3)
{
if(k==1) cout<<"您失败了,电脑获得了胜利"<<endl;
if(k==0) cout<<"恭喜您,您获得了胜利"<<endl;
end=true;
}
if(deep>=9) {cout<<"和棋!"<<endl;end=true;}
if(end)
{
cout<<"/n您是否继续?是输入Y,按其余任意键结束本游戏!:"<<endl;
cin>>ch;
if(ch!='y') exit(0);
else{
cout<<"/n请选择先后手,输入U则您先手,输入C则电脑先手!/n"<<endl;
do
{
cin>>ch;
if(ch!='u'&&ch!='c') cout<<"您输入的数据不合法,请重新输入!"<<endl;
}while(ch!='u'&&ch!='c'); //非法处理
if(ch=='u') cout<<"您选择了您先手!/n"<<endl;
else if(ch=='c') cout<<"您选择了电脑先手/n"<<endl;
begin(ch);
}
}
}
using namespace std;
void check(int i,int j); //检查每条直线上的各方棋子的数量
int other(int b,int c);
void check_win(); //检查是否胜利
void begin(char ch);
void computer(); //电脑下棋
void user(); //用户下棋
int a[4][4],deep;
int line[3][3][2]; //全局变量,用来存放每条直线上的各方棋子数!
//第一维下标表示是行列还是对角线,第二维下标表示第几条直线
//第三维下标表示各方的棋子数!
void main()
{
char ch;
cout<<"欢迎与本机下#字棋!您的棋子将用#表示,电脑的棋子用X表示/n请选择先后手,输入u则您先手,输入c则电脑先手!(小写)/n"<<endl;
do
{
cin>>ch;
if(ch!='u'&&ch!='c') cout<<"您输入的数据不合法,请重新输入!"<<endl;
}while(ch!='u'&&ch!='c'); //非法处理
if(ch=='u') cout<<"您选择了您先手!/n"<<endl;
else if(ch=='c') cout<<"您选择了电脑先手/n"<<endl;
begin(ch);
}
void begin(char ch)
{
int i,j,k;
a[1][1]=1;
cout<<"/n 1 | 2 | 3 /n ——————/n 4 | 5 | 6 /n ——————/n 7 | 8 | 9 /n"<<endl;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{
if(j==1)
if(i==1);
else a [j]=a[3]+1;
else a[j]=a[j-1]+1;
} //初始化棋盘
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
line[j][k]=0;
deep=0;
if(ch=='u') user();
else computer();
}
void computer()
{
int i,j,flag=0,m; //flag判断是否落子
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if (line[j][0]==2&&line[j][1]==0&&flag==0)
{
m=other(i,j);
if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
else {a[m/3+1][m%3]=40; check(m/3+1,m%3);} //40是#的ASCII码减48
flag=1;
} //当某条直线上用户有两棋子而我方无棋子时,在该直线的另一点落子
if (line[j][1]==2&&line[j][0]==0&&flag==0)
{
m=other(i,j);
if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
else {a[m/3+1][m%3]=40; check(m/3+1,m%3);} //当某条直线上我方有两棋子而对方无棋子时,在该直线的另一点落子
flag=1;
}
if (line[j][1]==1&&line[j][0]==0&&flag==0)
{
m=other(i,j);
if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
else {a[m/3+1][m%3]=40; check(m/3+1,m%3);} //当某条直线上我方有一棋子而对方无棋子时,在该直线的另一点落子
flag=1;
}
}
if(flag==0)
if (a[2][2]==5)
{
a[2][2]=72;
flag=1;
check(2,2);
} //优先下第5个位置
else{
for(i=2;i<9&&flag==0&&a[j]==(i-1)*3+j;i+=2)
{
if(i%3==0) {a[3]=40;check(i/3,3);}
else {a=40; check(i/3+1,i%3);}
flag=1;
} //2,4,6,8其次
for(i=1;i<9&&flag==0&&a[j]==(i-1)*3+j;i+=2)
{
if(i%3==0) {a[3]=40;check(i/3,3);}
else {a=40; check(i/3+1,i%3);}
flag=1;
} //1,3,7,9再次
}
for(i=1;i<=3;i++)
{
cout<<" ";
for(j=1;j<=3;j++)
cout<<" "<<char(a[j]+48)<<" |";
cout<<"/n ——————"<<endl;
}
deep++;
if(flag==1) user();
else check_win();
}
void user()
{
int down;
cout<<"/n轮到您下了,请输入您要下的棋子位置:"<<endl;
do{
cin>>down;
if(down<1||down>9)
cout<<"数字不合法,请重新输入/n"<<endl;
if ((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down/3+1][down%3]!=down))
cout<<"您所输入的位置已经有棋子了,请重新输入/n"<<endl;
}while(down<1||down>9||((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down/3+1][down%3]!=down)));
//判断输入是否异常
if(down%3==0) {a[down/3][3]=-13; check(down/3,3);}
else {a[down/3+1][down%3]=-13;check(down/3+1,down%3);} //-13是X的ASCII码减48
deep++;
computer();
}
int other(int b,int c)
{
int i,m;
if(b<2)
{
if (b==0)
m=3*c+1;
if (b==1)
m=c+1;
for(i=m;i<m+3;i++)
{
if(i%3==0)
if(a[3]==i) return i;
else;
else if(a) return i;
}
} //水平与垂直直线的情况
if(b==2)
{
if(c==0)
{
if(a[1][1]==1) return 1;
if(a[2][2]==5) return 5;
if(a[3][3]==9) return 9;
}
if(c==1)
{
if(a[1][3]==3) return 3;
if(a[2][2]==5) return 5;
if(a[3][1]==7) return 7;
}
} //对角线的情况
}
void check(int i,int j)
{
if(a[j]==-13)
{
line[0][0]++;
line[1][j-1][0]++;
if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))
line[2][0][0]++;
if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))
line[2][1][0]++;
}
if(a[j]==40)
{
line[0][1]++;
line[1][j-1][1]++;
if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))
line[2][0][1]++;
if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))
line[2][1][1]++;
}
check_win();
}
void check_win()
{
int i,j,k;
bool end=false;
char ch;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<2;k++)
if(line[j][k]==3)
{
if(k==1) cout<<"您失败了,电脑获得了胜利"<<endl;
if(k==0) cout<<"恭喜您,您获得了胜利"<<endl;
end=true;
}
if(deep>=9) {cout<<"和棋!"<<endl;end=true;}
if(end)
{
cout<<"/n您是否继续?是输入Y,按其余任意键结束本游戏!:"<<endl;
cin>>ch;
if(ch!='y') exit(0);
else{
cout<<"/n请选择先后手,输入U则您先手,输入C则电脑先手!/n"<<endl;
do
{
cin>>ch;
if(ch!='u'&&ch!='c') cout<<"您输入的数据不合法,请重新输入!"<<endl;
}while(ch!='u'&&ch!='c'); //非法处理
if(ch=='u') cout<<"您选择了您先手!/n"<<endl;
else if(ch=='c') cout<<"您选择了电脑先手/n"<<endl;
begin(ch);
}
}
}