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; } }