黑方使用@符号代表,白方使用 *号代表 . 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); }
}
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)<<'.';
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' };
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;
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;
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;
}
|