小遊戲二之---------------五子棋

1.五子棋是一比較容易寫的小遊戲,很適合用來練手,作爲練手,不必弄太複雜,所以就不弄電腦AI了,只是玩家之間的對戰(AI下次再寫)。

2.五子棋的難點在於如何判斷輸贏,其實很簡單。每次下棋,就判斷該棋子的四個方向,橫豎方向,還有兩個對角線(分成四個部分,左上,左下,右上,右下)方向是否滿足五個棋子。

3.用一個二維數組來表示棋盤(chessBoard[N][N]),值等於0,就表示該位置沒有棋子,1表示該位置是玩家1的棋子,2則是玩家2的棋子。

4.運行結果如下:

 

 

代碼如下(C++),有詳細註釋

  1 #include<iostream>
  2 #include<string>
  3 #include<stdlib.h> 
  4 #define N 11 //棋盤大小 
  5 using namespace std;
  6 
  7 //五子棋遊戲 
  8 //人對戰人 
  9 
 10 void printBoard(int  chessBoard[N][N]);//打印棋盤 
 11 //驗證輸入是否有效,不能超過 N,不能輸入除了數字以外的東西 
 12 bool isValid(string row,string col,int chessBoard[N][N]);
 13 //玩遊戲函數 
 14 void playGame(int chessBoard[N][N],int player);
 15 //判斷輸贏情況 
 16 void judge(int chessBoard[N][N],int row,int col,int player);
 17 //判斷棋盤是否滿了 
 18 bool isFull(int chessBoard[N][N]);
 19 int main()
 20 {
 21     int chessBoard[N][N]={0};//N*N 棋盤 
 22                           //0表示該位置還沒有棋子 1表示玩家1的棋子 2玩家2的棋子 
 23     printBoard(chessBoard);
 24     int player;
 25     while(true)
 26     {    
 27         player=1;//1 表示玩家1,1先手 
 28         playGame(chessBoard,player);
 29         player=2;//2 表示玩家2 
 30         playGame(chessBoard,player);
 31     }
 32     return 0;
 33 }
 34 
 35 void printBoard(int  chessBoard[N][N])
 36 {    
 37 
 38     int i,j;
 39     for(i=0;i<N;i++)
 40         cout<<"  "<<i+1<<" ";
 41     cout<<endl;
 42     for(i=0;i<N;i++)
 43     {
 44         for(j=0;j<N;j++)
 45         {    
 46             if(chessBoard[i][j]==1)
 47                 cout<<"|_o_"; //o表示玩家1棋子 
 48             else if(chessBoard[i][j]==2)
 49                 cout<<"|_x_";//x表示玩家2棋子 
 50             else
 51                 cout<<"|___"; 
 52         }
 53         cout<<"|";
 54         cout<<" "<<i+1<<"  "<<endl<<endl;
 55     }
 56 }
 57 
 58 
 59 bool isValid(string row,string col,int chessBoard[N][N])
 60 {    
 61     int r=atoi(row.c_str());//字符串轉int 
 62     int c=atoi(col.c_str());//如果不是純數字字符串,則返回零,表示轉換失敗 
 63     if(r==0||c==0)//返回零,轉換失敗,輸入不正確 
 64         return false;
 65     r--;//數組下標從零開始 
 66     c--;//而輸入的行列是從1開始的,所以減一 
 67     
 68     //超過棋盤大小,輸入無效 
 69     if(r<0||r>N||c<0||c>N)
 70         return false;
 71     //該位置不是空,輸入無效 
 72     if(chessBoard[r][c]!=0)
 73         return false;
 74     return true;
 75 }
 76 
 77 void playGame(int chessBoard[N][N],int player)
 78 {    
 79     string row,col;
 80     cout<<"玩家 "<<player<<" 回合,輸入下棋的位置(行 列): "; 
 81     cin>>row>>col;
 82     //直到輸入有效則退出循環 
 83     while(isValid(row,col,chessBoard)==false)
 84     {
 85         cout<<"輸入無效,棋盤的行或列不能超過棋盤大小 "; 
 86         cout<<"請再次輸入"<<endl;
 87         cout<<"玩家 "<<player<<" 回合,輸入下棋的位置(行 列): "; 
 88         cin>>row>>col;
 89     }
 90     int r=atoi(row.c_str());//sting 轉 int 
 91     int c=atoi(col.c_str());
 92     r--;
 93     c--;
 94     if(player==1)//玩家1 
 95         chessBoard[r][c]=1;
 96     else
 97         chessBoard[r][c]=2;
 98         
 99     //打印本次棋盤 
100     printBoard(chessBoard);
101     //判斷輸贏 
102     judge(chessBoard,r,c,player);
103 }
104 
105 void judge(int chessBoard[N][N],int row,int col,int player)
106 {
107     int i;
108     int num[6]={0};
109     for(i=0;i<N;i++)
110     {    //判斷行 
111         if(chessBoard[row][i]==player)
112             num[0]++;
113         else 
114             num[0]=0; 
115         //等於5則贏    
116         if(num[0]==5)
117             break;
118             
119         //判斷列 
120         if(chessBoard[i][col]==player)
121             num[1]++;
122         else
123               num[1]=0;
124               
125         if(num[1]==5)
126             break;
127     }
128     //對角線,只需判斷五個即可 
129     for(i=0;i<5;i++)
130     {    
131         //左上部分 
132         if(row-i>=0&&col-i>=0&&chessBoard[row-i][col-i]==player)
133             num[2]++;
134         //右下部分 
135         if(row+i<N&&col+i<N&&chessBoard[row+i][col+i]==player)
136             num[3]++;
137     }
138     
139     for(i=0;i<5;i++)
140     {    //右上部分 
141         if(row+i<N&&col-i>=0&&chessBoard[row+i][col-i]==player)
142             num[4]++;
143         //左下部分 
144         if(row-i>=0&&col+i<N&&chessBoard[row-i][col+i]==player)
145             num[5]++;
146     }
147     //這六個部分是否有連續相同5個棋子的 
148     for(i=0;i<6;i++)
149         if(num[i]==5)
150         {
151             cout<<"玩家 "<<player<<""<<endl;
152             exit(0);//退出程序 
153         }
154     //棋盤滿,平局    
155     if(isFull(chessBoard)==true)
156     {
157             cout<<"平局"<<endl;
158             exit(0);//退出程序 
159     }     
160 }
161 
162 bool isFull(int chessBoard[N][N])
163 {    
164 
165     for(int i=0;i<N;i++)
166         for(int j=0;j<N;j++)
167             if(chessBoard[i][j]==0)
168                 return false;
169     return true;
170 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章