目录
1.绘制棋盘
- 创建窗体
首先,需要创建一个UI类,因为涉及到创建窗体,所以需要继承JFrame类,之后完成设置标题“五子棋”,窗体大小(950,800),关闭,可视化等一系列操作。
public class GoBangUI extends JFrame {
public void initUI(){
//实现方式2 this调用方法/直接调用
this.setTitle ("五子棋");
this.setSize (950, 800);
// 设置窗口关闭按钮点击时 退出进程
this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
// 可视化
this.setVisible (true);
}
}
- 画棋盘
首先,由于需要存储画棋盘的右上角顶点坐标、棋盘的行和列数、棋盘格子的宽度等常量,在这里创建一个接口,来存放这些常量,方便后续的使用,代码如下:
public interface DataConfig {
int X=50;
int Y=75;
/**
* 行列数
*/
int ROW=15;
int COLUM=15;
/**
* 棋盘格子的宽度
*/
int SIZE=50;
}
之后,在绘制棋盘横线、竖线的时候,我们使用Graphics类中的画图方法来实现,其中的直线画法为:drawLine (起始点坐标x,起始点坐标y,终止点坐标x,终止点坐标y)。
由于在初始化窗体、改变窗体尺寸、最小/大化窗体、从屏幕外移入屏幕中时会调用paint函数,需要将绘制直线的代码放在paint函数中,以保证在做上述操作的时候,棋盘能够正常显示出来。
同时,可以通过setColor来设置窗体,也就是棋盘和背景的颜色。
public void paint(Graphics g){
super.paint (g);
System.out.println ("paint 方法 ");
// 绘制背景
Color color = new Color (116, 180, 57);
g.setColor (color);
g.fillRect (0, 0, this.getWidth (), this.getHeight ());
g.setColor (Color.BLACK);
// 绘制棋盘 常量数据写成固定的
for(int i = 0; i <=ROW; i++){
g.drawLine (X, Y+i*SIZE, X+COLUM*SIZE, Y+i*SIZE);
g.drawLine (X+i*SIZE,Y,X+i*SIZE,Y+ROW*SIZE);
}
}
做完上述步骤后,运行程序,棋盘就可以正常显示。
2.下棋
- 加鼠标监听器
想要达到“按下鼠标左键”,棋盘上显示一个棋子的功能,首先需要考虑加鼠标监听器。步骤如下:
(1): 创建一个类实现MouseListener监听器接口GobangListener
(2): 重写监听器的中所有的方法
由于是“按下”操作时下棋,故需要重写 public void mousePressed()函数,在这个函数 中实现间隔着画黑棋、白棋
(3): 给窗体加载鼠标监听对象
在这里需要创建监听器实现类对象并且设置给窗体的监听范围: 窗体内
(4):从窗体上获取Graphics 传递给 监听器实现类对象
// 创建监听器实现类对象 并且设置给窗体 监听范围: 窗体内
GoBangListen gol = new GoBangListen ();
// 监听器对象作用1: 给窗体添加监听器
this.addMouseListener (gol);
// 监听器对象作用2: 调用自己定义的setGraphics方法 传递 g
// 可视化之后 获取Graphics 对象
Graphics g = this.getGraphics ();
gol.setGraphics (g);
public void mousePressed(MouseEvent e){
int x = e.getX ();
int y = e.getY ();
int chessC = (x-X+SIZE/2)/SIZE;
int chessR = (y-Y+SIZE/2)/SIZE;
int chessX = chessC*SIZE+X-SIZE/2;
int chessY = chessR*SIZE+Y-SIZE/2;
if(x<X-SIZE/2 || x>X+COLUM*SIZE+SIZE/2 || y<Y-SIZE/2 || y>Y+ROW*SIZE+SIZE/2){
// 弹窗
JOptionPane.showMessageDialog (null,"请在棋盘内下棋!");
// 结束方法运行
return;
}
if(Arrchess[chessR][chessC]!=0){
JOptionPane.showMessageDialog (null,"该位置已经有棋子!");
return;
}
if(flag==1){
g.setColor (Color.BLACK);
g.fillOval (chessX,chessY,SIZE,SIZE);
Arrchess[chessR][chessC]=1;
flag=2;
}else if(flag==2){
g.setColor (Color.WHITE);
g.fillOval (chessX,chessY,SIZE,SIZE);
Arrchess[chessR][chessC]=2;
flag=1;
}
}
此时,点击鼠标左键,可以在棋盘上画出交替的黑棋、白棋,但是需要手动控制棋子的位置,让棋子下在合适的位置
- 校正棋子的坐标位置
首先,可以计算出一个棋子的行/列值,之后,利用计算出的行、列值将这个棋子定位到这个行/列值的位置
//X,Y为棋盘左上角顶点坐标,SIZE为棋盘格子宽度
X = 50 Y=75 SIZE=50
// 计算行列值 列数=x/SIZE 行数=y/SIZE
int chessC = (x-X+SIZE/2)/SIZE;
int chessR = (y-Y+SIZE/2)/SIZE;
// 还原标准坐标
int chessX = chessC*SIZE+X-SIZE/2;
int chessY = chessR*SIZE+Y-SIZE/2;
3.存储棋子
在这一步骤,需要利用到二维数组来存储棋子,所以首先创建一个规格16*16 ROW+1,COLUM+1的二维数组,由于这个数组属于常量,为了使用方便,可将这个数组放在接口DataCofig中:
int [][] Arrchess= new int[ROW+1][COLUM+1];
在下棋的逻辑中,黑棋存1,白棋存2,在paint函数中遍历打印,即可实现“取棋子”的步骤
同时可以判断下,检测要下棋的位置是否有棋子
for(int i=0;i<Arrchess.length;i++){// 遍历 二维数组中的一维数组
for(int j=0;j<Arrchess[i].length;j++){
//取出Arrchess的值
int number = Arrchess[i][j];
//判断这个值不为0
if(number!=0){
//判断这个值为1或2,如是1设置为黑色,是2设置为白色
//将当前1或者2所在位置ij还原成坐标,画一个圆
if(number==1){
g.setColor(Color.BLACK);
}else{
g.setColor(Color.WHITE);
}
int x = j*SIZE+X-SIZE/2;
int y = i*SIZE+Y-SIZE/2;
g.fillOval(x,y,SIZE,SIZE);
}
System.out.print (Arrchess[i][j]+" ");
}
System.out.println ();
}
经过上述步骤后,可以实现自动校正位置下棋,并且存储棋子的功能