java 控制台版五子棋

java 控制台版五子棋

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.Scanner;
import java.util.regex.PatternSyntaxException;

public class ConsoleGobang {
    public static final int BOARD_SIZE = 16;  // 棋盘大小,包含上指示器和左指示器
    public static String[][] stringArr;  // 存放棋盘
    public static Random random = new Random();  // 生成电脑下棋的随机数
    public static Scanner scanner = new Scanner(System.in); // 用于扫描用户输入
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 获取用户输入
    public static int userX = 0;  // 用于计算水平方向用户
    public static int compX = 0;  // 用于计算水平方向电脑
    public static int userY = 0;  // 用于计算垂直方向用户
    public static int compY = 0;  // 用于计算垂直方向电脑
    public static int userXN = 0; // 用于计算西南方向用户
    public static int compXN = 0; // 用于计算西南方向电脑
    public static int userDB = 0; // 用于计算东北方向用户
    public static int compDB = 0; // 用于计算西东北向电脑


    public static void main(String[] args) throws IOException {
        System.out.println("开始五子棋游戏!");
        initCheckerBoard();// 初始化棋盘
        printCheckerBoard();// 打印棋盘
        // 谁先下棋
        System.out.println("输入1玩家线下,输入2电脑线下,其他选项退出游戏:");
        int i = scanner.nextInt();
        if (i == 1) {  // 玩家先下
            while (true) {
                System.out.println("请输入下棋的坐标,格式为[x,y]:");
                // 人下棋
                String line;
                while ((line = br.readLine()) != null) {
                    try {
                        String[] split = line.split(","); // 分割用户输入的坐标
                        int x = Integer.parseInt(split[0]);
                        int y = Integer.parseInt(split[1]);
                        if (x > BOARD_SIZE || x < 1 || y > BOARD_SIZE || y < 1) {  // 判断用户输入的坐标
                            System.out.println("棋盘上没有位置[" + x + "," + y + "],请输入[1~15]之间的数字:");
                        } else {
                            System.out.println("玩家下棋坐标[x=" + x + ",y=" + y + "]");
                            // 如果用户输入的坐标上有棋子则提示重新输入坐标
                            if (isHavePiece(x, y)) {
                                System.out.println("棋盘上该位置[" + x + "," + y + "]已经有棋子,请输入下棋的坐标,格式为[x,y]:");
                            } else {
                                stringArr[x][y] = "●";
                                break;
                            }
                        }
                    } catch (PatternSyntaxException | NumberFormatException e) {
                        System.out.println("输入坐标格式有误,请输入下棋的坐标,格式为[x,y]:");
                    }
                }
                // 电脑下棋
                computer();
                // 打印棋盘
                printCheckerBoard();

                if (isSuccess()) {  // 判断输赢
                    System.out.println("游戏结束");
                    return;
                }
            }

        } else if (i == 2) {  // 电脑线下
            while (true) {
                // 电脑下棋
                computer();
                printCheckerBoard(); // 打印棋盘

                // 人下棋
                System.out.println("请输入下棋的坐标,格式为[x,y]:");
                String line;
                while ((line = br.readLine()) != null) {
                    try {
                        String[] split = line.split(","); // 分割用户输入的坐标
                        int x = Integer.parseInt(split[0]);
                        int y = Integer.parseInt(split[1]);
                        if (x > BOARD_SIZE || x < 1 || y > BOARD_SIZE || y < 1) {  // 判断用户输入的坐标
                            System.out.println("棋盘上没有位置[" + x + "," + y + "],请输入[1~15]之间的数字:");
                        } else {
                            System.out.println("玩家下棋坐标[x=" + x + ",y=" + y + "]");
                            // 如果用户输入的坐标上有棋子则提示重新输入坐标
                            if (isHavePiece(x, y)) {
                                System.out.println("棋盘上该位置[" + x + "," + y + "]已经有棋子,请输入下棋的坐标,格式为[x,y]:");
                            } else {
                                stringArr[x][y] = "●";
                                break;
                            }
                        }
                    } catch (PatternSyntaxException | NumberFormatException e) {
                        System.out.println("输入坐标格式有误,请输入下棋的坐标,格式为[x,y]:");
                    }
                }

                printCheckerBoard(); // 打印棋盘
                // 判断输赢
                if (isSuccess()) {
                    System.out.println("游戏结束");
                    return;
                }
            }

        } else {
            System.out.println("退出");
        }

    }

