Java 简易五子棋的实现 V3.0 人机对战

人机对战就要设计一个AI,但仅仅是五子棋,并不需要太复杂的算法实现AI,想做更复杂的AI,可以去了解MCTS算法。这里用的是权值计算判断落点的思想。完整代码放在最后,后续可能还有优化更新。

-权值法

-AI每次下棋都会遍历所有空余的位置,计算每个格子的权值,最后选择权值最大的格子落子。

-如何计算权值

-这里思考一下五子棋的连子情况,设黑棋为1,白棋为2,空格为0

可能出现的连子情况,并给予对应的权值:

-010        020                        10

-0110        0220                    100

-01110        02220                 1000

-011110        022220             5000   

以上称为活连,即两端都可以下棋

-01        02                             10/2

-011        022                          100/2

-0111        0222                      1000/2

-01111        02222                   5000

以上称为眠连,即只有一端可以下棋,另一端为异色棋子或者为边界

-如何将连子情况与权值对应

-利用哈希表  Key 和 Value

put() 方法存入对应情况,get()方法获取对应权值

    HashMap<String, Integer> map = new HashMap<>();

    {
        map.put("010", 10);
        map.put("0110", 100);
        map.put("01110", 1000);
        map.put("011110", 5000);

        map.put("020", 10);
        map.put("0220", 100);
        map.put("02220", 1000);
        map.put("022220", 5000);

        map.put("01", 10 / 2);
        map.put("011", 100 / 2);
        map.put("0111", 1000 / 2);
        map.put("01111", 5000 / 2);

        map.put("02", 10 / 2);
        map.put("022", 100 / 2);
        map.put("0222", 1000 / 2);
        map.put("02222", 5000 / 2);
    }

    int[][] aiChess = new int[16][16];

-如何将棋子分布转换成对应连子情况

-依旧是遍历,不过这里要分别遍历这个空位的八个方向

以左方向为例:

String codeStr;(连子情况)

int cn = 0;(颜色)

-1.空格左侧直接就是边界——return

-2.空格左侧还是空格——return

-3.空格左侧是棋子——记录颜色至cn ,codeStr = "0" + cn ;

-4.左侧的左侧是边界——return

-5.左侧的左侧是空格——codeStr += 0 然后 return

-6.左侧的左侧是棋子——如果同色,则codeStr += cn 

456三步可以利用for循环来遍历

private void toLeft(int[][] chessList, int r, int c) {
        if (c == 0) {
            return;
        }
        int cn1 = chessList[r][c - 1];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        for (int i = c - 2; i >= 0; i--) {
            if (chessList[r][i] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[r][i] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }

        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
}

-如何整合八个方向的权值

-创建一个新的二维数组,专门存放权值即可

int[][] aiChess = new int[16][16];
//遍历棋盘
    public void getCodeArr(int[][] chessList) {
        for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                int cnum = chessList[i][j];
                if (cnum == 0) {
                    //遍历八个方向
                    toLeft(chessList, i, j);
                    toRight(chessList, i, j);
                    toUp(chessList, i, j);
                    toDown(chessList, i, j);
                    toLeftUp(chessList, i, j);
                    toRightDown(chessList, i, j);
                    toRightUp(chessList, i, j);
                    toLeftDown(chessList, i, j);
                }
            }
        }
        /*for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                System.out.print(aiChess[i][j] + ",");
            }
            System.out.println();
        }*/此处为检验的代码,可以输出每个位置的权值
    }

-如何使用权值

-用for循环遍历整个权值二维数组,记录权值最大的位置,遍历结束后落子在该位置

注意在落子后要判断胜利,落子后要重置权值数组

ai.getCodeArr(chessList);
int max = 0, maxC = -1, maxR = -1;
for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
        if (ai.aiChess[i][j] > max) {
            max = ai.aiChess[i][j];
            maxC = j;
            System.out.println(maxC);
            maxR = i;
            System.out.println(maxR);        
         }    
    }
}
g.setColor(Color.white);
g.fillOval(GoData.calTX(maxC), GoData.calTY(maxR), SIZE, SIZE);
chesses.add(new Chess(maxR, maxC, 2, index++));
chessList[maxR][maxC] = 2;
if (GoData.win(chessList, maxR, maxC)) {
    JOptionPane.showMessageDialog(null, "白棋胜利~");
    isWin = true;
}
ai.aiChess = new int[16][16];

