0

私は X/O ゲームを構築している Java のミニ プロジェクトに取り組んでいます。私は、プログラムが「X」か「O」かを示す次の記号を判断する部分にいます。そこで、イベントリスナーをセットアップし、ユーザーがボタンをクリックするのを待ちます。そして、各ボタンに対して次のことを行います。

Button7.setBounds(50,180,80,30);
panel.add(Button7);
Button7.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent event) {
    int countX = 0;
    int countO = 0;
    int difxo = 0;
    String xo = "";
    if (Button1.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button2.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button3.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button4.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button5.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button6.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button7.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button8.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button9.getText().equals("X"))
    {
        countX += 1;
    }
    else
    {
        countX += 0;
    }
    if (Button1.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button2.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button3.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button4.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button5.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button6.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button7.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button8.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button9.getText().equals("O"))
    {
        countO += 1;
    }
    difxo = countX - countO;
    if (difxo == 0)
    {
    xo = "X";
    }
    else if (difxo == 1)
    {
    xo = "O";
    }
    countX = 0;
    countO = 0;
    Button7.setText(xo);
    }
    });

したがって、X/O ゲーム (開始記号が X の場合) では、基本的な減算を行うことで、どの記号が後にあるかを偽ることができます。減算の結果が 1 の場合: ボタンの記号は "O" でなければならず、結果が 0 の場合は記号は "X" でなければなりません。しかし、私が作ったプログラムでは、ボタンクリックイベントごとに同じことを繰り返すと、「X」「O」「X」「O」ではなく、「X」「O」「X」「X」「X」が得られます.. . など、「X」と「O」を数えるたびに減算を行うため、なぜそれが起こっているのかわかりません。ありがとう。

4

1 に答える 1

0

あるべきターンの状態を保持する「ターン」と呼ばれるクラスフィールドを作成します。列挙型にするのが最善ですが、文字列を保持することもできます。その後、ターンが変わるたびに値を変更します。

たとえば、ターン変数が文字列を保持し、プログラムに X = "X" と Y = "Y" の 2 つの文字列定数がある場合、次のコードを使用してターンを交換できます。

turn = turn.equals(X) ? Y : X;

その他の提案:

  • 絶対配置は避けてください。を使用する JPanel に JButton をGridLayout(3, 3)配置し、レイアウト マネージャにそれらを配置してサイズを調整させる方がはるかに簡単です。
  • Java の命名規則を学び、それに従ってください。クラス、インターフェイス、列挙型の名前は大文字で始まり、変数とメソッドは小文字で始まります。
  • 1 つの ActionListener ですべてのゲーム ボタンを操作できます。
  • ボタンが押されたときにアクションを実行する前に、ボタンがまだ選択されていないことを確認してください。
  • ppeterka 66 が賢明に示唆しているように、ターン変数は isXTurn と呼ばれる単純なブール変数である可能性があり、チェックすることで x ターン動作を行うことができif (isXTurn)(もちろん、else ブロックで y ターン動作を行う)、その値しておりturn = !turnます。
  • 他の人が示唆しているように、JButton の配列を使用して、コーディングとデバッグを簡素化します。

単一の ActionListener に関しては、疑似コードでは次のようになります。

  @Override
  actionPerformed method
     First check if gameOver is true. If so, return;

     use e.getSource() to get the button pressed and put it 
        into a JButton local variable, button
     Use a for loop to iterate through the button array to 
        find out which button is pressed. Store in a variable(s)
     Set a String variable called text with the button's text.
     if the button's text has already been set (it's not empty) then return;
     set the button's text with the appropriate text based on the state of turn
     call checkForWin() method. Pass in the button's position in the button array.
     swap turns
   end of actionPerformed method
于 2013-09-07T23:09:18.140 に答える