人机对战就要设计一个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;
}
}