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

发布时间:2026/9/17 20:23:15
从零手写 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后端校招算法学习

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询