public class ChessBoard extends JPanel implements MouseListener {
    private int xIndex, yIndex;
    private boolean isBlack = true;//默认先下黑棋
    private boolean gameOver = false;//游戏是否结束
    private boolean paused = false;//游戏是否暂停
    private int chessCount = 0;//已下棋子的个数
    private Point[] chessList = new Point[ROWS * COLS];//存储棋子的数组

    public ChessBoard() {
        addMouseListener(this);
    }

    public void paint(Graphics g) {
        super.paint(g);
        //绘制棋盘
        for (int i = 0; i <= ROWS; i++) {//画横线
            g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + COLS * GRID_SPAN, MARGIN + i * GRID_SPAN);
        }
        for (int i = 0; i <= COLS; i++) {//画竖线
            g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN, MARGIN + ROWS * GRID_SPAN);
        }
        //绘制棋子
        for (int i = 0; i < chessCount; i++) {
            int xPos = chessList[i].getX() * GRID_SPAN + MARGIN;
            int yPos = chessList[i].getY() * GRID_SPAN + MARGIN;
            Color color = chessList[i].getColor();
            g.setColor(color);
            g.fillOval(xPos - POINT_SIZE / 2, yPos - POINT_SIZE / 2, POINT_SIZE, POINT_SIZE);
        }
    }

    public void mousePressed(MouseEvent e) {
        //游戏结束时,不再能下
        if (gameOver) {
            JOptionPane.showMessageDialog(this, '游戏已结束,请重新开始', '提示', JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        //游戏暂停时,不能下棋
        if (paused) {
            JOptionPane.showMessageDialog(this, '当前处于暂停模式,请点击继续按钮继续游戏', '提示', JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        String colorName = isBlack ? '黑棋' : '白棋';
        //将鼠标点击的坐标位置转换成网格索引
        xIndex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;
        yIndex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;
        //落在棋盘外不能下
        if (xIndex < 0 || xIndex > ROWS || yIndex < 0 || yIndex > COLS) {
            JOptionPane.showMessageDialog(this, '该位置不在界面内,请在界面内下棋');
            return;
        }
        //如果点击的位置已经有棋子存在,不能下
        if (findChess(xIndex, yIndex)) {
            JOptionPane.showMessageDialog(this, '该位置已经有棋子,请重新选择位置下棋!');
            return;
        }
        //可以进行时的处理
        Point ch = new Point(xIndex, yIndex, isBlack ? Color.black : Color.white);
        chessList[chessCount++] = ch;
        repaint();//通知系统重新绘制
        //如果胜出则给出提示信息,不能继续下棋
        if (isWin()) {
            String msg = String.format('恭喜,%s赢了!', colorName);
            JOptionPane.showMessageDialog(this, msg);
            gameOver = true;
        }
        isBlack = !isBlack;
    }

    public void mouseClicked(MouseEvent e) {
        //判断游戏是否暂停,如果暂停则不进行下棋
        if (paused) {
            JOptionPane.showMessageDialog(this, '游戏已暂停,点击继续按钮继续游戏', '提示', JOptionPane.INFORMATION_MESSAGE);
            return;
        }
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }
}

这段代码展示了如何使用 MouseListener 处理鼠标点击事件,并实现简单的棋盘游戏逻辑。

代码说明:

  1. ChessBoard 类:继承 JPanel 并实现 MouseListener 接口,用于绘制棋盘和处理鼠标事件。
  2. 鼠标事件处理
    • mousePressed(MouseEvent e):处理鼠标按下事件,判断游戏状态并放置棋子。
    • mouseClicked(MouseEvent e):处理鼠标点击事件,判断游戏是否暂停。
    • 其他 MouseListener 方法:这里没有实现,因为它们不涉及棋盘游戏逻辑。
  3. 游戏逻辑
    • 判断游戏是否结束或暂停,并给出提示信息。
    • 将鼠标点击坐标转换为棋盘索引。
    • 判断点击位置是否为空,如果为空则放置棋子。
    • 判断游戏是否结束,如果结束则给出获胜信息。
  4. 绘制棋盘和棋子
    • paint(Graphics g) 方法用于绘制棋盘和棋子。

注意:

  • 为了完整运行代码,需要添加其他必要的代码,例如:
    • 定义常量 ROWSCOLSMARGINGRID_SPANPOINT_SIZE
    • 实现 findChess(int xIndex, int yIndex) 方法用于判断棋盘位置是否已有棋子。
    • 实现 isWin() 方法用于判断游戏是否结束。
  • 本代码只是一个简单的示例,可以根据需要进行扩展和完善。
Java 棋盘游戏 - 鼠标点击事件处理

原文地址: https://www.cveoy.top/t/topic/oLyR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录