ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

从零手写 Java 三子棋!数组 + 面向对象 + 人机对战,面试官看了都点头(附完整源码)

从零手写 Java 三子棋!数组 + 面向对象 + 人机对战,面试官看了都点头(附完整源码) 我们是由枫哥组建的IT技术团队成立于2017年致力于帮助IT从业者提供实力成功入职理想企业我们提供一对一学习辅导由知名大厂导师指导分享Java技术、参与项目实战等服务并为学员定制职业规划全面提升竞争力过去8年我们已成功帮助数千名求职者拿到满意的OfferIT枫斗者、IT枫斗者-Java面试突击。 从零手写 Java 三子棋数组 面向对象 人机对战面试官看了都点头附完整源码前言为什么面试官爱问三子棋三子棋Tic-Tac-Toe是编程入门的经典项目但用Java 面向对象的方式实现能考察到二维数组操作 ✅类与对象的设计 ✅循环与分支逻辑 ✅随机数生成 ✅简单的 AI 算法 ✅本文从 0 到 1手把手教你用 Java 写出工程级三子棋代码可直接运行建议先收藏 ⭐。一、项目结构分模块设计tic-tac-toe/ ├── Game.java // 游戏核心逻辑类 ├── Player.java // 玩家/电脑抽象 ├── Board.java // 棋盘类 ├── GameStatus.java // 游戏状态枚举 └── Main.java // 入口主类设计思想把棋盘、“玩家”、游戏流程拆成独立类符合单一职责原则SRP这也是面试加分项。二、完整源码可直接复制运行1. GameStatus.java —— 游戏状态枚举/** * 游戏状态枚举 */publicenumGameStatus{PLAYER_WIN,// 玩家赢COMPUTER_WIN,// 电脑赢DRAW,// 平局CONTINUE// 继续游戏}2. Board.java —— 棋盘类/** * 棋盘类负责棋盘初始化、打印、落子、胜负判断 */publicclassBoard{privatestaticfinalintSIZE3;// 棋盘大小3x3privatestaticfinalcharEMPTY ;// 空位privatestaticfinalcharPLAYER*;// 玩家棋子privatestaticfinalcharCOMPUTER#;// 电脑棋子privatechar[][]board;// 二维数组存储棋盘publicBoard(){boardnewchar[SIZE][SIZE];initBoard();}/** * 初始化棋盘全部置为空格 */publicvoidinitBoard(){for(inti0;iSIZE;i){for(intj0;jSIZE;j){board[i][j]EMPTY;}}}/** * 打印棋盘带分隔线美观版 */publicvoidprintBoard(){System.out.println();for(inti0;iSIZE;i){// 打印棋子行for(intj0;jSIZE;j){System.out.print( board[i][j] );if(jSIZE-1){System.out.print(|);}}System.out.println();// 打印分隔线if(iSIZE-1){for(intj0;jSIZE;j){System.out.print(---);if(jSIZE-1){System.out.print(|);}}System.out.println();}}System.out.println();}/** * 落子玩家输入的是 1-based 坐标 * param row 行1-3 * param col 列1-3 * param isPlayer true玩家, false电脑 * return 是否落子成功 */publicbooleanplacePiece(introw,intcol,booleanisPlayer){// 转成 0-based 数组下标intrrow-1;intccol-1;// 边界检查if(r0||rSIZE||c0||cSIZE){System.out.println(❌ 坐标超出边界请重新输入1-3);returnfalse;}// 是否已被占用if(board[r][c]!EMPTY){System.out.println(❌ 该位置已被占用请重新选择);returnfalse;}board[r][c]isPlayer?PLAYER:COMPUTER;returntrue;}/** * 电脑随机落子 */publicvoidcomputerMove(){java.util.Randomrandomnewjava.util.Random();while(true){intrrandom.nextInt(SIZE);intcrandom.nextInt(SIZE);if(board[r][c]EMPTY){board[r][c]COMPUTER;System.out.println( 电脑下棋((r1), (c1)));break;}}}/** * 判断游戏状态 */publicGameStatuscheckStatus(){// 检查行for(inti0;iSIZE;i){if(board[i][0]!EMPTYboard[i][0]board[i][1]board[i][1]board[i][2]){returnboard[i][0]PLAYER?GameStatus.PLAYER_WIN:GameStatus.COMPUTER_WIN;}}// 检查列for(inti0;iSIZE;i){if(board[0][i]!EMPTYboard[0][i]board[1][i]board[1][i]board[2][i]){returnboard[0][i]PLAYER?GameStatus.PLAYER_WIN:GameStatus.COMPUTER_WIN;}}// 检查主对角线if(board[0][0]!EMPTYboard[0][0]board[1][1]board[1][1]board[2][2]){returnboard[0][0]PLAYER?GameStatus.PLAYER_WIN:GameStatus.COMPUTER_WIN;}// 检查副对角线if(board[0][2]!EMPTYboard[0][2]board[1][1]board[1][1]board[2][0]){returnboard[0][2]PLAYER?GameStatus.PLAYER_WIN:GameStatus.COMPUTER_WIN;}// 检查是否平局棋盘已满if(isFull()){returnGameStatus.DRAW;}returnGameStatus.CONTINUE;}/** * 判断棋盘是否已满 */privatebooleanisFull(){for(inti0;iSIZE;i){for(intj0;jSIZE;j){if(board[i][j]EMPTY){returnfalse;}}}returntrue;}// GetterpublicintgetSize(){returnSIZE;}}3. Game.java —— 游戏控制类importjava.util.Scanner;/** * 游戏控制类负责游戏流程、菜单、交互 */publicclassGame{privateBoardboard;privateScannerscanner;privatebooleanisRunning;publicGame(){boardnewBoard();scannernewScanner(System.in);isRunningtrue;}/** * 显示菜单 */publicvoidshowMenu(){System.out.println(╔════════════════════════════════╗);System.out.println(║ Java 三子棋大战 ║);System.out.println(╠════════════════════════════════╣);System.out.println(║ 1. 开始游戏 ║);System.out.println(║ 0. 退出游戏 ║);System.out.println(╚════════════════════════════════╝);System.out.print(请选择);}/** * 游戏主循环 */publicvoidstart(){while(isRunning){showMenu();intchoicescanner.nextInt();switch(choice){case1:System.out.println(\n 三子棋启动);playGame();break;case0:System.out.println(\n 感谢游玩再见);isRunningfalse;break;default:System.out.println(\n⚠️ 无效选项请重新选择);}}}/** * 单局游戏流程 */privatevoidplayGame(){board.initBoard();// 重置棋盘while(true){// 玩家回合 board.printBoard();System.out.print( 请输入下棋坐标行 列如1 2);introwscanner.nextInt();intcolscanner.nextInt();// 落子失败越界/被占用则重新输入while(!board.placePiece(row,col,true)){System.out.print( 请重新输入坐标);rowscanner.nextInt();colscanner.nextInt();}// 检查状态GameStatusstatusboard.checkStatus();if(status!GameStatus.CONTINUE){board.printBoard();printResult(status);break;}// 电脑回合 board.computerMove();statusboard.checkStatus();if(status!GameStatus.CONTINUE){board.printBoard();printResult(status);break;}}}/** * 打印游戏结果 */privatevoidprintResult(GameStatusstatus){switch(status){casePLAYER_WIN:System.out.println( 恭喜玩家获胜);break;caseCOMPUTER_WIN:System.out.println( 电脑获胜再接再厉);break;caseDRAW:System.out.println( 平局棋逢对手);break;default:break;}System.out.println();}}4. Main.java —— 程序入口/** * 程序入口 */publicclassMain{publicstaticvoidmain(String[]args){GamegamenewGame();game.start();}}三、运行效果演示╔════════════════════════════════╗ ║ Java 三子棋大战 ║ ╠════════════════════════════════╣ ║ 1. 开始游戏 ║ ║ 0. 退出游戏 ║ ╚════════════════════════════════╝ 请选择1 三子棋启动 | | --------- | | --------- | | 请输入下棋坐标行 列如1 21 1 电脑下棋(2, 3) * | | --------- | | # --------- | | 请输入下棋坐标行 列如1 22 2 ...⭐️推荐:Offer训练营介绍Java 面试 后端通用面试八股文Java后端企业级实战面试Java后端校招算法学习
返回列表