1.画棋盘
画出一个16×16的棋盘,用 *号表示空棋盘
//建立一个棋盘 void build() { for(int i=1;i<17;i++) { for(int j=1;j<17;j++) { board[i][j]=‘*‘; //初始化棋盘,全为*号 } } }
2.显示棋盘
利用序号将棋盘行列表示出来,随后显示一个空棋盘
void display() { int k=1; cout<<setw(3)<<""; for(int i=1;i<17;i++) { //第一行的序号 cout<<left<<setw(5)<<i; } cout<<endl; for(int i=1;i<17;i++) { for(int j=0;j<17;j++) { //第一列的序号 if(j==0) { cout<<right<<setw(2)<<k; cout<<setw(1)<<""; k++; } //显示空棋盘 else { cout<<left<<setw(5)<<board[i][j]; } if(j==16) cout<<endl<<endl; } } }
3.判断胜负
假设落子的坐标为(x,y),我们先来判断
1.水平方向
int num=1;
4<y<16;判断(x,y)水平向左的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
0<y<13;判断(x,y)水平向右的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
if(num>=5) ,判定下子方胜利
2. 垂直方向
重新赋值 num=1;
同理
4<x<16;判断(x,y)正上方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
0<x<13;判断(x,y)正下方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
if(num>=5) ,判定下子方胜利
3.斜向
Ⅰ.正斜向
重新赋值 num=1
4<x<16,4<y<16;判断(x,y)斜上方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
0<x<13,0<y<13;判断(x,y)斜下方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
if(num>=5) ,判定下子方胜利
Ⅱ.反斜向
重新赋值 num=1
0<y<13,4<x<16;判断(x,y)斜上方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
4<y<16,0<x<13;判断(x,y)斜下方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;
if(num>=5) ,判定下子方胜利
//判断胜负条件 int winner(int over,int x,int y) { //判断落子左右是否连成5个 //水平方向判断 //水平向左判断 int num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x][y-i]&&y>5) num++; else { break; } } //水平向右判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x][y+i]&&y<13) num++; else { break; } } if(num>4) over=1; //垂直方向判断 //垂直向上判断 num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x-i][y]&&x>5) num++; else { break; } } //垂直向下判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x][y+i]&&x<13) num++; else { break; } } if(num>4) over=1; //正斜向判断 //斜向上判断 num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x-i][y-i]&&x>5&&y>5) num++; else { break; } } //斜向下判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x+i][y+i]&&y<13&&x<13) num++; else { break; } } if(num>4) over=1; //反斜向判断 //斜向上判断 num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x-i][y+i]&&x>5&&y<13) num++; else { break; } } //斜向下判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x+i][y-i]&&y>5&&x<13) num++; else { break; } } if(num>4) over=1; return over;
此处over用于下一步跳出死循环
4.游戏运行
1.黑白双方轮流下子问题
建立一个死循环
for(int k=1;;k++) //k为下棋的部数
k为奇数的时候,黑方落子 k为偶数的时候,白方落子
利用k对2求余,实现黑白双方轮流下子
上方over用于跳出死循环
2.落子重复问题
判断落子位置原来是否为*号
if(board[x][y]==’*‘) 正常下子
else 退一步,重新下子,k--
3.位置合理问题
cin>>x>>y
输入的坐标需满足大于0小于16
满足 进行胜负条件判断
else 退一步,重新下子,k--
4.屏幕刷新问题
system("cls")
void startGame() { int winner(int over,int x,int y); //函数声明 int over=0; build(); display(); for(int k=1;;k++) { if(over) //利用over跳出循环 break; if(k%2!=0) //对2求余,使落子分配于黑白 { cout<<"黑方落子:"; cin>>x>>y; system("cls"); //不能在已下子的地方继续下子 if(board[x][y]==‘*‘) //判断输入的位置是否合理 { board[x][y]=‘B‘; display(); } else { display(); cout<<"输入错误,请重新输入"<<endl; k--; //退回一步 } if(x>0&&y>0&&x<17&&y<17) //判断输入的位置是否合理 over=winner(over,x,y); //判断胜利条件 if(over) cout<<"获胜者:黑方"<<endl; } else { cout<<"白方落子:"; cin>>x>>y; system("cls"); if(board[x][y]==‘*‘) { board[x][y]=‘W‘; display(); } else { display(); cout<<"输入错误,请重新输入"<<endl; k--; //退回一步 } if(x>0&&y>0&&x<17&&y<17) //判断输入的位置是否合理 over=winner(over,x,y); if(over) cout<<"获胜者:白方"<<endl; } } }
五子棋全部代码
//五子棋 #include <iostream> #include <iomanip> using namespace std; char board[17][17]; int x,y; //x,y为棋盘横纵坐标 int main() { void build(); void display(); void startGame(); //函数声明 startGame(); //函数调用 system("pause"); return 0; } //建立一个棋盘 void build() { for(int i=1;i<17;i++) { for(int j=1;j<17;j++) { board[i][j]=‘*‘; //初始化棋盘,全为*号 } } } //显示棋盘 void display() { int k=1; cout<<setw(3)<<""; for(int i=1;i<17;i++) { //第一行的序号 cout<<left<<setw(5)<<i; } cout<<endl; for(int i=1;i<17;i++) { for(int j=0;j<17;j++) { //第一列的序号 if(j==0) { cout<<right<<setw(2)<<k; cout<<setw(1)<<""; k++; } //显示空棋盘 else { cout<<left<<setw(5)<<board[i][j]; } if(j==16) cout<<endl<<endl; } } } //游戏运行 void startGame() { int winner(int over,int x,int y); //函数声明 int over=0; build(); display(); for(int k=1;;k++) { if(over) //利用over跳出循环 break; if(k%2!=0) //对2求余,使落子分配于黑白 { cout<<"黑方落子:"; cin>>x>>y; system("cls"); //不能在已下子的地方继续下子 if(board[x][y]==‘*‘) //判断输入的位置是否合理 { board[x][y]=‘B‘; display(); } else { display(); cout<<"输入错误,请重新输入"<<endl; k--; //退回一步 } if(x>0&&y>0&&x<17&&y<17) //判断输入的位置是否合理 over=winner(over,x,y); //判断胜利条件 if(over) cout<<"获胜者:黑方"<<endl; } else { cout<<"白方落子:"; cin>>x>>y; system("cls"); if(board[x][y]==‘*‘) { board[x][y]=‘W‘; display(); } else { display(); cout<<"输入错误,请重新输入"<<endl; k--; //退回一步 } if(x>0&&y>0&&x<17&&y<17) //判断输入的位置是否合理 over=winner(over,x,y); if(over) cout<<"获胜者:白方"<<endl; } } } //判断胜负条件 int winner(int over,int x,int y) { //判断落子左右是否连成5个 //水平方向判断 //水平向左判断 int num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x][y-i]&&y>5) num++; else { break; } } //水平向右判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x][y+i]&&y<13) num++; else { break; } } if(num>4) over=1; //垂直方向判断 //垂直向上判断 num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x-i][y]&&x>5) num++; else { break; } } //垂直向下判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x][y+i]&&x<13) num++; else { break; } } if(num>4) over=1; //正斜向判断 //斜向上判断 num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x-i][y-i]&&x>5&&y>5) num++; else { break; } } //斜向下判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x+i][y+i]&&y<13&&x<13) num++; else { break; } } if(num>4) over=1; //反斜向判断 //斜向上判断 num=1; for(int i=1;i<5;i++) { if(board[x][y]==board[x-i][y+i]&&x>5&&y<13) num++; else { break; } } //斜向下判断 for(int i=1;i<5;i++) { if(board[x][y]==board[x+i][y-i]&&y>5&&x<13) num++; else { break; } } if(num>4) over=1; return over; }
效果图
原文:https://www.cnblogs.com/sped-/p/12355084.html