五子棋小游戏(java)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
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.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class GameFrame extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    private static final int ROWS = 15;
    private static final int COLS = 15;

    private char[][] board;
    private JButton[][] buttonGrids;
    private JLabel playerLabel;

    private char currentPlayer;

    public GameFrame() {
        setTitle("五子棋游戏");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 初始化棋盘
        board = new char[ROWS][COLS];
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                board[i][j] = '+';
            }
        }

        // 初始化玩家信息
        currentPlayer = 'X';

        // 创建棋盘面板
        JPanel boardPanel = new JPanel(new GridLayout(ROWS, COLS));
        boardPanel.setPreferredSize(new Dimension(640, 640));
        buttonGrids = new JButton[ROWS][COLS];
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                JButton button = new JButton();
                button.addActionListener(this);
                button.setBackground(Color.WHITE);
                buttonGrids[i][j] = button;
                boardPanel.add(button);
            }
        }

        // 创建底部信息面板
        JPanel infoPanel = new JPanel(new BorderLayout());
        playerLabel = new JLabel("当前玩家:X", JLabel.CENTER);
        playerLabel.setFont(new Font("宋体", Font.BOLD, 30));
        infoPanel.add(playerLabel, BorderLayout.CENTER);

        // 将棋盘面板和底部信息面板添加到游戏主窗口
        getContentPane().add(boardPanel, BorderLayout.CENTER);
        getContentPane().add(infoPanel, BorderLayout.SOUTH);

        // 设置窗口大小并居中显示
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        int row = -1, col = -1;
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                if (button == buttonGrids[i][j]) {
                    row = i;
                    col = j;
                    break;
                }
            }
        }
        if (row >= 0 && col >= 0 && board[row][col] == '+') {
            board[row][col] = currentPlayer;
            button.setText(String.valueOf(currentPlayer));
            button.setBackground(currentPlayer == 'X' ? Color.BLACK : Color.WHITE);
            if (isWinningMove(row, col)) {
                JOptionPane.showMessageDialog(this, "玩家 " + currentPlayer + " 获胜!");
                newGame();
            } else if (isDraw()) {
                JOptionPane.showMessageDialog(this, "平局!");
                newGame();
            } else {
                currentPlayer = (currentPlayer == 'X' ? 'O' : 'X');
                playerLabel.setText("当前玩家:" + currentPlayer);
            }
        }
    }

    private boolean isWinningMove(int row, int col) {
        char color = board[row][col];
        int count = 1;
        for (int i = col - 1; i >= 0; i--) {
            if (board[row][i] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }
        for (int i = col + 1; i < COLS; i++) {
            if (board[row][i] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }

        count = 1;
        for (int i = row - 1; i >= 0; i--) {
            if (board[i][col] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }
        for (int i = row + 1; i < ROWS; i++) {
            if (board[i][col] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }

        count = 1;
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }
        for (int i = row + 1, j = col + 1; i < ROWS && j < COLS; i++, j++) {
            if (board[i][j] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }

        count = 1;
        for (int i = row + 1, j = col - 1; i < ROWS && j >= 0; i++, j--) {
            if (board[i][j] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }
        for (int i = row - 1, j = col + 1; i >= 0 && j < COLS; i--, j++) {
            if (board[i][j] == color) {
                count++;
            } else {
                break;
            }
        }
        if (count >= 5) {
            return true;
        }

        return false;
    }

    private boolean isDraw() {
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                if (board[i][j] == '+') {
                    return false;
                }
            }
        }
        return true;
    }

    private void newGame() {
        currentPlayer = 'X';
        playerLabel.setText("当前玩家:" + currentPlayer);
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                board[i][j] = '+';
                buttonGrids[i][j].setText("");
                buttonGrids[i][j].setBackground(Color.WHITE);
            }
        }
    }

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

}
这份代码创建了一个类 `GameFrame`,它继承自 `JFrame` 并实现了 `ActionListener` 接口,用来监听按钮事件。

首先,在构造函数中创建了棋盘面板和底部信息面板,并将它们添加到游戏主窗口。

然后,在按钮事件的处理方法 `actionPerformed()` 中,首先判断当前按钮是否可以下棋,如果可以则将当前玩家的棋子放入该位置,并改变按钮的显示和背景颜色。然后判断当前位置是否是获胜的位置或者所有位置都下满了的平局,如果是则弹出相应的提示框,并调用 `newGame()` 方法开始新的游戏。

`isWinningMove()` 方法用来判断当前落子是否为获胜的位置,它通过搜索该位置所在的行、列、对角线是否存在五个相同颜色的棋子来判断是否获胜。

`isDraw()` 方法用来判断是否为平局。

`newGame()` 方法用于初始化棋盘和玩家状态,为开始新的游戏做准备。

最后,在 `main()` 方法中创建了一个 `GameFrame` 类的实例,即开始游戏。

需要注意的是,上述示例代码只是五子棋游戏的一份简单实现,你可以在此基础上进行扩展和优化,使其更加完善。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值