一、棋盘的绘制
使用JFrame容器制作五子棋的窗体
创建一个类——UI,如下:
public class UI {
private JFrame frame = new JFrame();
public void init() {
frame.setTitle("五子棋");
frame.setSize(518, 540);
frame.setLocationRelativeTo(null); //居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); //让窗体显示
}
public static void main(String[] args) {
new UI().init();
}
}
使用JPanel和Graphics画出大小为15X15的棋盘
再创建一个新的类——Chessboard,继承JPanel:
public class Chessboard extends JPanel {
//规定由15条横竖线组成
private static final int CHESSBOARD_SIZE = 15;
//外边距
private int margin = 20;
/**
* 绘图工具
*
* @param g 画笔工具
*/
@Override
public void paint(Graphics g) {
super.paint(g);
drawChessBoard(g);
drawPieces(g);
}
/**
* 画棋盘
*
* @param g 画笔工具
*/
private void drawChessBoard(Graphics g) {
int cellSize = (getWidth() - 2 * margin) / (CHESSBOARD_SIZE - 1);
for (int i = 0; i < CHESSBOARD_SIZE; i++) {
//画横线
g.drawLine(margin, margin + cellSize * i, getWidth() - margin, margin + cellSize * i);
//画竖线
g.drawLine(margin + cellSize * i, margin, margin + cellSize * i, getHeight() - margin);
}
}
}
实现点击鼠标落子的功能
在UI类中添加以下代码:
public class UI {
private JFrame frame = new JFrame();
private Chessboard chessboard = new Chessboard();
public void init() {
frame.setTitle("五子棋");
frame.setSize(518, 540);
frame.setLocationRelativeTo(null); //居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); //让窗体显示
//给棋盘添加鼠标监听事件,具体来说就是鼠标点击事件
chessboard.addMouseListener(new MouseAdapter() { //匿名内部类
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
//调用画棋子的方法
play(e);
}
});
}
/**
* 处理鼠标点击事件的方法
*/
private void play(MouseEvent e) {
int cellSize = chessboard.getCellSize();
int x = (e.getX() - 5) / cellSize;
int y = (e.getY() - 5) / cellSize;
chessboard.move(new Pieces(x, y, 1));
}
public static void main(String[] args) {
new UI().init();
}
}
再在Chessboard类中添加drawPieces、move、getCellSize方法,如下:
public class Chessboard extends JPanel {
private List piecesList = new ArrayList<>();
/**
* 绘图工具
*
* @param g 画笔工具
*/
@Override
public void paint(Graphics g) {
super.paint(g);
drawChessBoard(g);
drawPieces(g);
}
public int getCellSize() {
return (getWidth() - 2 * margin) / (CHESSBOARD_SIZE - 1);
}
public void drawPieces(Graphics g) {
for (Pieces piece : piecesList) {
if (piece.getPlayer() == 1) {
//默认值为1代表人类,棋子颜色为黑色
g.setColor(Color.black);
} else {
g.setColor(Color.white);
}
int cellSize = (getWidth() - 2 * margin) / (CHESSBOARD_SIZE - 1);
g.fillOval(piece.getX() * ce