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

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

// 判断胜负
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;
}

// 计算估价函数
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;
}

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

// 电脑玩家落子
static void computerPlayer(int[] pos) {
    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;
                    pos[0] = j;
                    pos[1] = i;
                }
            }
        }
    }
    chessBoard[pos[1]][pos[0]] = 2;
}

// 打印棋盘
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[] pos = new int[2];
    int turn = 1; // 1表示人类玩家,2表示电脑玩家
    while (!isWin(1) && !isWin(2)) {
        printChessBoard();
        if (turn == 1) {
            humanPlayer(pos);
        } else {
            computerPlayer(pos);
        }
        turn = 3 - turn; // 切换玩家
    }
    printChessBoard();
    if (isWin(1)) {
        System.out.println("人类玩家获胜!");
    } else {
        System.out.println("电脑玩家获胜!");
    }
}
把下面代码换成JAVA#includeiostream#includecstdlib#includectimeusingnamespacestd;储存棋盘状态的二维数组intchessBoard88=0000000000000000000000000000000000000000000000000000000000000000;判断胜负boolisWinintcolor判断横向连续五个棋子fori

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

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