Java 棋盘游戏 - 鼠标点击事件处理
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 处理鼠标点击事件,并实现简单的棋盘游戏逻辑。
代码说明:
- ChessBoard 类:继承 JPanel 并实现 MouseListener 接口,用于绘制棋盘和处理鼠标事件。
- 鼠标事件处理:
mousePressed(MouseEvent e):处理鼠标按下事件,判断游戏状态并放置棋子。mouseClicked(MouseEvent e):处理鼠标点击事件,判断游戏是否暂停。- 其他 MouseListener 方法:这里没有实现,因为它们不涉及棋盘游戏逻辑。
- 游戏逻辑:
- 判断游戏是否结束或暂停,并给出提示信息。
- 将鼠标点击坐标转换为棋盘索引。
- 判断点击位置是否为空,如果为空则放置棋子。
- 判断游戏是否结束,如果结束则给出获胜信息。
- 绘制棋盘和棋子:
paint(Graphics g)方法用于绘制棋盘和棋子。
注意:
- 为了完整运行代码,需要添加其他必要的代码,例如:
- 定义常量
ROWS、COLS、MARGIN、GRID_SPAN、POINT_SIZE。 - 实现
findChess(int xIndex, int yIndex)方法用于判断棋盘位置是否已有棋子。 - 实现
isWin()方法用于判断游戏是否结束。
- 定义常量
- 本代码只是一个简单的示例,可以根据需要进行扩展和完善。
原文地址: https://www.cveoy.top/t/topic/oLyR 著作权归作者所有。请勿转载和采集!