1、初始化游戏界面:
/ * 初始化游戏界面: */ public void StartGream() { for (int i = 1; i < 4; i++) for (int j = 1; j < 4; j++) chess[i][j] = '-'; //首先让用户选择使用的符号:X/O,1为X,2为O System.out.println("欢迎您来到本游戏界面"); System.out.println("请您选择您的游戏符号:X/O,输入数字1为X,数字2为O!"); Scanner in = new Scanner(System.in); int a = in.nextInt(); if (a == 1) { player = 'X'; computer = 'O'; } else if (a == 2) { player = 'O'; computer = 'X'; } else { player = 'X'; computer = 'O'; System.out.println("输入错误字符,默认玩家字符为X"); } //开始选择谁先手,玩家先手,还是机器先手? System.out.println("请您选择是否先手?先手请按数字1,否则请按数字2!"); Scanner in1 = new Scanner(System.in); int b = in1.nextInt(); if (b == 1) { //玩家先手,画井字棋盘 Print(); } else if (b == 2) { //开局随便下 Random rand = new Random(); int row = rand.nextInt(3) + 1; int col = rand.nextInt(3) + 1; chess[row][col] = computer; Print(); } else { System.out.println("输入错误字符,默认玩家先手!"); Print(); } }
讯享网
2、画棋盘
讯享网 / * 画棋盘 */ void Print() { System.out.println(""); for (int i = 1; i < 4; i++) { for (int j = 1; j < 4; j++) { System.out.print("| "); System.out.print(chess[i][j] + " "); if (j == 3) System.out.println("|"); } if (i == 3) System.out.println(""); } }
3、判断赢的条件,有八种
/ * 判断赢的条件,有八种 * 返回1赢,返回2输 */ public Boolean Win(char player) { //:—|连线六种方法 if (chess[1][1] == player && chess[1][2] == player && chess[1][3] == player) { return true; } if (chess[2][1] == player && chess[2][2] == player && chess[2][3] == player) { return true; } if (chess[3][1] == player && chess[3][2] == player && chess[3][3] == player) { return true; } if (chess[1][1] == player && chess[2][1] == player && chess[3][1] == player) { return true; } if (chess[1][2] == player && chess[2][2] == player && chess[3][2] == player) { return true; } if (chess[1][3] == player && chess[2][3] == player && chess[3][3] == player) { return true; } //斜着三点连一线俩种方法 if (chess[1][1] == player && chess[2][2] == player && chess[3][3] == player) { return true; } if (chess[1][3] == player && chess[2][2] == player && chess[3][1] == player) { return true; } return false; }
4、判断棋子是否还有地方下?
讯享网 //判断棋盘是否还有地方能下棋子 public boolean isEmpty() {//判断棋盘是否为空 for (int i = 1; i < 4; i++) { for (int j = 1; j < 4; j++) { if (chess[i][j] == '-') return false; } } return true; }
5、玩家开始下棋
//玩家开始下棋 public void playerGo() { System.out.println("--------------------------:1,2,3"); System.out.println("该您走啦,请您输入棋子位置:4,5,6"); System.out.println("--------------------------:7,8,9"); int row, col; Scanner in = new Scanner(System.in); int a = in.nextInt(); if (a >= 1 && a <= 9) { if (a % 3 == 0) row = a / 3; else row = a / 3 + 1; col = a - 3 * (row - 1); if (chess[row][col] != '-') { System.out.println("该位置已有棋子"); playerGo(); } chess[row][col] = player; Print(); } else { System.out.println("您的字符输入错误,请您重新输入!"); playerGo(); } }
6、电脑开始下棋
讯享网 //电脑开始下棋 public void computerGo() throws InterruptedException { int best = 0; int bestScore = -1000; int score; for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 3; j++) { if (chess[i][j] == '-') { chess[i][j] = computer; score = bestInput("player", "computer", -1000, 1000);//alpha-beta剪枝是一个根据上下界限剪枝的算法,初始的上下界限为无穷 if (score >=bestScore) {//在同一层的节点里面需要不断试探性递归,用回溯法找到最合适的下棋点使自己胜算最大 bestScore = score; best = (i - 1) * 3 + j; } chess[i][j] = '-'; } } } int row, col; if (best % 3 == 0) row = best / 3; else row = best / 3 + 1; col = best - (row - 1) * 3; chess[row][col] = computer; Thread.sleep(2000); Print(); }
7、//剪枝算法(-1玩家赢,1电脑赢,0平局)
//剪枝算法(-1玩家赢,1电脑赢,0平局) int bestInput(String state, String nextState, int alpha, int beta) {//输入,调用剪枝的过程 char ch; if (state.equals("computer")) { ch = computer; } else { ch = player; } if (Win(ch)) { if (state.equals("computer")) { //电脑赢 return 1; } else { //玩家赢 return -1; } } else if (isEmpty()) { //平局 // System.out.println("平局!"); return 0; } else { int score; for (int i = 1; i < 4; i++) { for (int j = 1; j < 4; j++) { if (chess[i][j] == '-') { chess[i][j] = ch; score = bestInput(nextState, state, alpha, beta); chess[i][j] = '-'; if (state.equals("computer")) { if (score >= alpha) { alpha = score; } if (alpha > beta) { return beta; } } else { if (score < beta) { beta = score; } if (beta <= alpha) { return alpha; } } } } } if (state.equals("computer")) { return alpha; } else { return beta; } } }
8、启动main
讯享网 private char[][] chess = new char[4][4]; private char player; private char computer; public static void main(String[] args) throws InterruptedException { Main main = new Main(); main.StartGream(); String current = "player"; while (!main.Win(main.computer) && !main.Win(main.player) && !main.isEmpty()) {//终止条件是当前棋盘为空或者有一方胜利 switch (current) { case "player": main.playerGo(); current = "computer"; break;//当玩家下完后轮到电脑下 case "computer": main.computerGo(); current = "player"; break; default: break; } } if (main.Win(main.computer)) { System.out.println("电脑胜利!"); } else if (main.Win(main.player)) { System.out.println("玩家胜利"); } else { System.out.println("平局!"); } }
9、运行结果展示:




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/17244.html