第一天实现界面(棋盘,棋子,下棋)功能
构思:
- 如何绘制棋盘:可以把棋盘看作横竖交叉的线段,参照之前的绘制直线教程,绘制15✖️15条横竖交叉的线段来构造棋盘
- 如何绘制棋子:每个棋子其实就是绘制一个圆 具体画法可以参照前面画圆教程
- 黑白双方轮流下棋,注意棋子一定要下在交点上 具体操作看后面代码
- 个性化功能:添加背景图
public static final Image bgimg = new ImageIcon("img/bg1.jpg").getImage();
易错点:
-
一定要记得重写paint方法,为什么?
因为每次拖动窗体,缩放窗体等操作会重新调用paint方法,导致你之前下的棋子被抹去,重写paint放大的目的就是为了在重新调用paint方法是重下棋子 -
如何将棋子绘制在交点:
首先我们先通过鼠标监听器获得当前点击的坐标,然后我们知道在两点之前的前1/2应该下在前一个交点,若在后二分之一则应该在后一个交点,规则确定以后我们就可以去写算法了: chessX=(x+SIZE/2-X)/SIZE;
chessY=(y+SIZE/2-Y)/SIZE;
这个SIZE指的是棋盘间距 兼 棋子直径 -
如何实现黑白轮流下棋
这个很简单,我们首先定义一个chessflag =0; 然后每次下棋完以后改一下这个值,判断一下即可
具体代码实现:
- 绘制窗体
public void initGoBangMainUI(){
//this指的是当前类的对象
this.setTitle("简易五子棋V1.0"); //名称
this.setSize(1200,1000); //窗体大小
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setVisible(true); //可视化
//加上鼠标监听器
this.addMouseListener(gl);
this.addMouseMotionListener(gl);
//获取 Graphics 画笔 传给监听器对象
Graphics g =this.getGraphics();
gl.setGraphics(g);
}
- 绘制棋子,以及黑白轮流下棋
@Override
@Override
public void mousePressed(MouseEvent e) {
int x=e.getX();
int y=e.getY();// 这边中转一下是因为可能会加一些条件,x,y不一定就是这个x,y
chessX=(x+SIZE/2-X)/SIZE;
chessY=(y+SIZE/2-Y)/SIZE; //算出你的棋子在第几行第几列
if(chessflag==0){
g.setColor(Color.WHITE);
chessArr[chessX][chessY]=1; //保存棋子
chessflag++;
}else{
g.setColor(Color.BLACK);
chessArr[chessX][chessY]=2; //保存棋子
chessflag=0;
} //黑白轮流下棋
g.fillOval(chessX*SIZE+X-SIZE/2,chessY*SIZE+Y-SIZE/2,SIZE,SIZE);
System.out.println("按下鼠标按键");
}
- 重写paint方法 paint方法中包含了绘制棋盘以及棋子
@Override
public void paint(Graphics g){
super.paint(g); //super指的是当前类的父类对象
//绘制背景图
g.drawImage(bgimg,X,Y,ROW*SIZE,CLOUM*SIZE,null);
//绘制棋盘
for (int i =0; i<=15;i++){
g.drawLine(X,Y+i*SIZE,X+ROW*SIZE,Y+i*SIZE);
g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+CLOUM*SIZE);
}
//绘制棋子
for (int i=0;i<chessArr.length;i++){
for (int j=0;j<chessArr[0].length;j++){
if(chessArr[i][j]==1){
g.setColor(Color.WHITE);
g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE);
System.out.println("白棋");
}else if(chessArr[i][j]==2){
g.setColor(Color.BLACK);
g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE);
System.out.println("黑棋");
}else{
System.out.println("空白");
continue;
}
}
}
}
}
大概代码就是以上部分: