《Java語言程式設計》編程練習8.9(遊戲:#字遊戲)

  • 2019 年 10 月 12 日
  • 筆記

8.9 (遊戲:#字遊戲)在並字遊戲中,兩個玩家使用各自的標誌(一方用X則另一方就用O),輪流填寫3×3的網格中的某個空格。當一個玩家在網格的水平方向、垂直方向或者對角線方向上出 現了三個相同的X或三個相同的O時,遊戲結束,該玩家獲勝。平局(沒有贏家)是指當網格中所有的空格都被填滿時沒有任何一方的玩家獲勝的情況。創建一個玩#字遊戲的程式。 程式提示兩個玩家可以選擇X和O作為他們的標誌。當輸人一個標誌時,程式在控制台上 重新顯示棋盤,然後確定遊戲的狀態(是獲勝、平局還是繼續)。下面是一個運行示例:

 

 

 

 以下為實現程式碼:

  1 /**        fileName:game.java    2  *         作用:#字遊戲    3  *         創建日期:2019年10月10日    4  *         修改日期:2019年10月12日    5  *         mail:[email protected]    6  */    7 import java.util.Scanner;    8    9  public class game{   10   11      public static void main(String[] args){   12         Scanner input = new Scanner(System.in);   13   14          //玩家X O   15         String player1 = "X";   16         String player2 = "O";   17   18         //棋盤數組   19         String[][] chess = {{" "," "," "},   20                             {" "," "," "},   21                             {" "," "," "}};   22   23         /** 結束標誌,ture為未有輸贏結果,false為已有玩家贏或者平局 */   24         boolean endMask = true;   25   26         do {   27             //列印棋盤   28             chess = emu(chess);   29             //玩家1下棋   30             System.out.print("請玩家" + player1 + "輸入橫坐標(1 - 9): ");   31             int player1Scanner = input.nextInt();   32   33             //將玩家1下的結果輸入到數組中   34             while(true){   35                 if(chess[(player1Scanner - 1)/3][(player1Scanner - 1)%3] != player2){   36                     chess[(player1Scanner - 1)/3][(player1Scanner - 1)%3] = player1;   37                     break;   38                 }   39                 else{   40                     System.out.print("請玩家" + player1 + "重新輸入橫坐標(1 - 9): ");   41                     player1Scanner = input.nextInt();   42                 }   43             }   44             //列印棋盤   45             chess = emu(chess);   46   47             //判斷玩家1遊戲結果   48             switch (maskGameResults(chess, player1)){   49                 case 0: break;   50                 case 1: System.out.println("玩家 " + player1 + " 獲得勝利!");   51                         endMask = false;   52                         break;   53                 case -1:    System.out.println("遊戲平局,請重來!");   54                             endMask = false;   55                             break;   56             }   57   58             //玩家2下棋   59             if(endMask){   60                 System.out.print("請玩家" + player2 + "輸入橫坐標(1 - 9): ");   61                 int player2Scanner = input.nextInt();   62                 //將玩家2下的結果輸入到數組中   63   64                 while(true){   65                     if(chess[(player2Scanner - 1)/3][(player2Scanner - 1)%3] != player1){   66                         chess[(player2Scanner - 1)/3][(player2Scanner - 1)%3] = player2;   67                         break;   68                     }   69                     else{   70                         System.out.print("請玩家" + player2 + "重新輸入橫坐標(1 - 9): ");   71                         player2Scanner = input.nextInt();   72                     }   73                 }   74   75                 chess = emu(chess);   76                 switch (maskGameResults(chess, player2)){   77                     case 0: break;   78                     case 2: System.out.println("玩家 " + player2 + " 獲得勝利!");   79                             endMask = false;   80                             break;   81                     case -1:    System.out.println("遊戲平局,請重來!");   82                                 break;   83                 }   84             }   85             //列印棋盤   86   87         }while(endMask);   88   89      }   90   91      /** 列印棋盤 */   92      public static String[][] emu(String [][] chess){   93         System.out.println("  -------------------");   94         for(int i = 0; i<3; i++){   95             for(int j = 0; j<3; j++ ){   96                 System.out.printf("  |%3s", chess[i][j]);   97             }   98             System.out.println("  |");   99         System.out.println("  -------------------");  100         }  101         return chess;  102      }  103  104      /** 判斷玩家輸贏 */  105      public static int maskGameResults(String m[][], String player){  106         //棋子連續數  107         int numberRow = 0;  108         if( (m[0][0]==player && m[0][1]==player && m[0][2]==player) ||  109             (m[1][0]==player && m[1][1]==player && m[1][2]==player) ||  110             (m[2][0]==player && m[2][1]==player && m[2][2]==player) ){  111                 if(player == "X")  112                     return 1;  113                 else  114                     return 2;  115         }  116         if( (m[0][0]==player && m[1][0]==player && m[2][0]==player) ||  117             (m[0][1]==player && m[1][1]==player && m[2][1]==player) ||  118             (m[0][2]==player && m[1][2]==player && m[2][2]==player) ){  119                 if(player == "X")  120                     return 1;  121                 else  122                     return 2;  123         }  124         if( (m[0][0]==player && m[1][1]==player && m[2][2]==player) ||  125             (m[0][2]==player && m[1][1]==player && m[2][0]==player) ){  126                 if(player == "X")  127                     return 1;  128                 else  129                     return 2;  130         }  131         for(int i = 0; i<3; i++){  132             for(int j = 0; j<3; j++){  133                 if(m[j][i] == " ")  134                     return 0;  135             }  136         }  137         return -1;  138      }  139  }

新手剛學java,判斷輸贏的演算法比較死,如有更好的解決方法請評論區留言。