JavaSE实现三子棋游戏

目录

  • main函数
  • 棋盘模块设计
  • 玩家模块设计
  • AI(电脑)模块设计
  • 游戏模块设计
本文实例为大家分享了JavaSE实现三子棋游戏的具体代码,供大家参考,具体内容如下
用面向对象的思维把实现三子棋划分为四个模块:
【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 " "; }}@Overridepublic 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~2private 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; }}

代码还有不完善的地方,希望大家多提意见啦
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读