我在Java中创建了一个小TicTacToe游戏,我想编写更有效的代码,我会制作一个for循环来创建9个按钮。
我现在面临的问题是如何测试按下哪个按钮以确定胜利者。我已经注释掉了我的旧测试代码,因为它不再工作。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TicTacToe extends JFrame implements ActionListener, WindowListener{
public JFrame window = new JFrame("window");
public String letter = "";
public String lastLetter = "";
public int count = 0;
public boolean win;
public boolean isTieGame;
public static int x;
public TicTacToe()
{
window.setSize(300,300);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new GridLayout(3,3));
int x;
JButton[] b = new JButton[9];
for(x = 0; x < 9; x++)
{
b[x] = new JButton();
window.add(b[x]);
b[x].addActionListener(this);
}
window.setVisible(true);
}
public static void main(String[] args) {
new TicTacToe();
}
public void counter()
{
if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9)
{
letter = "X";
}
else
{
letter = "O";
}
}
/*
public boolean isGameOver()
{
if(b1.getText().equals(b2.getText()) && b2.getText().equals(b3.getText()) && b1.getText() != "")
{
win = true;
}
else if(b4.getText().equals(b5.getText()) && b5.getText().equals(b6.getText()) && b4.getText() != "")
{
win = true;
}
else if(b7.getText().equals(b8.getText()) && b8.getText().equals(b9.getText()) && b7.getText() != "")
{
win = true;
}
else if(b1.getText().equals(b5.getText()) && b5.getText().equals(b9.getText()) && b1.getText() != "")
{
win = true;
}
else if(b3.getText().equals(b5.getText()) && b5.getText().equals(b7.getText()) && b3.getText() != "")
{
win = true;
}
else if(b1.getText().equals(b4.getText()) && b4.getText().equals(b7.getText()) && b1.getText() != "")
{
win = true;
}
else if(b2.getText().equals(b5.getText()) && b5.getText().equals(b8.getText()) && b2.getText() != "")
{
win = true;
}
else if(b3.getText().equals(b6.getText()) && b6.getText().equals(b9.getText()) && b3.getText() != "" )
{
win = true;
}
else
{
win = false;
}
return win;
}
*/
public void endOrReset()
{
if(win)
{
JOptionPane.showMessageDialog(null, lastLetter() + " WINS!");
int playAgain = JOptionPane.showConfirmDialog(null, "Would you like to play again?", "Play Again.", JOptionPane.YES_NO_OPTION);
if(playAgain == (JOptionPane.YES_OPTION))
{
win = false;
}
else if(playAgain == JOptionPane.NO_OPTION)
{
JOptionPane.showMessageDialog(null, "Goodbye");
System.exit(0);
}
}
else if(isTieGame)
{
JOptionPane.showMessageDialog(null, "Tie Game!");
int playAgain = JOptionPane.showConfirmDialog(null, "Would you like to play again?", "Play Again.", JOptionPane.YES_NO_OPTION);
if(playAgain == JOptionPane.YES_OPTION)
{
}
else if(playAgain == JOptionPane.NO_OPTION)
{
JOptionPane.showMessageDialog(null, "Goodbye");
System.exit(0);
}
}
}
public void actionPerformed(ActionEvent a) {
count++;
counter();
//isGameOver();
endOrReset();
((JButton)a.getSource()).setText(letter);
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
public String lastLetter()
{
String lastLetter;
if(letter == "O")
{
lastLetter = "X";
}
else
{
lastLetter = "O";
}
return lastLetter;
}
public boolean isTieGame()
{
if(count >= 9 && win == false)
{
isTieGame = true;
}
return isTieGame();
}
}
我喜欢做的是独立于GUI的9长度数组来保存游戏状态,如下所示:
0 1 2
3 4 5
6 7 8
如果你仔细想想,指数在哪里
3*(index/3) + index % 3
这通常是一个枚举数组,但也可以使用字符串数组,
public enum State
{
EMPTY,
X,
O;
}
然后
State[] gridState = new State[9];
for(int i = 0; i < gridState.length; i++) {
gridState = State.EMPTY;
}
如果你根据它们的索引,基于GUI初始化你的按钮,
public class MyButton extends JButton {
private int index;
public MyButton(int index) {
super();
this.index = index;
}
public int getIndex() {
return index;
}
}
然后当有人点击你的按钮时,你可以说((MyButton)a.getSource()). getIndex()
你会得到这个按钮的索引。
如果tic-tac-toe定义为3x3和2D,我喜欢根据索引检查胜利,我会存储一个数组,其中包含获胜的水平、垂直和对角线索引。
int[][] winIndices = {{0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,5,8}, {0,4,8}, {2,4,6}};
然后你可以根据
public boolean checkWin() {
for(int[] indexArray : winIndices) {
boolean same = (gridState[indexArray[0]] == gridState[indexArray[1]]) &&
(gridState[indexArray[1]] == gridState[indexArray[2]])
if(same == true && gridState[indexArray[0]] != State.EMPTY) {
return true;
}
}
return false;
}
或者类似的东西。我更好地写下了一次,但那不是在这台电脑上,而是类似的东西:)
我认为最简单的解决方案是将JButton[]b
设为一个字段,因此在构造函数上方声明它。
在这种情况下,你也应该使用更具描述性的名称。
或者你可以持有一个字符数组,其中一个按钮注册当前玩家的符号(X或O),这就是我不久前解决这个问题的方法
所以我为我的课做了一个抽动练习作业。我已经成功地创建了一个简单的Tic Tac Toe程序,但不知何故,检查绘制的方法有时并不正确。如果所有东西都填满了,但没有赢家,那就是平局。但如果除第0行第1列外,其他所有内容都已填满,则即使该框仍为空白,它仍将显示“Draw”。如果你不明白我的意思,就试着把所有的东西都填满,但不是赢,即使最后一个框没有填满,它也会说“平局”。我在代码中做错了什么????驱动
编辑:解决了,多亏了Mgorgon。 我正在创建一个简单的游戏,它(目前)允许你用鼠标点击在当前位置的每个方向上移动一个点1步。然而,这只在板是正方形(你可以选择板的大小)时才起作用。板由带有图像和2D数组的按钮表示,以跟踪位置,其中“1”是点的位置,“0”是一个空闲空间。actionlistener中的Pos1和Pos2打印出所单击的按钮的位置。当游戏棋盘是正方形时,这很有效,但当我把棋盘改成矩
嗨,我正在编写一个井字游戏。我已经在代码中的注释中详细说明了我需要什么。我现在遇到的问题是制作一个getMobile方法。我想我需要在按下行和列后的if/else语句中调用getMobile方法? 我不确定如何从获取行/列编号并将其放入我的板上以获取用户输入的内容。 以下是我的代码:
我正在制作一个名为SOS的游戏。这是一款3x3的棋盘游戏,与Tic Tac Toe的概念相同,但在这款游戏中,玩家无法选择是以X还是O的身份进行游戏,游戏中唯一的规则是形成“SOS”。 我们的项目应该在所有职位被填补后终止,每个组成的“SOS”将被添加到组成“SOS”的玩家中。 我的问题是关于得分。在第一行输入SOS后,即,我尝试在第二行第一列输入“O”,玩家2将递增。它不应该递增,因为它不满足我
我用Java写了Tic-Tac-Toe。我似乎遇到的问题是,当(人类)播放器1和(计算机)播放器2之间出现平局时,GUI会冻结。我已经在“Buttonlistener”类和“Methods”中创建了一个tieCheck,以获得一个平局。 我的程序的工作方式是,当按下一个按钮时,它会将一个值传递给methods类中的数组。在这个数组中,1=玩家1,2=玩家2。 人类玩家总是先走,所以当人类玩家走了4
我写的神经网络可以玩井字游戏。网络有9个输入神经元,它们描述板的状态(1-代表网络移动,1.5-代表对手移动,0-代表空单元)和9个输出神经元(具有最高值的输出神经元表示给定状态下的最佳动作)。网络没有隐藏层。激活函数-乙状结肠。学习方法--Q学习+反向传播。 网络是经过训练的,但很差(继续踩在被占用的单元格上)。所以我决定添加一个隐藏层。我想问: 在隐藏层中使用多少个神经元,在隐藏层和输出层中使