1

私は数週間前に Java/Android でプログラミングを始めました。小さな三目並べゲームを Android アプリとして作成したいのですが、勝者をチェックする方法に問題があります。それは次のとおりです。

 public void checkForWinner() { 

        if( taken[0] && taken[3] && taken[6]  ||
            taken[0] && taken[1] && taken[2] ||
            taken[2] && taken[5] && taken[8] ||
            taken[6] && taken[7] && taken[8] ||
            taken[0] && taken[4] && taken[8] ||
            taken[2] && taken[4] && taken[6] ||
            taken[1] && taken[4] && taken[7] ||
            taken[3] && taken[4] && taken[5] == 1 ){}
}

ここに、9 つの整数を保持する take という配列があります。これらの整数のそれぞれは、プレイヤー 1 がそのブロックを所有していることを意味する 1 か、プレイヤー 2 がそのブロックを所有していることを意味する 2 です。現在、プレイヤー1が勝者になる可能性のあるすべてのシナリオを試していますが、日食はそれを教えてくれThe operator && is undefined for the argument type(s) int, intます. エラーは、if ステートメントの各行の最初の論理演算に対してのみ表示されているようです。たとえば、最初のエラーが発生しtaken[0] && taken[3]て次の行まで消えます。

4

6 に答える 6

3

または、taken [n]の値をチェックして、コードがより明確になると思われる場合は、1または2を保持しているかどうかを確認できます。

(taken[0]==1 && taken[3]==1 && taken[6]==1)

&&演算子はブールオペランドを期待していることに注意してください...したがって、int配列では期待どおりに機能しません。

于 2012-06-28T19:46:59.340 に答える
2

&& を == に入れ替えます。それらがすべて同じ値であるかどうかを確認しようとしています。これが勝者を示します。必ず括弧を使用して並べ替えてください。1 つの勝利条件は次のようになります。

((taken[0] == taken[3]) && (taken[0] == taken[6]))

ただし、これは、どのプレイヤーが勝ったかではなく、一部のプレイヤーが勝ったことを示すだけです。誰かが勝ったと判断されたら、どのプレイヤーが最後に手を出したかを確認し、そのプレイヤーを勝者として宣言することができると思います。

于 2012-06-28T19:44:07.213 に答える
1

ここに、9 つの整数を保持する take という配列があります。これらの整数のそれぞれは、プレイヤー 1 がそのブロックを所有していることを意味する 1、またはプレイヤー 2 がそのブロックを所有していることを意味する 2 です。

その場合、論理演算子をビットごとの演算子に置き換えることができます。

int winner = taken[0] & taken[3] & taken[6]
           | taken[0] & taken[1] & taken[2]
           | taken[2] & taken[5] & taken[8]
           | taken[6] & taken[7] & taken[8]
           | taken[0] & taken[4] & taken[8]
           | taken[2] & taken[4] & taken[6]
           | taken[1] & taken[4] & taken[7]
           | taken[3] & taken[4] & taken[5];

変数winnerには、プレイヤー 1 が勝った場合は 1、プレイヤー 2 が勝った場合は 2、どちらも勝てなかった場合は 0、両方が勝った場合は 3 が含まれます (これはおそらくゲームでは不可能です)。

于 2012-06-28T20:03:44.823 に答える
1

1)&&または||演算子は値int用であるため、変数には使用できませんboolean

2) 括弧を使用して、次のような条件をグループ化します

 if (
      (taken[0]==1 && taken[3]==1 && taken[6]==1)||
      (taken[0]==1 && taken[1]==1 && taken[2]==1)||
      ...
于 2012-06-28T19:52:22.800 に答える
1

ジャバでは、

if (a && b) or if (a || b) 

a と b がブール値/ブール式の場合にのみ機能します。

于 2012-06-28T19:44:47.340 に答える
0

ここには 2 つの主な問題があります。

まず、taken[0]if ステートメント内でそのまま維持できるように、true または false を返す必要があります。整数であると述べたので、true または false を返すには、 などの比較を行う必要がありますtaken[0] == 1

次に、括弧を使用していくつかのグループ化を行う必要があります。Java は空白を尊重しません。の代わりにif( taken[0] && taken[3] && taken[6] || ...、 を行う必要がありますif( (taken[0] && taken[3] && taken[6]) || ...。つまり、グループ化の各セットを括弧で囲む必要があります。

Eclipse がエラーになる理由は、&&演算子がブール値の比較専用であるためです。それはtrue && trueです。あなたはそれに整数を与えていますが、それは好きではありません。

これを解決する方法の 1 つは、解決策に到達したかどうかを判断する関数を作成することです。だから多分次のようなもの:

private boolean isSolutionPresent(int[] taken, int index1, int index2, int index3) {
    return (taken[index1] == 1 ) && (taken[index2] == 1) && (taken[index3] == 1);
}

次に、if ステートメントを次のようなものに変換できます。

if (isSolutionPresent(taken, 0, 3, 6) ||
    isSolutionPresent(taken, 0, 1, 2) ||
    isSolutionPresent(taken, 2, 5, 8) || //... etc, removing the final ==1

isSolutionPresentメソッドはブール値 (つまり、true/false) を返すため、演算子を適用できます||

于 2012-06-28T19:44:50.740 に答える