五子棋源码解析
1 #include <iostream> 2 using namespace std; 3 4 void init(char flag[][20]){ 5 for(int i=0;i<20;i++){ 6 for(int j=0;j<20;j++){ 7 flag[i][j]='|'; 8 cout<<"-"; 9 cout<<flag[i][j]; 10 } 11 cout<<endl; 12 } 13 } 14 15 int main(){ 16 //设置棋盘大小 ,可以设置成变量 x,y 17 char flag[20][20]; 18 //初始化数据 19 init(flag); 20 system("pause"); 21 }
1 #include <iostream> 2 using namespace std; 3 void init(char flag[20][20]);//初始化棋盘 4 void draw(char flag[20][20]);//划出指定棋盘 5 int test(char flag[20][20],char);//判断是否棋局结束 6 7 int main(){ 8 //设置棋盘大小 ,可以设置成变量 x,y 9 char flag[20][20]; 10 //初始化数据 11 init(flag); 12 13 for(int x =0;x<400; ){//棋盘上总共能乘放下 x*y 个棋子 14 int i,j; 15 if(x%4==0){ 16 cout<<"请A方走:"; 17 cin>>i; 18 cin>>j; 19 while(flag[i][j]=='X'||flag[i][j]=='O')//判断输入位置是否有棋子 20 { 21 cout<<endl; 22 cout<<"此地已经有棋子!请重新走:"; 23 cin>>i; 24 cin>>j; 25 } 26 flag[i][j]='X';//指定位置放上棋子 27 draw(flag); 28 if(test(flag,'X'))//判断是否获胜(A) 29 { 30 char replay; 31 cout<<"A方胜利!是否再来一局?Y/N:"; 32 cin>>replay; 33 if (replay=='Y'||replay=='y') 34 { 35 main(); 36 } else 37 { 38 break; 39 } 40 41 } 42 x+=2; 43 }else{ 44 cout<<"请B方走:"; 45 cin>>i; 46 cin>>j; 47 while(flag[i][j]=='X'||flag[i][j]=='O') 48 { 49 cout<<endl; 50 cout<<"此地已经有棋子!请重新走:"; 51 cin>>i; 52 cin>>j; 53 } 54 flag[i][j]='O'; 55 draw(flag); 56 if(test(flag,'O'))//判断是否获胜(B) 57 { 58 char replay; 59 cout<<"B方胜利!是否再来一局?Y/N:"; 60 cin>>replay; 61 if (replay=='Y'||replay=='y') 62 { 63 main(); 64 } else 65 { 66 break; 67 } 68 69 } 70 x+=2; 71 } 72 } 73 return 0; 74 } 75 76 void init(char flag[][20]){ 77 for(int i=0;i<20;i++){ 78 for(int j=0;j<20;j++){ 79 flag[i][j]='|'; 80 cout<<"-"; 81 cout<<flag[i][j]; 82 } 83 cout<<endl; 84 } 85 } 86 87 int test(char flag[][20],char f){ 88 int mark =0; 89 for(int i=0;i<15;i++){ 90 for(int j=0;j<15;j++){ 91 if(//判断横着,数着,斜着三种成立情况 92 (f==flag[i][j]&&f==flag[i+1][j]&&f==flag[i+2][j]&&f==flag[i+3][j]&&f==flag[i+4][j]) 93 ||(f==flag[i][j]&&f==flag[i][j+1]&&f==flag[i][j+2]&&f==flag[i][j+3]&&f==flag[i][j+4]) 94 ||(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])) 95 { 96 cout<<endl; 97 mark =1; 98 } 99 } 100 } 101 return mark; 102 } 103 104 void draw(char flag[][20] ){ 105 for(int i=0;i<20;i++){ 106 for(int j=0;j<20;j++){ 107 cout<<"-"; 108 cout<<flag[i][j]; 109 } 110 cout<<endl; 111 } 112 }
1 //五子棋,很简明易懂的小程序,适合初学者学习 2 #include <iostream> 3 using namespace std; 4 void init(char flag[20][20]);//初始化棋盘 5 void draw(char flag[20][20]);//划出指定棋盘 6 int test(char flag[20][20],char);//判断是否棋局结束 7 bool check(int,int);//检查玩家输入坐标是否合法 8 9 int main(){ 10 //设置棋盘大小 ,可以设置成变量 x,y 11 char flag[20][20]; 12 //初始化数据 13 init(flag); 14 15 for(int x =0;x<400; )//棋盘上总共能乘放下 x*y 个棋子,可是x加2,我认为此处为x<800; 16 { 17 int i,j; 18 if(x%4==0)//进行判断A,B方谁先走 19 { 20 cout<<"请A方走:"; 21 cin>>i; 22 cin>>j; 23 while(flag[i][j]=='X'||flag[i][j]=='O')//判断输入位置是否有棋子 24 { 25 cout<<endl; 26 cout<<"此地已经有棋子!请重新走:"; 27 cin>>i; 28 cin>>j; 29 } 30 if(check(i,j)==false) 31 { 32 cout<<endl; 33 cout<<"输入坐标不合法!请重新输入:"; 34 cin>>i; 35 cin>>j; 36 } 37 flag[i][j]='X';//指定位置放上棋子 38 draw(flag); 39 if(test(flag,'X'))//判断是否获胜(A) 40 { 41 char replay; 42 cout<<"A方胜利!是否再来一局?Y/N:"; 43 cin>>replay; 44 if (replay=='Y'||replay=='y') 45 { 46 main(); 47 } else 48 { 49 break; 50 } 51 52 } 53 x+=2; 54 } 55 else 56 { 57 cout<<"请B方走:"; 58 cin>>i; 59 cin>>j; 60 while(flag[i][j]=='X'||flag[i][j]=='O') 61 { 62 cout<<endl; 63 cout<<"此地已经有棋子!请重新走:"; 64 cin>>i; 65 cin>>j; 66 } 67 if(check(i,j)==false) 68 { 69 cout<<endl; 70 cout<<"输入坐标不合法!请重新输入:"; 71 cin>>i; 72 cin>>j; 73 } 74 flag[i][j]='O'; 75 draw(flag); 76 if(test(flag,'O'))//判断是否获胜(B) 77 { 78 char replay; 79 cout<<"B方胜利!是否再来一局?Y/N:"; 80 cin>>replay; 81 if (replay=='Y'||replay=='y') 82 { 83 main(); 84 } else 85 { 86 break; 87 } 88 89 } 90 x+=2; 91 } 92 } 93 return 0; 94 } 95 96 void init(char flag[][20])//初始化整个棋盘 97 { 98 for(int i=0;i<20;i++) 99 { 100 for(int j=0;j<20;j++) 101 { 102 flag[i][j]='|'; 103 cout<<"-"; 104 cout<<flag[i][j]; 105 } 106 cout<<endl; 107 } 108 } 109 110 int test(char flag[][20],char f)//测试是否结束,加分 111 { 112 int mark =0; 113 for(int i=0;i<15;i++)//15即可,因为是五子棋 114 { 115 for(int j=0;j<15;j++) 116 { 117 if(//判断横着,数着,斜着三种成立情况 118 (f==flag[i][j]&&f==flag[i+1][j]&&f==flag[i+2][j]&&f==flag[i+3][j]&&f==flag[i+4][j]) 119 ||(f==flag[i][j]&&f==flag[i][j+1]&&f==flag[i][j+2]&&f==flag[i][j+3]&&f==flag[i][j+4]) 120 ||(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])) 121 { 122 cout<<endl; 123 mark =1; 124 } 125 } 126 } 127 return mark; 128 } 129 130 void draw(char flag[][20] ) 131 { 132 for(int i=0;i<20;i++) 133 { 134 for(int j=0;j<20;j++) 135 { 136 cout<<"-"; 137 cout<<flag[j][i];//此处原作者写的是cout<<flag[i][j];感觉不太符合我们对x轴与y轴的认识,故把他改了过来 138 } 139 cout<<endl; 140 } 141 } 142 bool check(int x,int y)//检查是否越界 143 { 144 if(x>20 || y>20 || x<0 || y<0) 145 return false; 146 else 147 return true; 148 }