JavaSE实现三子棋游戏

Danica ·
更新时间:2024-11-01
· 471 次阅读

目录

main函数

棋盘模块设计

玩家模块设计

AI(电脑)模块设计

游戏模块设计

本文实例为大家分享了JavaSE实现三子棋游戏的具体代码,供大家参考,具体内容如下

用面向对象的思维把实现三子棋划分为四个模块:

main函数 public class main {     public static void main(String[] args) {         player player1 = new player();         game game1 = new game(player1);         while(true){             game1.initialize();             game1.play();             game1.destroy();             boolean b = player1.queryContinue();             if (!b) {                 System.out.println("欢迎下次继续游戏");                 break;             }         }     } } 棋盘模块设计

棋盘初始化

接受玩家落子并返回当前棋盘状态

接受AI落子并返回当前棋盘状态

判断获胜方、平局或是继续游戏,新游戏重置棋盘。

import java.util.Arrays; public class chessboard {     private static final int 空白 = 0;     private static final int 画圈 = 1;     private static final int 画叉 = 2;     private int[][] array = {             {空白,空白,空白},             {空白,空白,空白},             {空白,空白,空白},     };     public boolean moveCircleAt(int row,int column){         if(array[row][column] != 空白){             return false;         }         array[row][column] = 画圈;         return true;     }     public boolean moveCrossAt(int row,int column){         if(array[row][column] != 空白){             return false;         }         array[row][column] = 画叉;         return true;     }     public static final int CIRCLE_WIN = 0;     public static final int CROSS_WIN = 1;     public static final int DRAW = 2;     public static final int CONTINUE = 3;     private static String display(int i){         switch (i){             case 空白:return " ";             case 画圈:return "@";             case 画叉:return "*";             default:return " ";         }     }     @Override     public String toString() {         String s = "+-+-+-+-+-+\n";         for(int i = 0;i<2;i++){            s +=  String.format("|%s|%s|%s|\n",display(array[i][0]),display(array[i][1]),display(array[i][2])); //           s += "+-+-+-+-+-+\n";         }         s +=  String.format("|%s|%s|%s|\n",display(array[2][0]),display(array[2][1]),display(array[2][2]));         s += "+-+-+-+-+-+";         return s;     }     public int getState(){         //按行判断         for(int i = 0;i<3;i++){             if(array[i][0] == array[i][1] && array[i][1]== array[i][2]){                 if(array[i][0] == 画圈 ){                     System.out.println("玩家胜");                     return CIRCLE_WIN;                 }                 else if(array[i][0] == 画叉){                     System.out.println("机器赢");                     return CROSS_WIN;                 }             }         }         //列判断         for(int i = 0;i<3;i++){             if(array[0][i] == array[1][i] && array[1][i]== array[2][i]){                 if(array[0][i] == 画圈 ){                     System.out.println("玩家胜");                     return CIRCLE_WIN;                 }                 else if(array[0][i] == 画叉){                     System.out.println("机器赢");                     return CROSS_WIN;                 }             }         }         //斜线判断         if(array[0][0] == array[1][1] && array[1][1]== array[2][1]){             if(array[1][1] == 画圈 ){                 return CIRCLE_WIN;             }             else if(array[1][1] == 画叉){                 return CROSS_WIN;             }         }         if(array[0][2] == array[1][1] && array[1][1]== array[2][0]){             if(array[1][1] == 画圈 ){                 return CIRCLE_WIN;             }             else if(array[1][1] == 画叉){                 return CROSS_WIN;             }         }         //没人赢         for(int i = 0;i<3;i++){             for(int j = 0;j<3;j++){                 if(array[i][j] == 空白){                     return CONTINUE;                 }             }         }         return DRAW;     }     public void reset() {         for(int i = 0;i<3;i++){             Arrays.fill(array[i],空白);         }     } } 玩家模块设计

输入想要落子的位置,决定退出游戏还是再来一局。

import java.util.Scanner; public class player {     private final Scanner scanner = new Scanner(System.in);     public int[] getStation(){         System.out.println("请输入要落子的位置,行,列,有效输入是0,1,2");         int r,c;         while (true) {             System.out.print(">>>");              r = scanner.nextInt();              c = scanner.nextInt();              if(r >= 0 && r <= 2 &&c >= 0 && c <= 2){                  break;              }             System.out.println("有效范围是0,1,2,请重新输入。");         }         return new int[] {r,c};     }     public boolean queryContinue(){         System.out.println("是否再来一把?,请输入true or false");         System.out.println(">>>");         return scanner.nextBoolean();     } } AI(电脑)模块设计

生成随机坐标

import java.util.Random; public class AI {     //返回落子的位置     //第几行,第几列都是从0开始     //有效值0~2     private final Random random = new Random();     int r,c;     public int[] getStation(){         r = random.nextInt(3);         c = random.nextInt(3);         return new int[] {r,c};     } } 游戏模块设计

初始化工作:打印提示内容和分割线,加载棋盘

判断是玩家落子还是AI落子

玩家落子情况下:判断玩家输入的合法性,超出边界或是覆盖落子都是不合法行为

AI落子情况下:判断输入的合法性。

控制棋盘重置新棋局

package 三子棋; public class game {     private final chessboard chessboard1;     private final player player1;     private final AI ai;     public game(player player1){         this.chessboard1 = new chessboard();         this.player1 = player1;         this.ai = new AI();     }     //游戏开始之前,进行一些准备工作     public void initialize(){         System.out.println("欢迎进入井字棋游戏");         System.out.println("规则如下;省略");         System.out.println("===========================");         System.out.println(chessboard1);     }     public void play(){//cintinue会继续,玩家胜,AI胜和平局 都是break,退出循环。         while(true){             if(playerTurn()){                 break;             }             if(aiTurn()) {                 break;             }         }     }     //游戏结束之前,完成一些收尾工作     public void destroy(){ //        ai.reset(); //        player1.reset();         chessboard1.reset();     }     private boolean playerTurn(){         System.out.println("玩家回合");         while (true){             int[] rc = player1.getStation();             int row = rc[0];             int column = rc[1];             if(chessboard1.moveCircleAt(row,column))             {                 break;             }             System.out.println("该位置已经有子,请重新选择位置");         }         System.out.println(chessboard1);         if(chessboard1.getState() == chessboard.CONTINUE){             return false;         }         return true;     }     private boolean aiTurn(){         System.out.println("AI回合");         while (true){             int[] rc = ai.getStation();             int row = rc[0];             int column = rc[1];             if(chessboard1.moveCrossAt(row,column))             {                 break;             }             System.out.println("该位置已经有子,请重新选择位置");         }         System.out.println(chessboard1);         if(chessboard1.getState() == chessboard.CONTINUE){             return false;         }         return true;     } }

代码还有不完善的地方,希望大家多提意见啦



javase

需要 登录 后方可回复, 如果你还没有账号请 注册新账号