JAVA之五子棋功能实现

目录

1.绘制棋盘

2.下棋

3.存储棋子


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 ();
}

经过上述步骤后,可以实现自动校正位置下棋,并且存储棋子的功能

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值