gpt4 book ai didi

java - TICTACTOE 游戏中的 while 循环无法正确执行

转载 作者:行者123 更新时间:2023-11-30 01:52:19 24 4
gpt4 key购买 nike

我是一个java编程新手,我正在使用swing开发一个简单的单人TICTACTOE游戏。你们是两个类(class)。一个主要的 TICTACTOE 类使用 XOButtton 类来设置可以监听单击事件的按钮。我首先创建这个 tictactoe 类的一个对象,然后使用这个对象调用一个名为initialCheckButton 的方法来查明按钮是否被单击了 3 次。如果是,它会调用另一个方法来查明 X 或 Os 是否连续显示。如果是,您就赢了。我计划进一步开发它,但这只是一个模板。当 GUI 显示时,单击按钮并显示连续的 X 或 Os 不会显示 JoptionPane 的消息。有什么帮助吗?

public class TicTacToe extends JFrame {
JPanel p = new JPanel();
boolean done = false;
XOButton buttons[] = new XOButton[9];

public static void main(String args[]) {
TicTacToe t = new TicTacToe();

t.initialCheckButton();
}

public TicTacToe() {

super("TicTacToe");

setSize(400, 400);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
p.setLayout(new GridLayout(3, 3));
for (int i = 0; i < 9; i++) {
buttons[i] = new XOButton();
p.add(buttons[i]);
}
add(p);

setVisible(true);

}

public void initialCheckButton() {
int sum = 0;

while (sum <= 3) {

for (int i = 0; i < 9; i++) {

if (buttons[i].checkButtonO() == 1) {
sum++;
}

if (buttons[i].checkButtonX() == 1) {
sum++;
}

}

}

checkButtonFinal();

}

public void checkButtonFinal() {
for (int i = 0; i < 9; i++)
for (int j = i + 3; j < 9; j++) {
for (int k = j + 3; k < 9; k++) {

if (buttons[i].checkButtonO() == buttons[j].checkButtonO() && buttons[k].checkButtonO() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");

if (buttons[i].checkButtonX() == buttons[j].checkButtonX() && buttons[k].checkButtonX() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");

}

}

for (int i = 0; i < 9; i += 3) {
if (buttons[i].checkButtonO() == buttons[i + 1].checkButtonO() && buttons[i + 2].checkButtonO() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");
if (buttons[i].checkButtonX() == buttons[i + 1].checkButtonX() && buttons[i + 2].checkButtonX() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");

}

for (int i = 0; i < 9; i += 2) {
for (int j = i + 2; j < 9; j += 2)
for (int k = j + 2; k < 9; k += 2) {
if (buttons[i].checkButtonO() == buttons[j].checkButtonO() && buttons[k].checkButtonO() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");

if (buttons[i].checkButtonX() == buttons[j].checkButtonX() && buttons[k].checkButtonX() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");
}

}

for (int i = 0; i < 9; i += 4) {
for (int j = i + 4; j < 9; j += 4)
for (int k = j + 4; k < 9; k += 4) {
if (buttons[i].checkButtonO() == buttons[j].checkButtonO() && buttons[k].checkButtonO() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");
if (buttons[i].checkButtonX() == buttons[j].checkButtonX() && buttons[k].checkButtonX() == 1)
JOptionPane.showMessageDialog(null, "Great, you won");
}

}

}

public static class XOButton extends JButton implements ActionListener {
public int buttonClicked = 0;
public int buttonClickedX = 0;
public int buttonClickedO = 0;

ImageIcon X, O;
byte value = 0;
/*
* 0:nothing 1:X 2:O
*/

public XOButton() {
X = new ImageIcon(this.getClass().getResource("X.png"));
O = new ImageIcon(this.getClass().getResource("O.png"));
this.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {

value++;
value %= 3;
switch (value) {
case 0:
setIcon(null);
buttonClicked = 0;
break;
case 1:
setIcon(X);
buttonClickedX = 1;
break;
case 2:
setIcon(O);
buttonClickedO = 1;
break;
}
}

public int checkButtonO() {
return buttonClickedO;

}

public int checkButtonX() {
return buttonClickedX;

}
}
}

最佳答案

以下是代码的重构版本,其中包括一些记录的更改:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class TicTacToe extends JFrame {

private static int ROW = 3, COLS = 3;
private final JPanel p;
private final XOButton buttons[];
//static counter, so it has the same value for all button instances
//used as a toggle between X and O
private static int counter = 0;

public static void main(String args[]) {
new TicTacToe();
}

public TicTacToe() {

super("TicTacToe");

setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
buttons = new XOButton[ROW*COLS];
p = new JPanel();
p.setLayout(new GridLayout(3, 3));
initialize();
add(p);
pack();
setVisible(true);
}

private void initialize(){
for (int i = 0; i < 9; i++) {
buttons[i] = new XOButton();
p.add(buttons[i]);
}
}

//restart game
private void restart(){
p.removeAll();
initialize();
revalidate();
}

private void checkButtons() {

//many similar for loops are not easy to follow
//refactor into methods
XOButton[] winningButtons = checkRows();
if( winningButtons != null) {
won(winningButtons);
}

winningButtons = checkCols();
if( winningButtons != null) {
won(winningButtons);
}

winningButtons = checkDIagonals();
if( winningButtons != null) {
won(winningButtons);
}
}

//returns winning buttons, or null
private XOButton[] checkRows() {

for(int row = 0; row < buttons.length ; row +=3 ){
int totalX = buttons[row].buttonClickedX + buttons[row+1].buttonClickedX+ buttons[row+2].buttonClickedX ;
int totalO = buttons[row].buttonClickedO + buttons[row+1].buttonClickedO+ buttons[row+2].buttonClickedO ;
if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[row], buttons[row+1], buttons[row+2]};
}
return null;
}

//returns winning buttons, or null
private XOButton[] checkCols() {

for(int col = 0; col < COLS ; col++ ){
System.out.println(col+"-"+(col+3)+"-"+(col+6));
int totalX = buttons[col].buttonClickedX + buttons[col+3].buttonClickedX+ buttons[col+6].buttonClickedX ;
int totalO = buttons[col].buttonClickedO + buttons[col+3].buttonClickedO+ buttons[col+6].buttonClickedO ;
if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[col], buttons[col+3], buttons[col+6]};
}
return null;
}

//returns winning buttons, or null
private XOButton[] checkDIagonals() {

int totalX = buttons[0].buttonClickedX + buttons[4].buttonClickedX+ buttons[8].buttonClickedX ;
int totalO = buttons[0].buttonClickedO + buttons[4].buttonClickedO+ buttons[8].buttonClickedO ;
if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[0], buttons[4], buttons[8]};

totalX = buttons[2].buttonClickedX + buttons[4].buttonClickedX+ buttons[6].buttonClickedX ;
totalO = buttons[2].buttonClickedO + buttons[4].buttonClickedO+ buttons[6].buttonClickedO ;
if(totalX >=3 || totalO >=3) return new XOButton[]{buttons[2], buttons[4], buttons[6]};

return null;
}

//invoked when there is a winner
private void won(XOButton[] winningButtons) {

for(XOButton button : winningButtons){
button.setBackground(Color.PINK);
}

JOptionPane.showMessageDialog(null, "Great, you won");
restart(); //start new game
}

class XOButton extends JButton implements ActionListener {

private int buttonClicked = 0, buttonClickedX = 0, buttonClickedO = 0;
String X, O; //avoid using unavailable images when posting

public XOButton() {
X = "X";
O = "O";
this.addActionListener(this);
setPreferredSize(new Dimension(40,40));
}

@Override
public void actionPerformed(ActionEvent e) {

if(buttonClicked > 0 ) return; //invoke only on first click
buttonClicked ++;
counter = (counter+1)%2; //changes from 1 to 0 and back to 1

switch (counter) {

case 0:
setText(X);
buttonClickedX = 1;
break;
case 1:
setText(O);
buttonClickedO = 1;
break;
}

checkButtons();//check buttons after every click
}

public int checkButtonO() {
return buttonClickedO;
}

public int checkButtonX() {
return buttonClickedX;
}
}
}

enter image description here

关于java - TICTACTOE 游戏中的 while 循环无法正确执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55664551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com