井字游戏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 上发帖提问。
我制作了一个井字游戏,是的,你们中的一些人可能认为我的程序不是很好。我是一名 新程序员 并且 在本游戏之前从未使用过 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 上发帖提问。