五子棋
实现思路:
1.绘制棋盘
包括布局、窗体重绘
2.实现功能
包括:添加监听事件、绘制棋子、模式选择、判断输赢
一、创建窗体并绘制图形
public class GobangMain extends JFrame {
public static void main(String[] args) {
GobangMain gobang = new GobangMain();
gobang.init(); //初始化窗体
}
public void init() {
// 继承了JFrame,this表示本类的对象
this.setTitle("五子棋"); // 五子棋窗体属性,this表示JFrame的实例对象
this.setSize(650, 550);
this.setDefaultCloseOperation(3); //可以通过点击窗体右上角的“X”来关闭窗体
this.setResizable(false); //设置大小不可更改
this.setLocationRelativeTo(null);//设置窗体位置默认在屏幕中央(注意要先设置好大小,再使用这条语句才生效)
this.setVisible(true);//设置窗体可见
Graphics g = this.getGraphics(); //取出窗体的画笔
g.drawLine(100, 300, 300, 300);//绘制一条斜线
//这里绘制的图线是看不到的,由于继承了JFrame,JFrame类中paint重绘方法会自动执行,重绘会将窗体重新绘制一遍
}
@Override
//Graphics 这是一个画笔类,可以通过 Graphics g = frame.getGraphics();来获取窗体的画笔,画笔有绘制各种图形的方法
public void paint(Graphics g) {
super.paint(g);
// 绘制直线,参数分别是直线的起点(x,y)和终点的(x,y)
g.drawLine(100, 100, 300, 300);
// 绘制椭圆,参数是椭圆的起点和半长轴
g.fillOval(150, 200, 30, 30);
g.setColor(Color.white);
g.fillOval(200, 150, 30, 30);
}
}
二、监听鼠标点击绘制棋子
增加鼠标事件监听类
public class GobangListener extends MouseAdapter {
private Graphics g;
public GobangListener(Graphics g){
this.g = g;
}
@Override
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println("x=" + x + ",y=" + y);
g.fillOval(x,y,30,30);
}
}
并且在this.setVisible(true); 设置窗体可见之后,给窗体添加监听
this.setVisible(true);//设置窗体可见
GobangListener listener = new GobangListener(this.getGraphics());
this.addMouseListener(listener);
三、重绘
此时最小化窗体,重新打开会发现,绘制的图案全部消失了
原因是打开窗体的时候,paint会自动执行,对窗体进行重绘,重绘方法并没有对监听事件绘制的图案进行重绘。
@Override
public void paint(Graphics g) {
super.paint(g);
}
我们想要保留绘制的图案就必须保存,并且在paint方法中绘制
public interface GobangConfig {
/**棋子大小*/
int SIZE_CHESS = 30;
ArrayList<String> POSITION = new ArrayList<>();
}
考虑到我们把绘制的棋子存到一个ArrayList中,我们存入是在GobangListener ,而重绘是在GobangMain 。我们可以新建一个接口,把存放棋子的队列作为常量存放在接口中,GobangListener、GobangMain 均实现这个接口,就可以共用了
绘制棋子之后存入队列
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println("x=" + x + ",y=" + y);
g.fillOval(x,y,SIZE_CHESS,SIZE_CHESS);
POSITION.add(x + "," + y);
}
在重绘方法中将棋子也重绘一遍就可以解决窗体最小化或最大化导致图案消失的问题
@Override
public void paint(Graphics g) {
super.paint(g);
for(String position : POSITION){
String[] split = position.split(",");
g.fillOval(Integer.parseInt(split[0]),Integer.parseInt(split[1]),SIZE_CHESS,SIZE_CHESS);
}
}
后续问题包括:棋盘绘制、右边面板绘制、控制棋子落在交叉点上、模式选择、判断输赢、提示弹窗等