2017-04-07 31 views
0

ゲーム "Tic tac toe" 1ヶ月以上のコーディングとこれまでの私の2番目に大きなプロジェクトでした)。それはうまく動作します。私の問題は、自分のコードを「クリーンアップ」することです。'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の座標リストの配列リストには、勝利パターンごとに8つのハードコードされた3要素長の配列が含まれています(これは、 'contains'メソッドを配列リストに変換して 'containsAll'メソッドを2つの配列リスト(私はスタックオーバーフローフォーラムからこのアイデアを得た、驚き驚き))。ちなみに、それは私がメソッドまで「含む」ように(player1Selections、winningArray1)が含まれ、私が設定されていることを言及することは、真の正確際は、アレイ1の勝利の配列リストが含まれていないプレイヤー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'ステートメントのためにそれらをもう一度書くのではなく、whileループの条件。私は 'このif文の条件は、まだ有効な' while 'ループとまったく同じであると言っています。

この質問は回答できないかもしれませんが、これは不可能なことであることがわかっていると便利です。

+2

これらの条件をすべてテストし、真または偽を返す関数を作成できます。 – Shadow

+0

"*私はちょうどJavaプログラムの作成を終えました... *"これはJavaかJavaScriptですか? – RobG

+0

条件の大きなリストを作成する –

答えて

0

「winningArray1」〜「winningArray8」に配列のリストを作成します。そのリストを "winningMoves"と呼ぶことにしましょう。 player2selectionsが独自のカスタムクラスの場合は、リスト全体を反復処理する「contains」関数を追加することができます。次に、あなたのループは、より多くのようになります。

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

いくつかのボードゲームがboard.contains(" ")のような文字列操作を使用しての代わりに、各座標を綴り、その後、単一のStringとしてボードを表すことによって単純化することができます。