8.9 (游戲:#字游戲)在並字游戲中,兩個玩家使用各自的標誌(一方用X則另一方就用O),輪流填寫3x3的網格中的某個空格。當一個玩家在網格的水平方向、垂直方向或者對角線方向上出 現了三個相同的X或三個相同的O時,游戲結束,該玩家獲勝。平局(沒有贏家)是指當網格中所有的空格都被填滿時沒有任何一方的玩 ...
8.9 (游戲:#字游戲)在並字游戲中,兩個玩家使用各自的標誌(一方用X則另一方就用O),輪流填寫3x3的網格中的某個空格。當一個玩家在網格的水平方向、垂直方向或者對角線方向上出 現了三個相同的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,判斷輸贏的演算法比較死,如有更好的解決方法請評論區留言。