五子棋源码解析

 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 } 
原文地址:https://www.cnblogs.com/Zblogs/p/3257908.html