1. 程式人生 > >Java之井字棋遊戲實現

Java之井字棋遊戲實現

問題描述:
你的程式先要讀入一個整數n,範圍是[3,100],這表示井字棋棋盤的邊長。比如n=3就表示是一個3x3的棋盤。然後,要讀入n行,每行n個數字,每個數字是1或0,依次表示[0,0]到[n-1,n-1]位置上的棋子。1表示X,0表示O(大寫字母O)。
你的程式要判斷其中是否存在某一方獲勝,獲勝的條件是存在整行或整列或整條對角線或整條反對角線上是相同的棋子。如果存在,則輸出代表獲勝一方字母:X或O(大寫字母X或O);如果沒有任何一方獲勝,則輸出NIL(三個大寫字母)。
注意:所給的棋盤上的棋子分佈可能出現同一個棋子有多處滿足獲勝的條件,但是不會出現兩種棋子都獲勝的情況。


問題實現:
public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int size = 3;// 棋盤預設大小
		
		size=sc.nextInt();//使用者輸入的棋盤大小
		
		if(size>=3 && size<=100){
			int[][] bord = new int[size][size];
			boolean isWin = false;
			// 計數行
			int numFX=0,numFO=0;
			// 計數列
			int numLFX=0,numLFO=0;
			// 讀入矩陣
			for (int i = 0; i < bord.length; i++) {
				for (int k = 0; k < bord[i].length; k++) {
					bord[i][k] = sc.nextInt();
				}
			}
			// 遊戲獲勝一行都為X 或者都為O 則一方獲勝
			// 檢查行 與 列
			for (int i = 0; i < bord.length; i++) {
				numFX = 0;
				numFO = 0;
				numLFX = 0;
				numLFO = 0;
				for (int k = 0; k < bord[i].length; k++) {
					if (bord[i][k] == 1) {
						numFX++;
					} else {
						numFO++;
					}
					if (bord[k][i] == 1) {
						numLFX++;
					} else {
						numLFO++;
					}
				}
				
				if (numFX == size || numFO == size || numLFX == size || numLFO == size) {
					isWin = true;
					break;
				}
			}
			if(isWin==false){
				//檢查斜線 與 反斜線
				for (int i = 0; i < bord.length; i++) {
					numFX = 0;
					numFO = 0;
					numLFX = 0;
					numLFO = 0;
					for (int k = 0; k < bord[i].length; k++) {
						if (bord[k][k] == 1) {
							numFX++;
						} else {
							numFO++;
						}
						if (bord[k][size-k-1] == 1) {
							numLFX++;
						} else {
							numLFO++;
						}
					}
					
					if (numFX == size || numFO == size || numLFX == size || numLFO == size) {
						isWin = true;
						break;
					}
				}
			}
			
			// 輸出獲勝資訊
			if (isWin) {
				if (numFX == size||numLFX == size) {
					System.out.println("X勝");
				} else{
					System.out.println("O勝");
				}
			} else {
				System.out.println("無人獲勝");
			}
			
		}else{
			System.out.println("超出限定大小,範圍在3到99之間");
		}
		
	}

問題總結:

總覺得斜線與反斜線 判斷應該也可以融入到 行與列的迴圈裡面去,但是又要建立兩個變數,總覺的這樣比較笨,也比較亂,這樣分開寫覺得也是可以的