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 }