黑方使用@符号代表,白方使用 *号代表
. 1 2 3 4 5 6 7 8 9 A B C D E F
1 0 0 0 0 0 @ * 0 0 0 0 0 0 0 0
2 0 0 0 0 0 @ * 0 0 0 0 0 0 0 0
3 0 0 0 0 0 @ * * 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
D 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
E 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
用户输入走棋行列号如(3,5),表示第3行5列处落子。
建议10以后行列号用A,B,C,D,E,F
轮流下棋,直到输赢或(-1,-1)结束。
1ˎ 问题描述
黑方使用@符号代表,白方使用 *号代表,能实现在棋盘上下棋,获胜,终止等功能。
2ˎ功能要求
用户输入走棋行列号如(3,5),表示第3行5列处落子。轮流下棋,直到输赢或(-1,-1)结束。
3ˎ功能实现
1) 输出棋盘函数
char ch='A';
for (i = 0; i <= N; i++)
{for (j = 0; j <= N; j++)
{
if (0 == i)
{for(j=0;j<10;j++)
cout<<setw(2)<<j;
for(j=10;j<=N;j++)
{cout<<setw(2)<<ch;
ch=(ch+1); }
}
//利用二维数组实现,行标与列标分别用i,j 表示,定义字符ch='A',即当列标j==0输出i,列行标i==0,for(j=0;j<10;j++),输出j; for(j=10;j<=N;j++),ch=(ch+1);依次输出ch。
else if (1 == a[i][j]) cout<<setw(2)<<'@';
else if (2 == a[i][j]) cout<<setw(2)<<'*';
Else cout<<setw(2)<<'.';
落子位置由整个棋盘一个一个判断这个位置是否被重新定义,若被新定义为2,则此位置输出*,若此位置被新定为1,此位置输出@,没有重新定义输出为.。
2)下棋函数
这是一个循环函数,whoTurn为总落子次数初始为零,每落一次子,whoTurn++,由总的落子次数除以2的余数判断该哪位选手落子。
if (1 == whoTurn% 2) cout<<"请第1位选手落子";
else cout<<"请第2位选手落子";
if (1 == a[i][j])
cout<<setw(2)<<'@';
else if (2 == a[i][j])
cout<<setw(2)<<'*';
else cout<<setw(2)<<'.';
//若此位置已被重新定义过,则不能落子,否则将此位置重新定义,第一位选手a[i][j] = 1;第二位选手a[i][j] = 2;
if(i==-1&&j==-1)
{cout<<"结束!"<<endl;
exit(0);}
若输入为(-1 -1)判断结束整个循环; system(“cls”); 清除内容后重新调用棋盘函数,输出棋盘,调用判断函数;判断之后继续落子,形成循环。
3)判断函数(以斜向获胜为例)
for(i=1;i<=4;i++)
{ if(a[s+i][t+i]!=a[s][t]) break;
c++; } //右下方遍历
for(i=1;i<=4;i++)
{ if(a[s-i][t-i]!=a[s][t]) break;
d++;} //左上方遍历
if(c+d>=4) //斜向两边相同棋子加上中间大于五个获胜
{ cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
此函数分四部分,分别判断横向,竖向,斜向,反斜向,由落子点向一个一个位置一个位置判断,遇到不相同的子即从落子点反向判断,将两边相同的棋子个数相加,再加上中间一个大于五个即获胜。
4、源代码及注释说明
#include<iostream>
#include<iomanip>
using namespace std;
#define N 15
int a[N + 1][N + 1] = { '0' }; //定义一个16*16的区域
int huosheng1(int s,int t);
int huosheng2(int s,int t);
int huosheng3(int s,int t);
int huosheng4(int s,int t);
void coutqipan(void);
void playChess(void); // 各个函数声明
int whoTurn = 0;
int main() //主函数
{
coutqipan();
while (1)
{ whoTurn++;
playChess();
}
return 0;
}
void coutqipan() //输出棋盘
{
int i, j;
char ch='A';
for (i = 0; i <= N; i++)
{
for (j = 0; j <= N; j++)
{
if (0 == i)
{ for(j=0;j<10;j++)
cout<<setw(2)<<j;
for(j=10;j<=N;j++)
{cout<<setw(2)<<ch; //输出列标
ch=(ch+1);
}
}
else if (j == 0) //输出行标
cout<<setw(2)<<i;
else if (1 == a[i][j])
cout<<setw(2)<<'@';
else if (2 == a[i][j])
cout<<setw(2)<<'*';
else
cout<<setw(2)<<'.';
}
cout<<endl;
}
}
void playChess(void) //下棋
{
int i, j,count=0;
if (1 == whoTurn% 2) //利用总下棋次数判断该哪位选手落子
{
cout<<"请第1位选手落子";
cin>>i>>j;
while (a[i][j] != 0)
{
cout<<"此位置已有棋子,请重新落子";
cin>>i>>j;
}
if(i==-1&&j==-1) //未分胜负时结束
{
cout<<"结束!"<<endl;
exit(0);}
a[i][j] = 1; //第一位选手下的位置定义为1
system("cls"); //清除棋盘
coutqipan(); //调用棋盘的函数
huosheng1(i,j);
huosheng2(i,j);
huosheng3(i,j);
huosheng4(i,j); //调用四个判断函数
}
else
{
cout<<"请第2位选手落子";
cin>>i>>j;
while (a[i][j] != 0)
{
cout<<"此位置已有棋子,请重新落子";
cin>>i>>j;
}
if(i==-1&&j==-1) //未分胜负时结束
{
cout<<"结束!"<<endl;
exit(0);}
a[i][j] = 2; //第二位选手下的位置定义为2
system("cls"); //清除棋盘
coutqipan(); //调用棋盘函数
huosheng1(i,j);
huosheng2(i,j);
huosheng3(i,j);
huosheng4(i,j); //调用四个判断函数
}
}
/*一落子点为中心,分向上下左右斜向八个方位遍历判断,一个方向上超过或等于五个棋子则获胜。*/
int huosheng1(int s,int t) //横向获胜
{
int i,count=0;
for(i=t+1;i<=t+4;i++)
{
if(a[s][i]!=a[s][t]) break;
count++; //向右遍历
}
for(i=t-1;i>=t-4;i--)
{
if(a[s][i]!=a[s][t]) break;
count++; //向左遍历
}
if(count>=4) //左右两边相同棋子加上中间大于五个获胜
{
cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
return 0;
}
int huosheng2(int s,int t) //竖向获胜
{
int i,count=0;
for(i=s+1;i<=s+4;i++)
{
if(a[i][t]!=a[s][t]) break;
count++; //向下遍历
}
for(i=s-1;i>=s-4;i--) {
if(a[i][t]!=a[s][t]) break;
count++; //向上遍历
}
if(count>=4) //上下两边相同棋子加上中间大于五个获胜
{
cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
return 0;
}
int huosheng3(int s,int t) //斜向获胜
{
int i,j,c=0,d=0;
for(i=1;i<=4;i++)
{
if(a[s+i][t+i]!=a[s][t]) break;
c++; //右下方遍历
}
for(i=1;i<=4;i++)
{
if(a[s-i][t-i]!=a[s][t]) break;
d++; //左上方遍历
}
if(c+d>=4) //斜向两边相同棋子加上中间大于五个获胜
{
cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
return 0;
}
int huosheng4(int s,int t) //反斜向获胜
{
int i,j,c=0,d=0;
for(i=1;i<=4;i++)
{
if(a[s+i][t-i]!=a[s][t]) break;
c++; //左下方遍历
}
for(i=1;i<=4;i++)
{if(a[s-i][t+i]!=a[s][t]) break;
d++; //右上方遍历
}
if(c+d>=4) //反斜向两边相同棋子加上中间大于五个获胜
{
cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
return 0;
}