#include<iostream.h>
#define uchar unsigned char #define lsh 13 //棋盘为13路 enum result{natu,nonl,nonu,vict,surr}; //对应落子后的结果:常规、非法、弃权、获胜、投降 enum crossing{black,white,air}; //对应一个交叉点的状态:黑子、白子、空 enum crossing qp[lsh][lsh];//声明一个数组,对应棋盘 bool w_play;//轮白方下棋 void init();//声明初始化函数 void show();//声明显示函数 enum result play();//声明对弈函数 bool verd(char*);//声明判断落子合法性的函数 bool five(char,char);//声明判断五子相连的函数 void main() { enum result result0; //落子后的结果 init(); //初始化函数 while(true) { show(); //显示函数 result0=play(); //对弈函数 if(result0>nonu) break; } getchar(); getchar(); } void init() { for(int i=0;i<lsh;i++)//整个棋盘初始化为全空 for(int j=0;j<lsh;j++) qp[i][j]=air; w_play=false;//初始为黑棋下 } void show()//显示函数 { int i,j; char b; cout<<endl; b='a'; cout<<' '; for(i=0;i<lsh;i++) //在最上一行显示各个列的编号 { cout<<b<<' '; b++; } b='A'; for(i=0;i<lsh;i++) { cout<<endl; cout<<b; //每行开头,显示行的编号 b++; for(j=0;j<lsh;j++) { switch(qp[i][j]) { case black: cout<<"○"; //显示黑子 break; case white: cout<<"●"; //显示白子 break; case air: //在不同位置显示交叉点 if(i==0) { if(j==0) cout<<"┏"; else if(j==lsh-1) cout<<"┓"; else cout<<"┯"; } else if(i==lsh-1) { if(j==0) cout<<"┗"; else if(j==lsh-1) cout<<"┛"; else cout<<"┷"; } else { if(j==0) cout<<"┠"; else if(j==lsh-1) cout<<"┨"; else cout<<"┼"; } break; } } } cout<<endl; cout<<"弃权:*"<<endl;//显示弃权、投降的提示信息 cout<<"投降:$"<<endl; if(w_play) cout<<"●";//显示当前的走棋方为白方 else cout<<"○";//显示当前的走棋方为黑方 }
enum result play()//五子棋对弈函数 { char key[3];//用于输入落子的坐标 cin>>key; if(key[0]=='*')//弃权 { w_play=!w_play;//换为另一方下棋 return nonu; } else if(key[0]=='$')//投降 { if(w_play) cout<<"黑方获胜!"; else cout<<"白方获胜!"; return surr; } else if(verd(key))//普通的合法输入 { if(five(key[0],key[1]))//判断五子 { if(w_play) cout<<"白方获胜!"; else cout<<"黑方获胜!"; return vict; } w_play=!w_play;//换为另一方下棋 return natu; } else//非法输入 { cout<<"输入错误!请重新输入!"; return nonl; } } bool verd(char *p) {//判断输入是否合法,如合法则转换成相应的坐标 if(p[0]<'A' || p[0]>=('a'+lsh) || p[0]>=('A'+lsh) && p[0]<'a')//非法字符 return false; if(p[1]<'A' || p[1]>=('a'+lsh) || p[1]>=('A'+lsh) && p[1]<'a')//非法字符 return false; if(p[0]>0x60)//以下把输入的字母转换成数值下标 p[0]=p[0]-0x61; else p[0]=p[0]-0x41; if(p[1]>0x60) p[1]=p[1]-0x61; else p[0]=p[0]-0x41; if(qp[p[0]][p[1]]!=air)//该处有子 return false; if(w_play)//在棋盘数组中进行记录 qp[p[0]][p[1]]=white; else qp[p[0]][p[1]]=black; return true; } bool five(char x,char y)//判断五子相连的函数 { char n,i,j; enum crossing z=qp[x][y];//Z是刚落下的棋子 n=0; j=y; while(j>0)//检查横向是否五子相连 { if(qp[x][j-1]==z)//看看左边是不是同色棋子 j--; else break; } while(qp[x][j]==z)//看看右边是不是同色棋子 { if(j++==lsh) break; if(++n==5) return true; } n=0; i=x; while(i>0)//检查纵向是否五子相连 { if(qp[i-1][y]==z)//看看上边是不是同色棋子 i--; else break; } while(qp[i][y]==z)//看看下边是不是同色棋子 { if(i++==lsh) break; if(++n==5) return true; } i=x; j=y; n=0; while(i>0 && j>0)//检查左上右下方向是否五子相连 { if(qp[i-1][j-1]==z)//看看左上是不是同色棋子 { i--; j--; } else break; } while(qp[i][j]==z)//看看右下是不是同色棋子 { if(i++==lsh) break; if(j++==lsh) break; if(++n==5) return true; } i=x; j=y; n=0; while(i>0 && j<lsh-2)//检查右上左下方向是否五子相连 { if(qp[i-1][j+1]==z)//看看右上是不是同色棋子 { i--; j++; } else break; } while(qp[i][j]==z)//看看左下是不是同色棋子 { if(i++==lsh) break; if(j--==-1) break; if(++n==5) return true; } return false; } |
|