井字游戏VS。 CPU 模式在播放 3-4 回合后停止(JAVA SWING)

Tic-Tac-Toe VS. CPU Mode stopping after 3-4 turns played (JAVA SWING)

我制作了一个井字游戏,是的,你们中的一些人可能认为我的程序不是很好。我是一名 新程序员 并且 在本游戏之前从未使用过 swing 或任何与 JAVA GUI 相关的东西。该程序主要有效。当您编译并运行它并单击玩家对计算机时,游戏会在 3-4 回合卡住。几个小时以来,我一直在试图找出问题所在,但似乎无法弄清楚。 代码很长...感谢任何帮助!

代码如下: http://txt.do/6dvm

你的电脑逻辑有点……有问题:

int row = (int)(2*Math.random())+1;
int column = (int)(2*Math.random())+1;
while (button[row][column].isEnabled()==false)
{
  row = (int)(2*Math.random())+1;
  column = (int)(2*Math.random())+1;
}

在一个大小为 3x3 的数组中,您看到它生成的数字有什么问题吗?我在这里看到的是正在生成数字 1<=x<=2。这意味着第 1 列(或 0 的数组索引)中没有任何内容被选中。这意味着当除了第一行和第一列以外的所有位置都被占用时,您将陷入无限循环。逻辑应为:

int row = (int)(3*Math.random());
int column = (int)(3*Math.random());
while (button[row][column].isEnabled()==false)
{
  row = (int)(3*Math.random());
  column = (int)(3*Math.random());
}

或更好:

int row, column;
do
{
  row = (int)(3*Math.random());
  column = (int)(3*Math.random());
} while (!button[row][column].isEnabled()); // stop with the == boolean

如果没有启用任何行,这仍然会给您带来无限循环,并且随机选择的实现非常糟糕,可能需要一段时间,这是一个更好的方法:

// list containing available locations for the computer to choose
java.util.List<int[]> availableIndexes = new java.util.ArrayList<int[]>();

// go through all our buttons and make a list of ones that are enabled
for(int r=0;r<button.length;r++) {
    for(int c=0;c<button[r].length;c++) {
        if(button[r][c].isEnabled()) {
            availableIndexes.add(new int[]{r, c});
        }
    }
}

// see if we can even do anything
if(availableIndexes.isEmpty()) {
    // cats game, i dont know what you want to do there....
} else {
    // choose one of our avaible buttons at random
    int [] randomButtonIndex = availableIndexes.get((int)(Math.random()*availableIndexes.size()));
    int row = randomButtonIndex[0];
    int column = randomButtonIndex[1];


    // .... continue what you were doing
}


我看到的评论中的其他一些内容:

  • 学习使用 IDE,Netbeans、IntelliJ 或 Eclipse 都是不错的选择。
  • 充分利用数据结构、循环和方法。 button[0][0].addActionListener(new playerVSComputer()); button[0][1].addActionListener(new playerVSComputer());.... 之类的事情可以用循环来完成,这将帮助您的代码变得更加清晰。

如需进一步帮助,请尝试在 code review section of stack exchange 上发帖提问。