2017-04-07 107 views
0

我剛寫完遊戲「Tic tac toe」的Java程序(我一直是java-編碼一個多月,這是迄今爲止我的第二大項目)。它工作正常,一切;我的問題更多的是「清理」我的代碼。在代碼中的主要動作是這樣的大「而」循環,開始涉及這一醜惡聲明:如何調用定義'while'循環以在'while'循環內定義'if'語句的條件

while (contains(player1Selections, winningArray1) && 
contains(player1Selections, winningArray2) && 
contains(player1Selections, winningArray3) && 
contains(player1Selections, winningArray4) && 
contains(player1Selections, winningArray5) && 
contains(player1Selections, winningArray6) && 
contains(player1Selections, winningArray7) && 
contains(player1Selections, winningArray8) && 
contains(player2Selections, winningArray1) && 
contains(player2Selections,winningArray2) && 
contains(player2Selections,winningArray3) && 
contains(player2Selections, winningArray4) && 
contains(player2Selections, winningArray5) && 
contains(player2Selections, winningArray6) && 
contains(player2Selections, winningArray7) && 
contains(player2Selections, winningArray8)) { 

爲了澄清,我在這裏檢查,如果玩家1的座標選擇或數組列表玩家2的座標選擇的數組列表包含每個可能的勝利模式的八個硬編碼的3元素長數組中的任何一個(我在我的布爾'contains'方法中將其轉換爲數組列表,因此我可以使用'containsAll'方法兩個數組列表(我從一個堆棧溢出論壇獲得這個想法,驚喜))。

順便說一句,它需要提的是,我把我的「包含」方法了,這樣包含(player1Selections,winningArray1)出來真正是時候不播放器1的選擇的數組列表含有中獎陣列1的數組列表 - 這就是循環工作的原因(當一個玩家的選擇包含一個獲獎數組列表時,它會停止)。 (對不起,關於令人困惑的名字。)

那麼我的問題是什麼?我的問題是,當玩家1或玩家2獲勝時,我需要「玩家[x]勝利!」在最後一張紙板印出之前出現,顯示出最後一張紙牌和十字架的位置(並且當有一張平局時,我需要在最後一張紙板印出之前出現「抽籤」一詞),以及我擁有的方式解決了這是超級混亂。循環的主要部分由這樣的代碼:

if (togglePlayer == 0) { 
    if (n1 == 0 && n2 == 0) { 
    if (coordinate00.equals(" ")) { // coordinate00 is a string 
    coordinate00 = "X"; 
    player1Selections.add(0.0);   //the hard-coded winning-arrays consist of doubles in this format 
    togglePlayer ++;}     
    else { System.out.println("Position already occupied."); } 
    }     // this is closing the second 'if' statement but not the first, which gets closed only before I start writing out similar stuff for player 2 

這裏是我已經把循環的最後一部分中(像上面的所有語句後),爲解決我的問題:

if (contains(player1Selections, winningArray1) && 
    contains(player1Selections, winningArray2) && 
    contains(player1Selections, winningArray3) && 
    contains(player1Selections, winningArray4) && 
    contains(player1Selections, winningArray5) && 
    contains(player1Selections, winningArray6) && 
    contains(player1Selections, winningArray7) && 
    contains(player1Selections, winningArray8) && 
    contains(player2Selections, winningArray1) && 
    contains(player2Selections,winningArray2) && 
    contains(player2Selections,winningArray3) && 
    contains(player2Selections, winningArray4) && c 
    contains(player2Selections, winningArray5) && 
contains(player2Selections, winningArray6) && 
    contains(player2Selections, winningArray7) && 
    contains(player2Selections, winningArray8)) { 
     if ((!coordinate00.equals(" ")) & (!coordinate10.equals(" ")) & 
     (!coordinate20.equals(" ")) & (!coordinate01.equals(" ")) & 
     (!coordinate11.equals(" ")) & 
    (!coordinate21.equals(" ")) & (!coordinate02.equals(" ")) & 
    (!coordinate12.equals(" ")) & (!coordinate22.equals(" "))) { 
     System.out.println("Draw"); 
     System.out.println("\n" + coordinate00 + "|" + coordinate10 + "|" + coordinate20 + "\n" + "-----" + "\n" + coordinate01 + "|" + coordinate11 + "|" + coordinate21 + "\n" +"-----" + "\n" + coordinate02 + "|" + coordinate12 + "|" + coordinate22 + "\n"); 
     return; 
    } 
    else { System.out.println("\n" + coordinate00 + "|" + coordinate10 + "|" + coordinate20 + "\n" + "-----" + "\n" + coordinate01 + "|" + coordinate11 + "|" + coordinate21 + "\n" +"-----" + "\n" + coordinate02 + "|" + coordinate12 + "|" + coordinate22 + "\n"); 

顯然,關於這個代碼最後一位真正愚蠢的事情是,我已經從字面上不得不重複的逐字「而」循環條件,我的「如果」語句,即使「如果」聲明仍然在'while'循環內部。我不得不這樣做,因爲我無法找到更簡潔的方法來確保程序只在遊戲未結束時纔打印棋盤。

現在,我對如何減少這個問題有了一個想法,但我不知道它是否可能......基本上,我只是想知道是否有任何方法可以「 'while'循環條件,而不是再次寫出'if'語句。我想說'這個if語句的條件與仍然有效的'while'循環完全相同。

這個問題可能是無法回答的,但知道這是不可能的事情也是有用的。

+2

您可以創建一個函數來測試所有這些條件,並返回true或false。 – Shadow

+0

「*我剛寫完一個Java程序...... *」這個Java或JavaScript也是如此? – RobG

+0

使您的條件功能大列表 –

回答

0

通過「winningArray8」數組列表來製作您的「winningArray1」。我們稱之爲「贏得移動」列表。如果player2selections是你自己的自定義類,你可以添加一個「contains」函數遍歷整個列表。然後,你的循環會看起來更像:

while (player1Selections.contains(winningMoves) 
    || player2Selections.contains(winningMoves)) { ... } 

一些棋盤遊戲可以由代表董事會作爲一個單一的字符串,然後使用字符串操作,如board.contains(" ")而不是拼寫出每個座標被簡化。