附录

完整代码,不过可能有些废弃的无用代码

GameUI:

package 五子棋0608;

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

public class GameUI implements GoData {
    JFrame loginJF = new JFrame();
    GameJFrame gameJF = new GameJFrame();
    GameListener gameListener = new GameListener();
    Mypanel jp1 = new Mypanel();
    JPanel jp2 = new JPanel();

    public void initLoginUI() {
        loginJF.setTitle("登录");
        loginJF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        loginJF.setLayout(new FlowLayout());
        loginJF.setSize(400, 400);
        loginJF.setLocationRelativeTo(null);
        JLabel nameInLa = new JLabel("账号");
        JTextField nameIn = new JTextField(30);
        JButton jButton = new JButton("登录");
        loginJF.add(nameInLa);
        loginJF.add(nameIn);
        loginJF.add(jButton);
        loginJF.setVisible(true);

        jButton.addActionListener(gameListener);
        gameListener.nameIn = nameIn;
        gameListener.gameUI = this;
    }

    public void initGameUI() {
        gameJF.setTitle("五子棋");
        gameJF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gameJF.setLayout(new BorderLayout());
        gameJF.setSize(900, 900);
        gameJF.setLocationRelativeTo(null);

        jp1.setBackground(Color.white);
        jp2.setPreferredSize(new Dimension(120, 0));
        jp2.setBackground(Color.darkGray);

        gameJF.add(jp1, BorderLayout.CENTER);
        gameJF.add(jp2, BorderLayout.EAST);

        String[] strs = {"开始游戏", "人人对战", "人机对战", "悔棋", "退出"};

        JButton bt1 = new JButton(strs[0]);
        jp2.add(bt1);
        bt1.addActionListener(gameListener);

        ButtonGroup group = new ButtonGroup();
        JRadioButton jRadioButton1 = new JRadioButton(strs[1], true);
        JRadioButton jRadioButton2 = new JRadioButton(strs[2], false);
        group.add(jRadioButton1);
        group.add(jRadioButton2);
        jp2.add(jRadioButton1);
        jp2.add(jRadioButton2);
        jRadioButton1.addActionListener(gameListener);
        jRadioButton2.addActionListener(gameListener);
        gameListener.bt1 = jRadioButton1;
        gameListener.bt2 = jRadioButton2;


        JButton bt2 = new JButton(strs[3]);
        jp2.add(bt2);
        bt2.addActionListener(gameListener);

        JButton bt3 = new JButton(strs[4]);
        jp2.add(bt3);
        bt3.addActionListener(gameListener);

        jp1.gameListener = gameListener;
        jp1.addMouseListener(gameListener);
        gameListener.g = jp1.getGraphics();
    }

    public void showLoginUI() {
        loginJF.setVisible(true);
    }

    public void showGameUI() {
        gameJF.setVisible(true);
        Graphics g = jp1.getGraphics();
        gameListener.g = g;
    }

    public void hideLoginUI() {
        loginJF.setVisible(false);
    }

    public void hideGameUI() {
        gameJF.setVisible(false);
    }

    public static void main(String[] args) {
        GameUI gameUI = new GameUI();
        gameUI.initLoginUI();
        gameUI.initGameUI();

    }
}

MyPanel: 

package 五子棋0608;

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

public class Mypanel extends JPanel implements GoData{
    GameListener gameListener ;
    @Override
    public void paint(Graphics g) {
        super.paint(g);

        BufferedImage img = new BufferedImage(X + COL * SIZE + SIZE, Y + ROW * SIZE + SIZE, 2);
        Graphics imgG = img.getGraphics();

        imgG.setColor(Color.white);

        GoData.drawChessPad(imgG);
        GoData.drawChesses(imgG, gameListener.chessList);

        g.drawImage(img, 0, 0, null);
    }
}

GameListener:

package 五子棋0608;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

public class GameListener extends MouseAdapter implements ActionListener, GoData {
    public GameUI gameUI;
    public JTextField nameIn;
    Graphics g;
    String cl;
    int chessFlag = 1;
    int index = 0;
    ArrayList<Chess> chesses = new ArrayList<>();
    int[][] chessList = new int[ROW + 1][COL + 1];
    AIChess ai = new AIChess();
    Boolean isAI = false;
    Boolean isGoing = false;
    Boolean isWin = false;
    JRadioButton bt1, bt2;

