Java-GoBangV0.1

五子棋:

  • 界面
  • 鼠标监听器
  • 画图 重绘
  • 数组存储棋子
  • 判断输赢

import javax.swing.*;
import java.awt.*;

/**
 * 创建界面:
 * 1:用JFrame 创建对象
 * 2:继承JFrame 直接调用到继承到的方法
 * 3:绘制的棋盘 以及棋子 需要在界面刷新的时候重新绘制
 * - 如何保存对象数据 传递对象
 */
public class GoBangUI extends JFrame{

    /**
     * 创建对象时调用的
     * 可以加参数 参数可以初始化对象的属性
     */
    public GoBangUI(){
        setTitle ("五子棋 V1.0");
        setSize (1000, 950);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setVisible (true);

        // 加载鼠标监听器
        GoListener gl = new GoListener ();
        this.addMouseListener (gl);
        // 获取Graphics
        Graphics g = this.getGraphics ();
        gl.gr = g;// 讲画笔对象传入监听器对象中


    }


    /**
     * 绘制棋盘
     * paint方法 重写的父类的刷新绘制方法
     * 在界面初始化的时候直接调用
     * 改变窗体时(拖动 最小/大化 移动等情况下调用这个绘制方法)
     *
     * @param g
     */
    @Override
    public void paint(Graphics g){
        super.paint (g);

        g.setColor (new Color (211, 141, 38));
        g.fillRect (75, 75, 750, 750);
        g.setColor (Color.BLACK);
        // 绘制棋盘
        for(int i = 0; i < 15; i++){
            g.drawLine (100, 100 + i * 50, 800, 100 + i * 50);
            g.drawLine (100 + i * 50, 100, 100 + i * 50, 800);
        }
    }


    public static void main(String[] args){
        new GoBangUI ();// 创建对象 也就是直接调用构造方法
    }


}


        import java.awt.*;
                import java.awt.event.MouseEvent;
                import java.awt.event.MouseListener;

public class GoListener implements MouseListener{

    Graphics gr;
    int chessFlag = 1;// 0是 不下棋  1 是 黑棋 2 是白棋

    // 创建一个存储棋子的二维数组
    int[][] chessArr = new int[14][14];

    // GoBangIsWin
    GoBangIsWin gowin = new GoBangIsWin ();

    /**
     * 按下时下棋
     *
     * @param e
     */
    @Override
    public void mousePressed(MouseEvent e){
        // 获取按下时的下标
        int x = e.getX ();
        int y = e.getY ();


        // 校正棋子坐标
        int m = (x - 100) / 50; // 列
        int n = (y - 100) / 50; // 行
        System.out.println ("m: " + m + "n: " + n);
        // 要注意什么时候才可以下棋
        if(chessFlag == 0 || chessArr[n][m] != 0 || m >= 14 || n >= 14){
            return;
        }
        // 存储棋子:0 1 2
        chessArr[n][m] = chessFlag;
        //判断输赢

        int chessX = 100 + (m * 50);
        int chessY = 100 + (n * 50);
        if(chessFlag == 1){
            gr.setColor (Color.BLACK);
            // 判断输赢

            if(gowin.isWin (chessArr, n, m)){
                System.out.println ("黑棋胜利!!");
            }
            chessFlag = 2;
        } else if(chessFlag == 2){
            gr.setColor (Color.WHITE);
            // 判断输赢
            if(gowin.isWin (chessArr, n, m)){
                System.out.println ("白棋胜利!!");
            }
            chessFlag = 1;
        }
        // 绘制棋子
        gr.fillOval (chessX, chessY, 50, 50);

    }


    @Override
    public void mouseClicked(MouseEvent e){

    }

    @Override
    public void mouseReleased(MouseEvent e){

    }

    @Override
    public void mouseEntered(MouseEvent e){

    }

    @Override
    public void mouseExited(MouseEvent e){

    }
}

public class GoBangIsWin{

    // 判断是否有五子连棋
    public boolean isWin(int[][] chessArr, int n, int m){
        if(row (chessArr, n, m) >= 5){
            return true;
        }
        return false;

    }

    /**
     *
     * @param chessArr 存储的棋子数组 0 1 2
     * @param n 遍历的起点坐标
     * @param m
     * @return 返回连棋数
     */
    private int row(int[][] chessArr, int n, int m){
        int count = 0;

        // 遍历两个小方向来查找相连棋子数


        return count;


    }

}


posted @ 2022-01-07 16:11  30%privatetoobject  阅读(30)  评论(0)    收藏  举报