井字游戏不显示在正确的时间赢家

9lowa7mx  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(226)

我的代码是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在正确的方向时,我需要显示胜利者
不要等待点击其他按钮

oalqel3c

oalqel3c1#

我想我看到了。
当按下按钮时,按以下顺序进行操作:
改变状态栏说轮到下一个玩家了
设置相关的按钮文本以显示刚刚选择该按钮的玩家
禁用按钮
更改回合值以反映下一个玩家
根据当前玩家的名字检查赢家,但您已经将其更改为下一个玩家,而不是刚刚移动的玩家。
当x做出一个获胜的动作时,在游戏检查是否有赢家之前,当前玩家的名字会被更改为o,所以它会检查o是否赢了。你需要重新订购物品:
更改按钮文本
禁用按钮
根据当前玩家的名字检查赢家,如果当前玩家赢了或者有平局,则结束游戏
如果游戏还在进行,现在是时候改变回合值并更新状态栏来显示下一个玩家的回合了。

相关问题