我的代码是tic-tac-toe,我和show winner有问题。
我得到了胜利,但不是当x或o在正确的方向。
点击按钮后显示赢家。
代码:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EtchedBorder;
public class TicTocToe extends JFrame implements ActionListener {
private static final long serialVersionUID = -7730552764304282715L;
private static final Font BT_FONT = new Font("Segoe UI", 0, 30);
private static final Font LB_FONT = new Font("Consolas", 0, 20);
private JButton[][] board;
private JLabel statusBar;
private JPanel centerPanel, southPanel;
private int turn = 0, count = 0;
private String name;
public static void main(String[] args) {
EventQueue.invokeLater(() -> new TicTocToe().setVisible(true));
}
public TicTocToe() {
super("Tic Toc Toe");
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
initUI();
} catch (Exception e) {
e.printStackTrace();
}
}
private void initUI() {
initCenterPanel();
initSouthPanel();
add(centerPanel);
add(southPanel, BorderLayout.SOUTH);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
}
private void initCenterPanel() {
centerPanel = new JPanel();
board = new JButton[3][3];
for (int i = 0; i < board[0].length; i++) {
for (int j = 0; j < board[i].length; j++) {
board[i][j] = new JButton("-");
board[i][j].setFont(BT_FONT);
board[i][j].setFocusPainted(false);
board[i][j].setPreferredSize(new Dimension(80, 80));
board[i][j].addActionListener(this);
centerPanel.add(board[i][j]);
}
}
}
private void initSouthPanel() {
southPanel = new JPanel();
southPanel.setLayout(new BorderLayout());
statusBar = new JLabel();
statusBar.setFont(LB_FONT);
statusBar.setText("Click On Button To Start");
statusBar.setHorizontalAlignment(JLabel.CENTER);
statusBar.setBorder(new EtchedBorder());
southPanel.add(statusBar);
}
private void play(JButton button) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (button.equals(board[i][j])) {
count++;
if (turn < 1) {
statusBar.setText("Player " + "O" + " Turn");
button.setText("X");
button.setEnabled(false);
turn++;
} else {
statusBar.setText("Player " + "X" + " Turn");
button.setText("O");
button.setEnabled(false);
turn--;
}
}
}
}
}
private String getPlayerName() {
return (turn < 1) ? "X" : "O";
}
private boolean findWinner() {
name = getPlayerName();
for (int i = 0; i < board.length; i++) {
if (board[i][0].getText().equals(name) && board[i][1].getText().equals(name)
&& board[i][2].getText().equals(name))
return true;
for (int j = 0; j < board[i].length; j++) {
if (board[0][j].getText().equals(name) && board[1][j].getText().equals(name)
&& board[2][j].getText().equals(name))
return true;
if (board[0][0].getText().equals(name) && board[1][1].getText().equals(name)
&& board[2][2].getText().equals(name))
return true;
if (board[0][2].getText().equals(name) && board[1][1].getText().equals(name)
&& board[2][0].getText().equals(name))
return true;
}
}
return false;
}
private void showWinner() {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (findWinner()) {
if (getPlayerName().equalsIgnoreCase("x")) {
statusBar.setText("Winner is Player X");
board[i][j].removeActionListener(this);
}
else if (getPlayerName().equalsIgnoreCase("o")) {
statusBar.setText("Winner is Player O");
board[i][j].removeActionListener(this);
}
} else if (!findWinner() && count == 9) {
statusBar.setText("It was a draw, no wone.");
board[i][j].removeActionListener(this);
}
}
}
}
public void actionPerformed(ActionEvent event) {
JButton button = (JButton) event.getSource();
play(button);
showWinner();
}
public Dimension getPreferredSize() {
return new Dimension(300, 320);
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
}
在这张图中,胜利者是x,但等待玩家o
点击其他按钮后显示赢家。
当x或o在正确的方向时,我需要显示胜利者
不要等待点击其他按钮
1条答案
按热度按时间oalqel3c1#
我想我看到了。
当按下按钮时,按以下顺序进行操作:
改变状态栏说轮到下一个玩家了
设置相关的按钮文本以显示刚刚选择该按钮的玩家
禁用按钮
更改回合值以反映下一个玩家
根据当前玩家的名字检查赢家,但您已经将其更改为下一个玩家,而不是刚刚移动的玩家。
当x做出一个获胜的动作时,在游戏检查是否有赢家之前,当前玩家的名字会被更改为o,所以它会检查o是否赢了。你需要重新订购物品:
更改按钮文本
禁用按钮
根据当前玩家的名字检查赢家,如果当前玩家赢了或者有平局,则结束游戏
如果游戏还在进行,现在是时候改变回合值并更新状态栏来显示下一个玩家的回合了。