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;

删除 -1,因为 nextInt(n) 会给你一个“介于 0(包括)和 n(不包括)之间的数字”

于 2013-09-07T00:09:54.620 回答
0

就我个人而言,我会从一个List按钮开始,当它被选中时删除每个按钮,这将更容易确定什么被选中,什么没有被选中,但是让我们使用我们所拥有的......

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的 a中放置一个。List然后我们使用Collections.shuffle随机化列表,然后我们抓取第一个元素(因为想要抓取的东西)并继续游戏逻辑......

这消除了无限循环试图找到不存在的空闲插槽的可能性......

于 2013-09-07T00:54:01.953 回答
0

单人井字游戏当然可以完成,随机选择的策略也很好。您注释掉的播放器代码中的第一个特定错误是无限的 do-while 循环。循环上的条件总是计算为真,因为chosen[selected - 1]总是真(如果它是假的,你在条件检查之前将它设置为真),因此再次循环。

你的 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 按钮)之间的比较不会像您期望的那样工作
  • 响应用户输入(即单击其中一个按钮)调用此方法。计算机不会提供任何此类输入,因此您应该有另一个触发器来调用轮到计算机运行代码。最简单的就是在轮到用户之后运行它

在不对您的整体编码风格和策略进行任何重大更改的情况下,我将尝试将 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 回答