0

Java ボタンをランダムに選択するにはどうすればよいですか。ユーザーが CPU または別のプレイヤーをプレイする三目並べゲームを作成しようとしています。2 人のプレーヤーで正常に動作していますが、1 人のプレーヤーのゲームで立ち往生しています。それが可能かどうかはわかりませんが、CPU チェックのボタンをランダムに選択して、以前に選択されているかどうかを確認し、選択した正方形に x または o を割り当てます。

public void buttonSelected(ActionEvent click) {

    Object source = click.getSource();

    // loop through to see which button has been selected
    if(onePlayer){ 


        // User Vs CPU
        /*if((turn % 2 == 0)){// CPU Turn
            int selected;
            do {
                selected = new Random().nextInt(btnEmpty.length );
                if (chosen[selected -1] == false){
                    chosen[selected -1] = true;
                }

            }while (chosen[selected -1] == true);

            source =  Integer.valueOf(selected);
            for(int i=1; i<= btnNotSelected.length; i++) {
                if(source == btnNotSelected[i] && turn < 10) {
                    btnClicked = true; // user has selected a button
                    // Check which user selected button and insert appropriate x or y
                    btnNotSelected[i].setText("X");
                    btnNotSelected[i].setEnabled(false); // disable selected button
                    pnlPlayingField.requestFocus(); // highlight selected panel 
                }   
            } 

        }
        else{ //User Turn
            for(int i=1; i<=9; i++) {
                if(source == btnNotSelected[i] && turn < 10) {
                    btnClicked = true; // user has selected a button
                    // Check which user selected button and insert O
                    btnNotSelected[i].setText("O");
                    btnNotSelected[i].setEnabled(false);
                    chosen[i] = true;// disable selected button
                    pnlPlayingField.requestFocus(); // highlight selected panel
                }
            }

        }  */
        turn++;  
    }

    else if(twoPlayer){
        for(int i=1; i<=9; i++) {
            if(source == btnNotSelected[i] && turn < 10) {
                btnClicked = true; // user has selected a button
                // Check which user selected button and insert appropriate x or y
                if(turn % 2 == 0){
                    btnNotSelected[i].setText("X");
                }
                else{
                    btnNotSelected[i].setText("O");
                }
                btnNotSelected[i].setEnabled(false); // disable selected button
                pnlPlayingField.requestFocus(); // highlight selected panel
                turn++;
    }`
4

3 に答える 3

0
int selected;
do {
       selected = new Random().nextInt(btnEmpty.length );
       if (chosen[selected -1] == false){
          chosen[selected -1] = true;
       }

}while (chosen[selected -1] == true);

上記のコードは無限ループです。次のように変更します。

int selected;
do {
    selected = new Random().nextInt(btnEmpty.length);
}while (chosen[selected] == true);
chosen[selected] == true;

nextInt(n) は「0 (含む) と n (含まない) の間」の数値を与えるため、-1 を削除します。

于 2013-09-07T00:09:54.620 に答える
0

1 人用の三目並べゲームは確実に実行できます。ランダムに選択する戦略は問題ありません。コメントアウトされた 1 つのプレーヤー コードの最初の特定のエラーは、無限の do-while ループです。ループの条件chosen[selected - 1]は常に true と評価されるため (false の場合は、条件チェックの直前に true に設定します)、再度ループします。

do-while は次のようになります。

do {
    selected = new Random().nextInt(btnEmpty.length);
} while (chosen[selected - 1] == true);
chosen[selected - 1] = true;

そのようにして、while ループ条件の後に選択したフラグを設定しています。

onePlayer ブロックで見られる追加の問題がいくつかあります。

  • CPU ターン ブロックでは、source(ここでは整数) とbtnNotSelected[i](twoPlayer ブロックの作業コードに基づく Java ボタンを想定) の比較は期待どおりに機能しません。
  • このメソッドは、ボタンの 1 つをクリックしているユーザー入力に応答して呼び出されます。コンピューターはそのような入力を提供しないため、コンピューターの順番でコードの実行を呼び出す別のトリガーが必要です。最も簡単なのは、ユーザーのターン後に実行することです

全体的なコーディング スタイルと戦略を大幅に変更することなく、onePlayer の部分をより機能的なものに変換しようとします。

public void buttonSelected(ActionEvent click) {

    Object source = click.getSource();

    if (onePlayer) {

        // User's turn first
        source.setText("O");
        source.setEnabled(false);
        pnlPlayingField.requestFocus();

        // Mark that button as chosen
        for (int i = 0; i < btnNotSelected.length; i++) {
            if (source == btnNotSelected[i]) {
                chosen[i] = true;
                break;
            }
        }

        // Increment turn counter
        turn++;

        // Check if game is over
        if (turn > 9) return;

        // CPU turn
        int selected;
        do {
            selected = new Random().nextInt(btnNotSelected.length);
        } while (chosen[selected]);

        chosen[selected] = true;
        btnNotSelected[selected].setText("X");
        btnNotSelected[selected].setEnabled(false);
        pnlPlayingField.requestFocus();
        turn++;

    } else if (twoPlayer) {
        /* your preexisting twoPlayer code */
    }

}
于 2013-09-07T01:06:37.813 に答える
0

私は、個人的にはList、ボタンの 1 つから始めて、選択されたときにそれぞれを削除します。これにより、選択されているものと選択されていないものを簡単に判断できますが、取得したもので作業しましょう...

List<Integer> free = new ArrayList<Integer>(chosen.length);
for (int index = 0; index < chosen.length; index++) {
    if (!chosen[index]) {
        free.add(index);
    }
}

if (!free.isEmpty()) {
    Collections.shuffle(free);
    int selected = free.get(0);

    // Continue with game logic
}

基本的に、これは「空き」スロットを表す に をInteger配置します。List次に、 を使用Collections.shuffleしてリストをランダム化し、最初の要素を取得して (取得するものが必要なため)、ゲーム ロジックを続行します...

これにより、存在しない空きスロットを見つけようとする無限ループの可能性がなくなります...

于 2013-09-07T00:54:01.953 に答える