    @Override
    public void actionPerformed(ActionEvent e) {
        String ac = e.getActionCommand();
        cl = ac;
        switch (ac) {
            case "登录" -> {
                String name = nameIn.getText();
                gameUI.showGameUI();
                gameUI.hideLoginUI();
            }
            case "退出" -> {
                gameUI.showLoginUI();
                gameUI.hideGameUI();
            }
            case "开始游戏" -> {
                isGoing = true;
                GoData.drawChessPad(g);
                bt1.setEnabled(!isGoing);
                bt2.setEnabled(!isGoing);
                JButton button = (JButton) e.getSource(); //获取事件对象,因为是按钮,所以强制转换成按钮
                button.setText("结束游戏");
            }
            case "人人对战" -> {
                if (isGoing) {
                    return;
                }
                isAI = false;
            }
            case "人机对战" -> {
                if (isGoing) {
                    return;
                }
                isAI = true;
            }
            case "结束游戏" -> {
                isWin = false;
                isGoing = false;
                if (!isAI) {
                    chessFlag = 1;
                    index = 0;
                    chesses.clear();
                    chessList = new int[ROW + 1][COL + 1];
                } else {
                    chessFlag = 1;
                    index = 0;
                    chesses.clear();
                    chessList = new int[ROW + 1][COL + 1];
                    ai.aiChess = new int[16][16];
                }
                bt1.setEnabled(true);
                bt2.setEnabled(true);
                JButton button = (JButton) e.getSource();
                button.setText("开始游戏");
            }
            case "悔棋" -> {

                if (chesses.isEmpty()) {
                    return;
                }
                if (isWin){
                    isWin = false;
                }
                if (!isAI) {
                    if (chesses.get(chesses.size() - 1).chessFlag == 1) { //确保悔棋后棋子颜色正确
                        chessFlag = 1;
                    } else if (chesses.get(chesses.size() - 1).chessFlag == 2) {
                        chessFlag = 2;
                    }
                    chessList[chesses.get(chesses.size() - 1).x][chesses.get(chesses.size() - 1).y] = 0;
                    chesses.remove(chesses.size() - 1);
                    GoData.drawGamePad(g, chessList);
                } else {
                    chessList[chesses.get(chesses.size() - 1).x][chesses.get(chesses.size() - 1).y] = 0;
                    chesses.remove(chesses.size() - 1);
                    chessList[chesses.get(chesses.size() - 1).x][chesses.get(chesses.size() - 1).y] = 0;
                    chesses.remove(chesses.size() - 1);
                    GoData.drawAIChesses(g, chessList);
                }
            }
        }
        System.out.println(ac);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        System.out.println(x + "," + y);
        if(isWin){
            return;
        }
        if (cl.equals("开始游戏") && !isAI || cl.equals("悔棋") && !isAI) {
            if (GoData.peopleSet1(x, y, chessList, chessFlag, index, chesses, g)) {
                if (chessFlag == 1) { //棋子换色
                    chessFlag = 2;
                } else if (chessFlag == 2) {
                    chessFlag = 1;
                }
                if (GoData.win(chessList, GoData.calC(x), GoData.calR(y))) {
                    JOptionPane.showMessageDialog(null, chessFlag == 1 ? "白棋胜利~" : "黑棋胜利~");
                    chessFlag = 0;
                    isWin = true;
                }
            }
        } else if (cl.equals("开始游戏") && isAI || cl.equals("悔棋") && isAI) {
            if (!GoData.isChessPad(x, y)) {
                return;
            }
            g.setColor(Color.black);
            int chessC = GoData.calC(x);
            int chessR = GoData.calR(y);
            System.out.println(chessR + "," + chessC);
            if (chessList[chessR][chessC] != 0) {
                return;
            }
            GoData.addChess(chesses, chessR, chessC, 1, index);
            chessList[chessR][chessC] = 1;
            int tx = GoData.calTX(chessC);
            int ty = GoData.calTY(chessR);
            g.fillOval(tx, ty, SIZE, SIZE);
            if (GoData.win(chessList, chessR, chessC)) {
                JOptionPane.showMessageDialog(null, "黑棋胜利~");
                isWin = true;
                return;
            }

            ai.getCodeArr(chessList);
            int max = 0, maxC = -1, maxR = -1;
            for (int i = 0; i < 16; i++) {
                for (int j = 0; j < 16; j++) {
                    if (ai.aiChess[i][j] > max) {
                        max = ai.aiChess[i][j];
                        maxC = j;
                        System.out.println(maxC);
                        maxR = i;
                        System.out.println(maxR);
                    }
                }
            }
            g.setColor(Color.white);
            g.fillOval(GoData.calTX(maxC), GoData.calTY(maxR), SIZE, SIZE);
            chesses.add(new Chess(maxR, maxC, 2, index++));
            chessList[maxR][maxC] = 2;
            if (GoData.win(chessList, maxR, maxC)) {
                JOptionPane.showMessageDialog(null, "白棋胜利~");
                isWin = true;
            }
            ai.aiChess = new int[16][16];
        }
    }
}

