import java.util.Scanner; import java.util.Random;

public class Gobang { // 储存棋盘状态的二维数组 static int[][] chessBoard = new int[8][8];

// 判断胜负
public static boolean isWin(int color) {
    // 判断横向连续五个棋子
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 4; j++) {
            if (chessBoard[i][j] == color && chessBoard[i][j+1] == color 
                && chessBoard[i][j+2] == color && chessBoard[i][j+3] == color 
                && chessBoard[i][j+4] == color) {
                return true;
            }
        }
    }

    // 判断纵向连续五个棋子
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 8; j++) {
            if (chessBoard[i][j] == color && chessBoard[i+1][j] == color 
                && chessBoard[i+2][j] == color && chessBoard[i+3][j] == color 
                && chessBoard[i+4][j] == color) {
                return true;
            }
        }
    }

    // 判断正斜向连续五个棋子
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (chessBoard[i][j] == color && chessBoard[i+1][j+1] == color 
                && chessBoard[i+2][j+2] == color && chessBoard[i+3][j+3] == color 
                && chessBoard[i+4][j+4] == color) {
                return true;
            }
        }
    }

    // 判断反斜向连续五个棋子
    for (int i = 0; i < 4; i++) {
        for (int j = 4; j < 8; j++) {
            if (chessBoard[i][j] == color && chessBoard[i+1][j-1] == color 
                && chessBoard[i+2][j-2] == color && chessBoard[i+3][j-3] == color 
                && chessBoard[i+4][j-4] == color) {
                return true;
            }
        }
    }

    return false;
}

// 计算估价函数
public static int evaluate(int color, int x, int y) {
    int score = 0;
    int count = 0;

    // 横向
    for (int i = x-1; i >= 0; i--) {
        if (chessBoard[y][i] == color) {
            count++;
        } else {
            break;
        }
    }
    for (int i = x+1; i < 8; i++) {
        if (chessBoard[y][i] == color) {
            count++;
        } else {
            break;
        }
    }
    switch (count) {
        case 1: score += 1; break;
        case 2: score += 10; break;
        case 3: score += 100; break;
        case 4: score += 1000; break;
    }
    count = 0;

    // 纵向
    for (int i = y-1; i >= 0; i--) {
        if (chessBoard[i][x] == color) {
            count++;
        } else {
            break;
        }
    }
    for (int i = y+1; i < 8; i++) {
        if (chessBoard[i][x] == color) {
            count++;
        } else {
            break;
        }
    }
    switch (count) {
        case 1: score += 1; break;
        case 2: score += 10; break;
        case 3: score += 100; break;
        case 4: score += 1000; break;
    }
    count = 0;

    // 正斜向
    for (int i = x-1, j = y-1; i >= 0 && j >= 0; i--, j--) {
        if (chessBoard[j][i] == color) {
            count++;
        } else {
            break;
        }
    }
    for (int i = x+1, j = y+1; i < 8 && j < 8; i++, j++) {
        if (chessBoard[j][i] == color) {
            count++;
        } else {
            break;
        }
    }
    switch (count) {
        case 1: score += 1; break;
        case 2: score += 10; break;
        case 3: score += 100; break;
        case 4: score += 1000; break;
    }
    count = 0;

    // 反斜向
    for (int i = x+1, j = y-1; i < 8 && j >= 0; i++, j--) {
        if (chessBoard[j][i] == color) {
            count++;
        } else {
            break;
        }
    }
    for (int i = x-1, j = y+1; i >= 0 && j < 8; i--, j++) {
        if (chessBoard[j][i] == color) {
            count++;
        } else {
            break;
        }
    }
    switch (count) {
        case 1: score += 1; break;
        case 2: score += 10; break;
        case 3: score += 100; break;
        case 4: score += 1000; break;
    }

    return score;
}

// 人类玩家落子
public static void humanPlayer(int[] coord) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入落子位置(x, y):");
    coord[0] = scanner.nextInt();
    coord[1] = scanner.nextInt();
    while (chessBoard[coord[1]][coord[0]] != 0) {
        System.out.print("该位置已有棋子,请重新输入落子位置(x, y):");
        coord[0] = scanner.nextInt();
        coord[1] = scanner.nextInt();
    }
    chessBoard[coord[1]][coord[0]] = 1;
}

// 电脑玩家落子
public static void computerPlayer(int[] coord) {
    Random random = new Random();
    int maxScore = 0;

    // 遍历棋盘,找到最高分数的位置
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            if (chessBoard[i][j] == 0) {
                int score = evaluate(2, j, i);
                if (score > maxScore) {
                    maxScore = score;
                    coord[0] = j;
                    coord[1] = i;
                }
            }
        }
    }

    chessBoard[coord[1]][coord[0]] = 2;
}

// 打印棋盘
public static void printChessBoard() {
    System.out.print("  ");
    for (int i = 0; i < 8; i++) {
        System.out.print(i + " ");
    }
    System.out.println();
    for (int i = 0; i < 8; i++) {
        System.out.print(i + " ");
        for (int j = 0; j < 8; j++) {
            if (chessBoard[i][j] == 0) {
                System.out.print("+ ");
            } else if (chessBoard[i][j] == 1) {
                System.out.print("● ");
            } else {
                System.out.print("○ ");
            }
        }
        System.out.println();
    }
}

public static void main(String[] args) {
    int[] coord = new int[2];
    int turn = 1; // 1表示人类玩家,2表示电脑玩家

    // 初始化棋盘
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            chessBoard[i][j] = 0;
        }
    }

    while (!isWin(1) && !isWin(2)) {
        printChessBoard();
        if (turn == 1) {
            humanPlayer(coord);
        } else {
            computerPlayer(coord);
        }
        turn

原文地址: https://www.cveoy.top/t/topic/eDKJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录