    /**
     * 初始化创建18*18的棋盘
     */
    public static void initCheckerBoard() {
        stringArr = new String[BOARD_SIZE][BOARD_SIZE];
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                // 绘制棋盘边界的指示器
                if (i == 0) {
                    stringArr[i][j] = String.valueOf(j);
                } else if (j == 0) {
                    stringArr[i][j] = String.valueOf(i);
                } else {  // 绘制棋盘的格子
                    stringArr[i][j] = "✚";
                }
            }
        }
    }

    /**
     * 打印棋盘
     */
    public static void printCheckerBoard() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                System.out.print(stringArr[i][j] + "\t");
            }
            System.out.println();
        }
    }

    /**
     * 电脑下棋
     */
    public static void computer() {
        // random.nextInt(BOARD_SIZE+1)/*0,BOARD_SIZE之间的随机整数*/;
        int i = random.nextInt(BOARD_SIZE - 1) + 1;//范围1-BOARD_SIZE减1
        int j = random.nextInt(BOARD_SIZE - 1) + 1;//范围1-BOARD_SIZE减1

        if (isHavePiece(i, j)) { // 递归
            // 有棋子
            computer();
            return;
        } else {
            System.out.println("电脑下棋坐标[x=" + i + ",y=" + j + "]");
            stringArr[i][j] = "○";
        }


    }
    
    /**
     * 判断棋盘上某个位置是否有棋子
     *
     * @param x 电脑或者用户输入的坐标x
     * @param y 电脑或者用户输入的坐标y
     * @return 如果坐标上有棋子则返回true,没有返回false
     */
    public static boolean isHavePiece(int x, int y) {
        return stringArr[x][y].equals("●") || stringArr[x][y].equals("○");
    }


    /**
     * 判断输赢
     *
     * @return 返回true则代表胜利,false则代表失败
     */
    public static boolean isSuccess() {

        // 一、横向x判断
        for (int i = 0; i < stringArr.length; i++) {
            for (int j = 0; j < stringArr[i].length; j++) {
                if (stringArr[i][j].equals("●")) {  // 循环统计连续出现则让计数器自加1
                    userX++;
                } else {
                    userX = 0;  // 如果不连续则让计数器归零
                }
                if (stringArr[i][j].equals("○")) {
                    compX++;
                } else {
                    compX = 0;
                }
                // 如果横向大于5返回true
                if (compX >= 5 || userX >= 5) return true;
            }
        }


        // 二、纵向y判断
        for (int i = 0; i < stringArr.length; i++) {
            for (int j = 0; j < stringArr[i].length; j++) {
                if (stringArr[j][i].equals("●")) {
                    userY++;
                } else {
                    userY = 0;
                }
                if (stringArr[j][i].equals("○")) {
                    compY++;

                } else {
                    compY = 0;
                }
                // 判断纵向是否为5
                if (userY >= 5 || compY >= 5) return true;
            }
        }


        // 三、西南向判断
        // 右斜↗(西南)
        // 对角线左上方
        for (int k = 0; k < BOARD_SIZE - 1; k++) {
            for (int i = 0, j = k; i < BOARD_SIZE - 1 && j >= 0; i++, j--) {
                if (stringArr[i][j].equals("●")) {
                    userXN++;
                } else {
                    userXN = 0;
                }
                if (stringArr[i][j].equals("○")) {
                    compXN++;
                } else {
                    compXN = 0;
                }

                // 判断和是否为5
                if (userXN >= 5 || compXN >= 5) return true;
            }

        }
        // 对角线↗
        for (int i = 0, j = BOARD_SIZE - 1; i < BOARD_SIZE - 1 && j >= 0; i++, j--) {
            if (stringArr[i][j].equals("●")) {
                userXN++;
            } else {
                userXN = 0;
            }
            if (stringArr[i][j].equals("○")) {
                compXN++;
            } else {
                compXN = 0;
            }

            // 判断和是否为5
            if (userXN >= 5 || compXN >= 5) return true;

        }

        // 对角线右下方
        for (int k = 1; k < BOARD_SIZE; k++) {
            for (int i = k, j = BOARD_SIZE - 1; i < BOARD_SIZE && j >= 0; i++, j--) {
                if (stringArr[i][j].equals("●")) {
                    userXN++;
                } else {
                    userXN = 0;
                }
                if (stringArr[i][j].equals("○")) {
                    compXN++;
                } else {
                    compXN = 0;
                }

                // 判断和是否为5
                if (userXN >= 5 || compXN >= 5) return true;
            }
        }


        // 四、东北方向
        // 左斜方↖
        // 对角线右上方
        for (int k = 1; k < BOARD_SIZE; k++) {
            for (int i = 0, j = k; i < BOARD_SIZE - 1 && j < BOARD_SIZE; i++, j++) {
                if (stringArr[i][j].equals("●")) {
                    userDB++;
                } else {
                    userDB = 0;
                }
                if (stringArr[i][j].equals("○")) {
                    compDB++;
                } else {
                    compDB = 0;
                }

                // 判断和是否为5
                if (userDB >= 5 || compDB >= 5) return true;
            }

        }
        // 对角线↖
        for (int i = 0, j = 0; i < BOARD_SIZE - 1 && j < BOARD_SIZE; i++, j++) {
            if (stringArr[i][j].equals("●")) {
                userDB++;
            } else {
                userDB = 0;
            }
            if (stringArr[i][j].equals("○")) {
                compDB++;
            } else {
                compDB = 0;
            }

            // 判断和是否为5
            if (userDB >= 5 || compDB >= 5) return true;
        }


        // 对角线左下方
        for (int k = 1; k < BOARD_SIZE; k++) {
            for (int i = k, j = 0; i < BOARD_SIZE && j < BOARD_SIZE; i++, j++) {
                if (stringArr[i][j].equals("●")) {
                    userDB++;
                } else {
                    userDB = 0;
                }
                if (stringArr[i][j].equals("○")) {
                    compDB++;
                } else {
                    compDB = 0;
                }

                // 判断和是否为5
                if (userDB >= 5 || compDB >= 5) return true;
            }

        }
        return false;
    }
}

效果展示

java 控制台版五子棋
java 控制台版五子棋

上一篇:5883. 判断单词是否能放入填字游戏内


下一篇:每日一题:419. 甲板上的战舰