两种不同作派写成的五子棋——C++
两种不同风格写成的五子棋——C++
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include <iostream> using namespace std; void init(char flag[20][20]);//初始化棋盘 void draw(char flag[20][20]);//划出指定棋盘 int test(char flag[20][20],char);//判断是否棋局结束 bool check(int,int);//检查玩家输入坐标是否合法 int main() { //设置棋盘大小 ,可以设置成变量 x,y char flag[20][20]; //初始化数据 char* lp = (char*)flag; for(int i=0; i <400; i++) *lp++ = '|'; draw(flag); for(int x =0;x <400; ) {//棋盘上总共能乘放下 x*y 个棋子 char i,j; if(x%4==0) { cout < <"请A方走:"; //cin>>i; //cin>>j; scanf("%c %c", &i, &j);getchar(); i-='a'; j-='a'; while(flag[i][j]=='X'||flag[i][j]=='O')//判断输入位置是否有棋子 { cout < <endl; cout < <"此地已经有棋子!请重新走:"; cin>>i; cin>>j; } if(check(i,j)==false) { cout < <endl; cout < <"输入坐标不合法!请重新输入:"; cin>>i; cin>>j; } flag[i][j]='X';//指定位置放上棋子 draw(flag); if(test(flag,'X'))//判断是否获胜(A) { char replay; cout < <"A方胜利!是否再来一局?Y/N:"; cin>>replay; if (replay=='Y'||replay=='y') { main(); } else { break; } } x+=2; }else{ cout < <"请B方走:"; //cin>>i; //cin>>j; scanf("%c %c", &i, &j);getchar(); i-='a'; j-='a'; while(flag[i][j]=='X'||flag[i][j]=='O') { cout < <endl; cout < <"此地已经有棋子!请重新走:"; cin>>i; cin>>j; } if(check(i,j)==false) { cout < <endl; cout < <"输入坐标不合法!请重新输入:"; cin>>i; cin>>j; } flag[i][j]='O'; draw(flag); if(test(flag,'O'))//判断是否获胜(B) { char replay; cout < <"B方胜利!是否再来一局?Y/N:"; cin>>replay; if (replay=='Y'||replay=='y') { main(); } else { break; } } x+=2; } } return 0; } int test(char flag[][20],char f){ int mark =0; for(int i=0;i <15;i++){ for(int j=0;j <15;j++){ if(//判断横着,数着,斜着三种成立情况 (f==flag[i][j]&&f==flag[i+1][j]&&f==flag[i+2][j]&&f==flag[i+3][j]&&f==flag[i+4][j]) ||(f==flag[i][j]&&f==flag[i][j+1]&&f==flag[i][j+2]&&f==flag[i][j+3]&&f==flag[i][j+4]) ||(f==flag[i][j]&&f==flag[i+1][j+1]&&f==flag[i+2][j+2]&&f==flag[i+3][j+3]&&f==flag[i+4][j+4])) { cout < <endl; mark =1; } } } return mark; } void draw(char flag[][20] ){ printf(" "); for(int i=0; i <20; i++) printf("%c ", 'a'+i); printf("\n"); for(int i=0;i <20;i++){ printf("%c ", 'a'+i); for(int j=0;j <20;j++){ cout < <"-"; cout < <flag[i][j]; } cout < <endl; } } bool check(int x,int y){ if(x>20 || y>20 || x <0 || y <0) return false; else return true; }
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include"iostream" using namespace std; int main() { char weizhi[20][20];//定义二维数组用于保存坐标 int c,d,x,y,flag=0;//flag作为标记符号 cout<<"欢迎使用简易的双人对战的五子棋游戏"<<endl<<endl; //输出棋盘的形状 cout<<"五子棋棋盘如下图所示" <<endl; cout<<" "; for(int a=1;a<=10;a++) cout<<" "<<a<<""; cout<<endl; for(a=0;a<=9;a++) { if(a<9) cout<<a+1<<" "; else cout<<a+1<<" "; for(int b=0;b <=9;b++) { weizhi[a][b]='-'; cout<<weizhi[a][b]<<" "; } cout<<endl; } while(flag==0) { if(flag==0) { cout<<"红方使用符号o,请红方输入您要落子的位置" <<endl; cout<<"横坐标:"; cin>>x; cout<<"纵坐标:"; cin>>y; if(weizhi[x-1][y-1]=='o'||weizhi[x-1][y-1]=='*') { cout<<"对不起,您不可以在这里落子"<<endl; continue; }//判断是否已经有子了 weizhi[x-1][y-1]='o'; cout<<" "; for(a=1;a<=10;a++) cout<<" "<<a<<""; cout<<endl; for(int a=0;a<=9;a++) { if(a <9) cout<<a+1<<" "; else cout<<a+1<<" "; for(int b=0;b<=9;b++) cout<<weizhi[a][b]<<" "; cout<<endl; } } if(flag==1||flag==9) break; for(int e=0;e<=5;e++) { for(int f=0;f<=5;f++) { if((weizhi[e][f]=='o')+(weizhi[e][f+1]=='o')+(weizhi[e][f+2]=='o')+(weizhi[e][f+3]=='o')+(weizhi[e][f+4]=='o')==5) flag=1; if((weizhi[f][e]=='o')+(weizhi[f+1][e]=='o')+(weizhi[f+2][e]=='o')+(weizhi[f+3][e]=='o')+(weizhi[f+4][e]=='o')==5) flag=1; if((weizhi[e][f]=='o')+(weizhi[e+1][f+1]=='o')+(weizhi[e+2][f+2]=='o')+(weizhi[e+3][f+3]=='o')+(weizhi[e+4][f+4]=='o')==5) flag=1; if((weizhi[e][f]=='o')+(weizhi[e-1][f-1]=='o')+(weizhi[e-2][f-2]=='o')+(weizhi[e-3][f-3]=='o')+(weizhi[e-4][f-4]=='o')==5) flag=1; if(flag==1) break; if((weizhi[e][f]=='*')+(weizhi[e][f+1]=='*')+(weizhi[e][f+2]=='*')+(weizhi[e][f+3]=='*')+(weizhi[e][f+4]=='*')==5) flag=9; if((weizhi[f][e]=='*')+(weizhi[f+1][e]=='*')+(weizhi[f+2][e]=='*')+(weizhi[f+3][e]=='*')+(weizhi[f+4][e]=='*')==5) flag=9; if((weizhi[e][f]=='*')+(weizhi[e+1][f+1]=='*')+(weizhi[e+2][f+2]=='*')+(weizhi[e+3][f+3]=='*')+(weizhi[e+4][f+4]=='*')==5) flag=9; if((weizhi[e][f]=='*')+(weizhi[e-1][f-1]=='*')+(weizhi[e-2][f-2]=='*')+(weizhi[e-3][f-3]=='*')+(weizhi[e-4][f-4]=='*')==5) flag=9; if(flag==9) break; } } if(flag==0) { oop:cout<<"黑方使用符号*,请黑方输入您要落子的位置"<<endl; cout<<"横坐标:"; cin>>c; cout<<"纵坐标:"; cin>>d; if(weizhi[c-1][d-1]=='o'||weizhi[c-1][d-1]=='*') { cout<<"对不起,您不可以在这里落子"<<endl; goto oop; }//判断是否已经有子了 weizhi[c-1][d-1]='*'; cout<<" "; for(a=1;a<=10;a++) cout<<" "<<a<<""; cout<<endl; for(int a=0;a<=9;a++) { if(a<9) cout<<a+1<<" "; else cout<<a+1<<" "; for(int b=0;b<=9;b++) cout<<weizhi[a][b]<<" "; cout<<endl; } } if(flag==9) break; } if(flag==1) cout<<"您输了,红方赢得了比赛"<<endl; else cout<<"您输了,黑方后走一步,黑方赢得了比赛"<<endl; system("pause"); return 0; } check 函数调用也不对吧? if只能检查一次输入,如果多次输入错误呢,应该改为while吧 while(check(i,j)==false) { cout < <endl; cout < <"输入坐标不合法!请重新输入:"; cin>>i; cin>>j; } check函数错误,应改为 bool check(int x,int y){ if(x >= 20 || y >= 20 || x < 0 || y < 0) return false; else return true; }