Chess:

package 五子棋0608;

public class Chess {
    int chessFlag;
    int x,y,index;

    public Chess(int x,int y, int chessFlag ,int i){
        this.x = x;
        this.y = y;
        this.chessFlag = chessFlag;
        index = i;
    }
}

AIChess:

package 五子棋0608;

import java.awt.*;
import java.util.HashMap;

public class AIChess implements GoData {

    HashMap<String, Integer> map = new HashMap<>();

    {
        map.put("010", 10);
        map.put("0110", 100);
        map.put("01110", 1000);
        map.put("011110", 5000);

        map.put("020", 10);
        map.put("0220", 100);
        map.put("02220", 1000);
        map.put("022220", 5000);

        map.put("01", 10 / 2);
        map.put("011", 100 / 2);
        map.put("0111", 1000 / 2);
        map.put("01111", 5000 / 2);

        map.put("02", 10 / 2);
        map.put("022", 100 / 2);
        map.put("0222", 1000 / 2);
        map.put("02222", 5000 / 2);
    }

    int[][] aiChess = new int[16][16];

    //Text
//    public static void main(String[] args) {
//        int[][] arr = {
//                {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
//        };
//        AIChess aiChess1 = new AIChess();
//        aiChess1.getCodeArr(arr);
//    }

    //遍历棋盘
    public void getCodeArr(int[][] chessList) {
        for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                int cnum = chessList[i][j];
                if (cnum == 0) {
                    //遍历八个方向
                    toLeft(chessList, i, j);
                    toRight(chessList, i, j);
                    toUp(chessList, i, j);
                    toDown(chessList, i, j);
                    toLeftUp(chessList, i, j);
                    toRightDown(chessList, i, j);
                    toRightUp(chessList, i, j);
                    toLeftDown(chessList, i, j);
                }
            }
        }
        /*for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                System.out.print(aiChess[i][j] + ",");
            }
            System.out.println();
        }*/
    }

    //左下
    private void toLeftDown(int[][] chessList, int r, int c) {
        if (r == 15 || c == 0) {
            return;
        }
        int cn1 = chessList[r + 1][c - 1];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        int k = 2;
        for (int i = r + 2; i <= 15; i++) {
            int j = c - k;
            if (j < 0) {
                break;
            }
            k--;
            if (chessList[i][j] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[i][j] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }
        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    //右上
    private void toRightUp(int[][] chessList, int r, int c) {
        if (r == 0 || c == 15) {
            return;
        }
        int cn1 = chessList[r - 1][c + 1];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        int k = 2;
        for (int i = r - 2; i >= 0; i--) {
            int j = c + k;
            if (j > 15) {
                break;
            }
            k++;
            if (chessList[i][j] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[i][j] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }
        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    //右下
    private void toRightDown(int[][] chessList, int r, int c) {
        if (r == 15 || c == 15) {
            return;
        }
        int cn1 = chessList[r + 1][c + 1];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        int k = 2;
        for (int i = r + 2; i <= 15; i++) {
            int j = c + k;
            if (j > 15) {
                break;
            }
            k++;
            if (chessList[i][j] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[i][j] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }
        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    //左上
    private void toLeftUp(int[][] chessList, int r, int c) {
        if (r == 0 || c == 0) {
            return;
        }
        int cn1 = chessList[r - 1][c - 1];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        int k = 2;
        for (int i = r - 2; i >= 0; i--) {
            int j = c - k;
            if (j < 0) {
                break;
            }
            k--;
            if (chessList[i][j] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[i][j] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }
        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    //向下
    private void toDown(int[][] chessList, int r, int c) {
        if (r == 15) {
            return;
        }
        int cn1 = chessList[r + 1][c];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        for (int i = r + 2; i <= 15; i++) {
            if (chessList[i][c] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[i][c] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }
        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    //向上
    private void toUp(int[][] chessList, int r, int c) {
        if (r == 0) {
            return;
        }
        int cn1 = chessList[r - 1][c];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        for (int i = r - 2; i >= 0; i--) {
            if (chessList[i][c] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[i][c] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }
        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    //向右
    private void toRight(int[][] chessList, int r, int c) {
        if (c == 15) {
            return;
        }
        int cn1 = chessList[r][c + 1];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        for (int i = c + 2; i <= 15; i++) {
            if (chessList[r][i] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[r][i] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }
        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    //向左计算权值
    private void toLeft(int[][] chessList, int r, int c) {
        if (c == 0) {
            return;
        }
        int cn1 = chessList[r][c - 1];
        if (cn1 == 0) {
            return;
        }
        String codeStr = "0" + cn1;
        for (int i = c - 2; i >= 0; i--) {
            if (chessList[r][i] == cn1) {
                codeStr += cn1;
            } else {
                if (chessList[r][i] == 0) {
                    codeStr += "0";
                }
                break;
            }
        }

        int code = map.get(codeStr);
//        System.out.println("codeStr: " + codeStr + "code: " + code);
        aiChess[r][c] += code;
    }

    public void playAI(int[][] chessList, Graphics g) {

        getCodeArr(chessList);
        int maxnum = 0, maxX = 0, maxY = 0;
        for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                if (aiChess[i][j] > maxnum) {
                    maxnum = aiChess[i][j];
                    maxX = i;
                    maxY = j;
                }
            }
        }
        g.setColor(Color.white);
        g.fillOval(GoData.calTX(maxX), GoData.calTY(maxY), SIZE, SIZE);
    }


}

GoData:

package 五子棋0608;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

public interface GoData {
    int X = 70, Y = 70, SIZE = 40, COL = 15, ROW = 15;

    public static boolean win(int[][] cl, int c, int d) {
        if (col(cl, c, d) >= 5 || row(cl, c, d) >= 5 || left(cl, c, d) >= 5 || right(cl, c, d) >= 5) {
            return true;
        }
        return false;
    }

    public static int col(int[][] cl, int c, int d) {
        int n = 1;
        for (int i = d + 1; i <= ROW; i++) {//左右
            if (cl[c][i] == cl[c][d]) {
                n++;
            } else {
                break;
            }
        }
        for (int i = d - 1; i >= 0; i--) {
            if (cl[c][i] == cl[c][d]) {
                n++;
            } else {
                break;
            }
        }
        return n;
    }

    public static int row(int[][] cl, int c, int d) {
        int n = 1;
        for (int i = c + 1; i <= COL; i++) {//上下
            if (cl[c][d] == cl[i][d]) {
                n++;
            } else {
                break;
            }
        }
        for (int i = c - 1; i >= 0; i--) {
            if (cl[c][d] == cl[i][d]) {
                n++;
            } else {
                break;
            }
        }
        return n;
    }

    public static int left(int[][] cl, int c, int d) {
        int n = 1, k = 1;
        for (int i = c + 1; i <= ROW; i++) {
            int j = d + k;
            if (j > COL)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        k = 1;
        for (int i = c - 1; i >= 0; i--) {
            int j = d - k;
            if (j < 0)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        return n;
    }

    public static int right(int[][] cl, int c, int d) {
        int n = 1, k = 1;
        for (int i = c + 1; i <= ROW; i++) {
            int j = d - k;
            if (j < 0)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        k = 1;
        for (int i = c - 1; i >= 0; i--) {
            int j = d + k;
            if (j > COL)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        return n;
    }

    public static void drawBackGround(Graphics g, int[][] cl) {
        BufferedImage img = new BufferedImage(X + COL * SIZE + SIZE, Y + ROW * SIZE + SIZE, 2);
        Graphics imgG = img.getGraphics();

        imgG.setColor(Color.white);
//        imgG.fillRect(0, 0, jf.getWidth(), jf.getHeight());

        drawChessPad(imgG);
        drawChesses(imgG, cl);

        g.drawImage(img, 0, 0, null);
    }

    public static void drawGamePad(Graphics g, int[][] cl) {
        drawChessPad(g);
        drawChesses(g, cl);
    }

    public static void drawChessPad(Graphics g) { //绘制棋盘
        g.setColor(Color.orange);
        g.fillRect(X - 20, Y - 20, SIZE * (COL + 1), SIZE * (ROW + 1));

        g.setColor(Color.black);
        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 + (COL * SIZE));
        }
    }

    public static void drawChesses(Graphics g, int[][] cl) {
        for (int i = 0; i <= ROW; i++) {
            for (int j = 0; j <= COL; j++) {
                if (cl[i][j] == 1) {
                    g.setColor(Color.black);
                } else if (cl[i][j] == 2) {
                    g.setColor(Color.white);
                } else {
                    continue;
                }
                int chessX = i * SIZE + X - SIZE / 2;
                int chessY = j * SIZE + Y - SIZE / 2;
                g.fillOval(chessX, chessY, SIZE, SIZE);
            }
        }
    }

    public static void drawAIChesses(Graphics g, int[][] cl){
        drawChessPad(g);
        for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                if (cl[i][j] == 1){
                    g.setColor(Color.black);
                    g.fillOval(calTX(j),calTY(i),SIZE,SIZE);
                } else if (cl[i][j] == 2) {
                    g.setColor(Color.white);
                    g.fillOval(calTX(j),calTY(i),SIZE,SIZE);
                }
            }
        }
    }

    public static void addChess(ArrayList<Chess> chesses, int r, int c, int chessFlag, int index){
        Chess chess = new Chess(r, c, chessFlag, index++);
        chesses.add(chess);
    }

    public static int calC(int x) {
        int c = (x - X + SIZE / 2) / SIZE;
        return c;
    }

    public static int calR(int y) {
        int r = (y - Y + SIZE / 2) / SIZE;
        return r;
    }

    public static boolean isChessPad(int x, int y) {
        if (x < X - SIZE / 2 || x > X - SIZE / 2 + (COL + 1) * SIZE || y < Y - SIZE / 2 || y > Y - SIZE / 2 + (ROW + 1) * SIZE) { //确保棋子不出棋盘
            return false;
        }
        return true;
    }

    public static int calTX(int c) {
        int x = c * SIZE + X - SIZE / 2;
        return x;
    }

    public static int calTY(int r) {
        int y = r * SIZE + Y - SIZE / 2;
        return y;
    }

    public static boolean peopleSet1(int x, int y, int[][] chessList, int chessFlag, int index, ArrayList<Chess> chesses, Graphics g) {
        if (!GoData.isChessPad(x, y)) { //确保棋子不出棋盘
            return false;
        }
        int c = GoData.calC(x); //c,d为棋子在棋盘上的格子坐标
        int d = GoData.calR(y);

        if (chessList[c][d] != 0) { //判断棋子是否重叠
            return false;
        }

        chessList[c][d] = chessFlag; //棋子坐标和颜色
        Chess chess = new Chess(c, d, chessFlag, index++);
        chesses.add(chess); //棋子顺序

        int chessX = GoData.calTX(c); //格子坐标换算窗口坐标
        int chessY = GoData.calTY(d);

        if (chessFlag == 1) { //棋子换色
            g.setColor(Color.black);
        } else if (chessFlag == 2) {
            g.setColor(Color.white);
        }

        g.fillOval(chessX, chessY, SIZE, SIZE);
        return true;
    }


    public static boolean peopleSet2(int x, int y, int[][] chessList, int chessFlag, int index, ArrayList<Chess> chesses, Graphics g) {
        if (!GoData.isChessPad(x, y)) { //确保棋子不出棋盘
            return false;
        }
        int c = GoData.calC(x); //c,d为棋子在棋盘上的格子坐标
        int d = GoData.calR(y);

        if (chessList[c][d] != 0) { //判断棋子是否重叠
            return false;
        }
        g.setColor(Color.black);
        chessList[c][d] = chessFlag; //棋子坐标和颜色
        Chess chess = new Chess(c, d, chessFlag, index++);
        chesses.add(chess); //棋子顺序

        int chessX = GoData.calTX(c); //格子坐标换算窗口坐标
        int chessY = GoData.calTY(d);

        g.fillOval(chessX, chessY, SIZE, SIZE);
        return true;
    }


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值