很sb的电脑五子棋:import java.io.*; import java.util.*; public class Gobang { // 定义一个二维数组来充当棋盘 private String[][] board; // 定义棋盘的大小 private static int BOARD_SIZE = 15; public void initBoard() { // 初始化棋盘数组 board = new String[BOARD_SIZE][BOARD_SIZE]; // 把每个元素赋为"╋",用于在控制台画出棋盘 for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { // windows是一行一行来打印的。坐标值为(行值, 列值) board[i][j] = "╋"; } } } // 在控制台输出棋盘的方法 public void printBoard() { // 打印每个数组元素 for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { // 打印数组元素后不换行 System.out.print(board[i][j]); } // 每打印完一行数组元素后输出一个换行符 System.out.print("\n"); } } // 该方法处理电脑下棋:随机生成2个整数,作为电脑下棋的坐标,赋给board数组。 private void compPlay() { // 构造一个随机数生成器 Random rnd = new Random(); // Random类的nextInt(int n))方法:随机地生成并返回指定范围中的一个 int 值, // 即:在此随机数生成器序列中 0(包括)和 n(不包括)之间均匀分布的一个int值。 int compXPos = rnd.nextInt(15); int compYPos = rnd.nextInt(15); // 保证电脑下的棋的坐标上不能已经有棋子(通过判断对应数组元素只能是"╋"来确定) while (board[compXPos][compYPos].equals("╋") == false) { compXPos = rnd.nextInt(15); compYPos = rnd.nextInt(15); } System.out.println(compXPos); System.out.println(compYPos); // 把对应的数组元素赋为"○"。 board[compXPos][compYPos] = "○"; } // 该方法用于判断胜负:进行四次循环扫描,判断横、竖、左斜、右斜是否有5个棋连在一起 private boolean judgeWin() { // flag表示是否可以断定赢/输 boolean flag = false; // joinEle:将每一个横/竖/左斜/右斜行中的元素连接起来得到的一个字符串 String joinEle; // 进行横行扫描 for (int i = 0; i < BOARD_SIZE; i++) { // 每扫描一行前,将joinEle清空 joinEle = ""; for (int j = 0; j < BOARD_SIZE; j++) { joinEle += board[i][j]; } // String类的contains方法:当且仅当该字符串包含指定的字符序列时,返回true。 if (joinEle.contains("●●●●●")) { System.out.println("您赢啦!"); flag = true; // 停止往下继续执行,提前返回flag。 // 如果执行了这个return,就直接返回该方法的调用处; // 不会再执行后面的任何语句,包括最后那个return语句。 // (而break仅仅是完全跳出这个for循环,还会继续执行下面的for循环。) return flag; } else if (joinEle.contains("○○○○○")) { System.out.println("您输啦!"); flag = true; // 提前返回flag return flag; } } // 进行竖行扫描 for (int i = 0; i < BOARD_SIZE; i++) { joinEle = ""; for (int j = 0; j < BOARD_SIZE; j++) { // 竖行的元素是它们的列值相同 joinEle += board[j][i]; } if (joinEle.contains("●●●●●")) { System.out.println("您赢啦!"); flag = true; return flag; } else if (joinEle.contains("○○○○○")) { System.out.println("您输啦!"); flag = true; return flag; } } // 进行左斜行扫描 for (int i = -(BOARD_SIZE - 2); i < BOARD_SIZE - 1; i++) { joinEle = ""; for (int j = 0; j < BOARD_SIZE; j++) { int line = i + j; // 只截取坐标值没有越界的点 if (line >= 0 && line < 15) { joinEle += board[j][line]; } } if (joinEle.contains("●●●●●")) { System.out.println("您赢啦!"); flag = true; return flag; } else if (joinEle.contains("○○○○○")) { System.out.println("您输啦!"); flag = true; return flag; } } // 进行右斜行扫描 for (int i = 1; i < 2 * (BOARD_SIZE - 1); i++) { joinEle = ""; for (int j = 0; j < BOARD_SIZE; j++) { int line = i - j; if (line >= 0 && line < 15) { joinEle += board[j][line]; } } if (joinEle.contains("●●●●●")) { System.out.println("您赢啦!"); flag = true; return flag; } else if (joinEle.contains("○○○○○")) { System.out.println("您输啦!"); flag = true; // 最后这个return可省略 } } // 确保该方法有返回值(如果上面条件都不满足时) return flag; } public static void main(String[] args) throws Exception, IOException { Gobang gb = new Gobang(); gb.initBoard(); gb.printBoard(); // BufferedReader类:带缓存的读取器————从字符输入流中读取文本,并缓存字符。可用于高效读取字符、数组和行。 // 最好用它来包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。 // 下面构造一个读取器对象。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 定义输入字符串 String inputStr = null; // br.readLine():每当在键盘上输入一行内容按回车,刚输入的内容将被br(读取器对象)读取到。 // BufferedReader类的readLine方法:读取一个文本行。 // 初始状态由于无任何输入,br.readLine()会抛出异常。因而main方法要捕捉异常。 while ((inputStr = br.readLine()) != null) { // 将用户输入的字符串以逗号(,)作为分隔符,分隔成2个字符串。 // String类的split方法,将会返回一个拆分后的字符串数组。 String[] posStrArr = inputStr.split(","); // 将2个字符串转换成用户下棋的坐标 int xPos = Integer.parseInt(posStrArr[0]); int yPos = Integer.parseInt(posStrArr[1]); // 校验用户下棋坐标的有效性,只能是数字,不能超出棋盘范围 if (xPos > 15 || xPos < 1 || yPos > 15 || yPos < 1) { System.out.println("您下棋的坐标值应在1到15之间,请重新输入!"); continue; } // 保证用户下的棋的坐标上不能已经有棋子(通过判断对应数组元素只能是"╋"来确定) // String类的equals方法:比较字符串和指定对象是否相等。结果返回true或false。 if (gb.board[xPos - 1][yPos - 1].equals("╋")) { // 把对应的数组元素赋为"●"。 gb.board[xPos - 1][yPos - 1] = "●"; } else { System.out.println("您下棋的点已有棋子,请重新输入!"); continue; } // 电脑下棋 gb.compPlay(); gb.printBoard(); // 每次下棋后,看是否可以断定赢/输了 if (gb.judgeWin() == false) { System.out.println("请输入您下棋的坐标,应以x,y的格式:"); } else { // 完全跳出这个while循环,结束下棋 break; } } } }