小小五子棋 前言本次课程综合大作业由 3人小组协同完成基于 Java 语言开发一款集人机智能对战、局域网双人联机对战于一体的多功能五子棋系统。项目综合运用Swing 图形界面、多线程并发、Socket 网络编程、文件 IO 数据持久化等课程核心知识点严格采用分层模块化开发思想拆分代码每位组员独立负责专属业务模块降低代码耦合度便于并行开发、调试与后期维护。 整篇博客完整覆盖项目背景、开发环境、整体架构、人员分工、核心功能实现、开发难题与解决方案、项目总结、后续拓展方案结构完全贴合答辩汇报逻辑朗读流畅、细节充足能够完整向老师展示小组全部开发工作。一、项目概述1.1 项目开发背景市面上基础单机五子棋程序功能单一仅支持本地双人落子缺少智能人机对手、远程联机互动功能也不存在聊天交互、棋谱保存、限时落子、悔棋认输等配套辅助功能游戏体验较差。 结合本学期 Java 课程所学知识小组决定自主开发一套功能完整、交互完善的五子棋对战程序弥补传统单机五子棋的功能缺陷。项目兼顾教学实践价值与游戏实用性既完成课程技术要求又具备完整的游戏交互逻辑。1.2 项目开发核心目标实现双对战模式高难度加权 AI 人机对战、局域网 TCP 双人联机对战两大核心玩法完善对局交互功能支持悔棋、主动认输、双向申请和棋、每回合 10 秒落子限时机制搭建联机社交模块局域网实时文字聊天、玩家自定义昵称互通展示实现棋谱数据持久化本地保存完整对局记录、支持历史棋谱加载与完整对局回放优化程序运行性能使用多线程分离 UI 渲染、AI 计算、网络 IO 操作解决界面卡顿、点击无响应问题保障程序稳定性处理网络断连、跨线程 UI 报错、端口占用、数组越界等异常问题增加容错弹窗提示规范化代码结构分层架构拆分视图、数据模型、AI 算法、网络通信四层职责单一便于团队协作开发。1.3 开发环境与完整技术栈硬件环境笔记本电脑支持局域网 WiFi / 热点互联满足双人联机测试需求。软件环境开发语言Java SE 11图形界面框架SwingJFrame、JPanel、JButton、JTextArea 等全套 Swing 组件网络通信技术TCP Socket、Object 对象序列化传输并发技术Java 多线程 Thread、SwingUtilities UI 调度线程文件 IOBufferedReader、FileReader、File 读写本地 txt 文件开发 IDEIntelliJ IDEA版本规范统一驼峰命名、完整代码注释、统一通信指令常量核心技术简要说明Swing搭建可视化窗口绘制棋盘、棋子、功能按钮、聊天输入框监听鼠标点击落子事件Socket TCP 通信分为服务端创建房间、客户端加入房间基于端口 8888 建立长连接通过 ObjectOutputStream/ObjectInputStream 序列化传输落子数据、控制指令、聊天文本多线程技术独立子线程处理 AI 大量循环计算、网络消息持续监听避免阻塞 Swing 主线程对象序列化将 byte 数组、字符串、整型指令封装为 Object 对象跨设备传输实现两端数据同步文件持久化读取本地昵称库文件随机分配玩家昵称本地存储每一步落子记录实现棋谱保存与回放分层架构设计数据与视图完全分离所有业务数据统一由 Model 层管理视图层仅负责展示与用户交互。1.4 系统全部功能详细总览模块一人机对战功能智能 AI 自动落子算法进攻 加权防守双维度打分防守权重放大AI 优先封堵玩家高威胁棋型AI 独立子线程异步计算搭配 800ms 模拟思考延迟还原真人下棋逻辑人机对局完整操作悔棋、重新开局、主动认输、超时自动判负落子后自动四向扫描五子连珠AI 连成五子自动弹窗提示玩家失败。模块二局域网联机对战功能两种联机模式房主创建房间启动 ServerSocket 服务端、玩家输入 IP 加入房间客户端 Socket全量数据实时同步双方落子坐标、黑白棋回合状态、对局胜负状态两端同步更新双向互动交互联机悔棋申请、同意 / 拒绝悔棋双向发起和棋、同意 / 拒绝和棋主动认输同步告知对手胜利玩家昵称互通连接成功后自动向对方发送本机昵称聊天框显示双方专属昵称实时联机聊天任意一方发送文字消息另一方聊天面板实时展示网络异常处理断开连接自动弹窗提示释放全部 Socket 与 IO 资源避免端口占用。模块三对局辅助拓展功能棋盘背景切换一键切换多套棋盘背景图片实时重绘界面10 秒落子倒计时每回合重置计时倒计时结束未落子直接判定本局失败棋谱管理系统对局结束保存完整落子记录加载本地历史棋谱完整回放整盘对局落子步骤全局对局控制一键清空棋盘重新开局、对局结束锁定棋盘禁止落子消息提示弹窗所有操作反馈、对局结果、网络异常、线程异常均提供可视化弹窗提示。模块四底层数据支撑功能15*15 标准二维数组存储棋盘全部棋子状态区分空点位、黑棋、白棋落子队列集合存储每一步落子数据支持撤销上一步落子悔棋预设全套五子棋棋型模板库与梯度威胁分值支撑 AI 打分与胜负判定棋盘副本复制机制AI 推演打分使用临时棋盘不污染实时对局数据通用五子连珠判定方法任意坐标落子后自动检测横、竖、两条对角线四向连续棋子。二、系统整体分层架构与模块文件划分本项目严格采用四层分层架构每层职责完全独立模块间仅通过暴露公共方法交互无硬耦合代码。2.1 四层架构详细介绍第一层视图层 View用户可视化交互入口负责窗口展示、画面绘制、鼠标监听、按钮点击事件用户所有操作均在视图层触发分为两个核心类MainFrame.java程序顶层主窗口全局总控制器组员 1 独立开发ChessPanel.java棋盘专属绘图画布鼠标落子监听组员 2 独立开发第二层数据模型层 Model全局数据中枢统一存储程序所有静态、动态数据封装数据读写、逻辑计算方法所有视图、AI、网络模块均调用 Model 获取数据实现数据与界面解耦核心类 GobangModel.java组员 3 独立开发。第三层AI 算法层 AI人机对战智能逻辑封装五子棋博弈打分算法独立完成棋盘遍历、棋型识别、最优落子点位筛选核心类 AI.java组员 3 独立开发。第四层网络通信层 Net局域网数据传输拆分发送、接收两大逻辑消息发送逻辑封装在 MainFrame 视图层组员 1点击按钮后向对手发送各类指令消息接收逻辑独立后台监听线程 ReceiveThread.java组员 3持续读取对手传输的数据并分发处理。2.2 模块间数据依赖流向视图层 MainFrame、ChessPanel 依赖 Model 层、AI 层、网络接收线程AI 层仅依赖 Model 层获取棋盘数据网络接收线程 ReceiveThread 依赖视图层、Model 层完成界面刷新与数据更新Model 层不依赖任何上层模块完全独立所有数据自主管理。表格1项目全模块文件归属明细表分层名称文件路径开发成员模块核心职责对外提供公共接口视图层 Viewcom.gobang.view.MainFrame.java闫溪玥1. 程序入口、主窗口布局、所有功能按钮事件分发2. 联机客户端 / 服务端创建、网络输出流管理、各类对战指令发送3. 读取昵称文件、随机分配本机昵称、昵称同步协议封装4. 全局 10 秒落子计时器启停重置管理5. 聊天面板管理、聊天消息收发展示6. 网络 Socket/IO 资源统一释放1.setEnemyNick () 更新对手昵称2.appendChatText () 追加聊天记录3.resetChessTimer () 重置倒计时4.startChessTimer () 开启倒计时5.stopChessTimer () 停止倒计时6.closeOnlineSocket () 释放网络资源视图层 Viewcom.gobang.view.ChessPanel.java陆梅婷1. 重写绘图方法绘制棋盘网格、棋子、切换背景图2. 鼠标监听像素坐标转棋盘逻辑点位、落子合法性校验3. 人机模式自动调用 AI 落子、联机发送落子数据4. 管理对局状态对局结束标记、黑白落子回合5. 棋谱保存、加载、完整对局回放功能6. 持有网络输出流处理和棋、悔棋回复发送1.reInit () 重置清空棋盘2.getModel () 获取底层数据模型3.playBack () 回放棋谱4.loadGameRecord () 加载历史棋谱5.repaint () 刷新棋盘画面数据模型层 Modelcom.gobang.model.GobangModel.java孙孟婷1. 定义棋盘尺寸、空棋、黑棋、白棋、胜负全局常量2.15*15 二维数组存储所有棋盘点位状态3. 落子队列保存全部落子记录支撑悔棋功能4. 内置棋型库、棋型对应威胁分值数组5. 悔棋撤销、四向五子连珠胜负判定算法6. 复制棋盘副本供 AI 推演打分使用1.setChessmanArray () 设置棋子2.getChessmanArray () 获取棋盘数组3.getChessmanArrayCopy () 获取棋盘副本4.repeatOperation () 执行悔棋5.automatic () 胜负判定6.getModelLibrary () 获取棋型模板7.modelScore 棋型分值数组AI 算法层 AIcom.gobang.ai.AI.java孙孟婷1. 独立子线程异步计算 AI 最优落子800ms 模拟思考延迟2. 全棋盘空位遍历进攻 3.2 倍加权防守打分3. 四方向 5 格窗口匹配棋型计算点位威胁分值4. 筛选综合最高分坐标作为 AI 落子点5. 落子后更新棋盘、自动判定 AI 胜利弹窗提示1.chessForMachine () 触发 AI 自动落子网络通信层 Netcom.gobang.net.ReceiveThread.java孙孟婷1. 后台独立线程持续阻塞监听对手网络消息2. 区分 byte [] 落子、字符串指令、整型状态三类消息解析3. 处理昵称同步、联机悔棋、双向和棋、聊天、胜负同步逻辑4.Swing 多线程安全处理弹窗、界面更新5. 捕获网络断连异常终止监听线程无对外主动调用接口后台自动运行内部调用 Model、MainFrame、ChessPanel 接口三、小组人员分工详细说明3.1 分工设计核心原则分层拆分任务每人负责完整独立业务模块不存在多人共用同一类代码答辩可清晰区分每个人工作量底层数据模型、AI 算法、网络接收逻辑交由同一组员开发统一数据格式、通信指令避免模块对接格式不匹配顶层主窗口、棋盘画布拆分两名组员开发分离全局控制与画面渲染工作开发前期小组统一规范方法命名、代码注释、网络传输指令字符串、全局常量提前对齐对接标准开发流程并行编码→单模块自测→模块联调→全局功能测试→BUG 协同修复→功能迭代补充。3.2 各组员完整工作内容闫溪玥顶层主窗口 MainFrame.java视图层全局控制器程序程序入口 main 方法开发采用 SwingUtilities 安全 UI 线程启动窗口规避 Swing 启动异常主窗口基础属性初始化窗体标题、窗口尺寸、关闭策略、屏幕居中、BorderLayout 边界布局页面整体布局搭建划分中央棋盘显示区域、右侧功能按钮面板、底部聊天交互面板设置组件间距、尺寸、边框10 个功能按钮创建、布局、绑定点击监听器统一分发全部按钮点击事件回放对局、加载历史棋谱、切换背景、悔棋、人机对战、联机对战、重新开局、申请和棋、认输、发送聊天联机对战发送端全套逻辑开发区分创建房间启动 ServerSocket监听 8888 端口等待客户端接入、加入房间输入局域网 IP 创建 Socket 连接服务端创建 ObjectOutputStream 序列化输出流封装全部发送指令NICK 昵称同步、REPEAT 悔棋、DRAW_APPLY 和棋申请、GIVE_UP 认输、普通聊天文本玩家昵称系统完整实现文件 IO 读取 res/nickname.txt 昵称库文件不存在 / 读取失败弹出提示框随机从昵称库选取本机昵称联机连接成功后自动发送本机昵称给对手对外提供 setEnemyNick () 接口供网络接收线程同步更新对手昵称全局 10 秒倒计时 Timer 计时器封装编写 start、stop、reset 三套接口供棋盘面板、网络接收线程调用聊天系统顶层管理聊天输入框、聊天展示文本域初始化封装 appendChatText () 方法统一追加聊天记录区分本地消息、联机消息网络资源统一释放工具方法 closeOnlineSocket ()依次关闭输出流、客户端 Socket、服务端 ServerSocket清空全局网络对象解决切换模式端口占用问题模块对接工作初始化棋盘面板 ChessPanel、绑定 AI 实例、启动网络接收线程为其他模块提供全局公共调用接口。陆梅婷棋盘画布 ChessPanel.java视图层绘图与鼠标交互画布基础初始化注入全局数据模型 GobangModel、AI 智能实例、主窗口引用重写 paintComponent 绘图核心方法完整绘制棋盘边框、15*15 网格线、黑色 / 白色棋子、自定义背景图片鼠标监听事件开发捕捉鼠标点击坐标将屏幕像素坐标换算为棋盘逻辑点位校验点位是否为空、是否为本回合落子方、对局是否结束落子逻辑处理校验通过后调用 Model 层存储棋子保存落子记录自动调用 AI 落子人机模式、发送落子数据给对手联机模式多套棋盘背景切换功能缓存多张背景资源切换后调用 repaint () 实时重绘画布对局状态全局变量管理towardsWin 标记对局是否结束、blackTurn 标记当前落子方黑棋 / 白棋锁定结束棋盘禁止鼠标落子棋谱全套业务逻辑开发缓存对局全部落子步骤对局结束写入本地文件保存棋谱读取本地棋谱文件解析落子数据加载至棋盘回放功能清空棋盘按顺序复现每一步落子还原完整对局联机网络输出流持有存储 ObjectOutputStream接收和棋、悔棋指令时向对手发送回复消息对外工具接口封装reInit () 清空棋盘重置对局、getModel () 获取数据模型、playBack () 回放棋谱、loadGameRecord () 加载历史棋谱联调对接接收主窗口按钮指令、接收网络线程同步的对手落子数据调用 repaint 刷新棋盘画面。孙孟婷数据模型 GobangModel AI 算法 AI.java 网络接收线程 ReceiveThread.java子模块 1底层数据模型 GobangModel定义全局静态常量棋盘尺寸 15、空棋子标识、黑棋标识、白棋标识、对局胜利 / 运行状态常量15*15 二维 byte 数组 chessmanArray 创建封装 set、get 方法读写棋盘点位数据落子队列 ArrayListbyte [] chessQueue存储每一步落子坐标与颜色实现悔棋数据支撑预设棋型库 String [] modelLibrary、对应威胁分值 int [] modelScore包含活四、冲四、活三、眠三、活二全部棋型模板用于 AI 打分悔棋核心方法 repeatOperation ()移除队列最后一步落子清空棋盘对应坐标棋子五子连珠自动判定方法 automatic ()以落子点位为中心横向、纵向、主对角线、副对角线四向统计连续同色棋子连续达到 5 颗返回对应棋子胜利标识棋盘副本复制 getChessmanArrayCopy ()拷贝完整棋盘二维数组供 AI 推演打分使用不修改真实对局数据。子模块 2人机智能 AI AI.java构造方法注入数据模型与棋盘画布持有全局棋盘数据与界面刷新引用四方向扫描数组 dirArr 定义覆盖横、竖、两条对角线全部判断方向对外入口方法 chessForMachine ()供棋盘面板、主窗口调用启动 AI 落子计算异步 AI 思考子线程开发所有棋盘遍历、打分循环放入独立 Thread添加 800ms 休眠模拟 AI 思考捕获线程中断异常并弹窗提示全棋盘空位遍历方法 traverseAllChessPoint ()双层循环遍历 15*15 所有坐标跳过已有棋子点位分别计算进攻分数、加权防守分数综合对比筛选最高分最优落子点防守权重设置 3.2优先拦截玩家高威胁棋型单点威胁分值计算 getPointThreatScore ()复制临时棋盘模拟落子以目标点位截取前后两格组成 5 格判断窗口拼接字符串匹配预设棋型库累加对应威胁分值AI 落子后业务流程更新 Model 棋盘数据、调用画布重绘、执行五子连珠判定AI 胜利时修改对局结束状态并弹出提示弹窗。子模块 3网络消息接收线程 ReceiveThread.java继承 Thread 创建独立后台监听线程构造方法注入 Socket、棋盘面板、主窗口、数据模型初始化 ObjectInputStream 输入流重写 run () 核心线程方法死循环阻塞读取对手序列化消息无消息时线程休眠不占用 CPU 资源多类型消息分流解析逻辑1 byte [] 字节数组解析对手落子 x、y 坐标与棋子颜色写入本地棋盘、存入落子队列、重置倒计时、自动判胜负2String 字符串指令区分 NICK 昵称同步、TURN_CHANGE 回合切换、OPPONENT_WIN 对手胜利、REPEAT 悔棋申请、DRAW_APPLY 和棋申请、DRAW_AGREE 同意和棋、DRAW_REFUSE 拒绝和棋、普通聊天文本3Integer 整型指令区分 WIN 对局胜利、RUNNING 重新开局全局状态指令全套联机交互逻辑处理同步对手昵称并更新聊天面板、弹窗确认悔棋 / 和棋申请、两端同步对局胜负状态Swing 多线程安全处理所有弹窗、修改界面控件代码全部包裹 SwingUtilities.invokeLater ()提交至 UI 主线程执行杜绝跨线程操作 Swing 组件报错全局异常捕获机制捕获 IO 读取、对象反序列化全部异常弹窗提示断开连接跳出循环终止监听线程防止程序卡死辅助工具方法 handleGameCommand ()统一处理整型对局全局状态指令重置棋盘、停止计时器、弹窗提示对局结果模块对接调用 Model 层更新棋盘数据、调用主窗口操作聊天面板与倒计时、调用 ChessPanel 刷新棋盘画面。表格二小组分工职责对照表成员负责全部文件核心开发功能清单对接其他组员模块输出公共接口闫溪玥组员一com.gobang.view.MainFrame.java1. 程序入口开发Swing 安全线程启动主窗口完成窗口基础属性与整体布局搭建2. 10 个功能按钮创建、布局与统一点击事件分发覆盖全部对局操作3. 局域网联机发送端全逻辑服务端创建房间、客户端加入房间、Socket 通信流管理4. 自定义通信协议封装昵称同步、悔棋、和棋、认输、聊天全量发送指令5. 玩家昵称系统读取本地昵称库、随机分配本机昵称、联机昵称同步协议6. 全局 10 秒落子倒计时封装提供启停重置全接口7. 聊天系统顶层管理聊天面板初始化、消息追加与展示8. 网络资源统一释放方法解决端口占用、连接泄漏问题1. 组员 2ChessPanel.java 棋盘面板初始化注入、接收按钮操作指令2. 组员 3ReceiveThread.java 网络接收线程启动线程、同步昵称与聊天消息3. 组员 3GobangModel.java 数据模型读取全局常量、对局状态4. 组员 3AI.java 人机 AI 实例初始化注入、触发 AI 落子1. setEnemyNick () 更新对手昵称2. appendChatText () 追加聊天记录3. resetChessTimer () 重置倒计时4. startChessTimer () 开启倒计时5. stopChessTimer () 停止倒计时6. closeOnlineSocket () 释放网络资源陆梅婷组员二com.gobang.view.ChessPanel.java1. 棋盘画布初始化注入数据模型、AI 实例、主窗口引用2. 重写 paintComponent 绘图方法完整绘制棋盘网格、棋子、自定义背景3. 鼠标监听开发像素坐标转棋盘逻辑点位、落子合法性校验4. 落子全流程处理写入模型、保存落子记录、触发 AI 落子 / 联机发送落子数据5. 棋盘背景切换功能缓存背景资源、实时重绘画面6. 对局状态管理对局结束标记、黑白落子回合锁定7. 棋谱全功能开发对局记录缓存、本地保存、历史加载、完整回放8. 联机网络输出流持有处理和棋、悔棋回复指令发送1. 组员 1MainFrame.java 主窗口接收按钮操作指令、调用全局计时器2. 组员 3GobangModel.java 数据模型读写棋盘数据、执行悔棋、胜负判定3. 组员 3AI.java 人机 AI触发 AI 自动落子4. 组员 3ReceiveThread.java 网络接收线程接收对手落子数据、刷新棋盘1. reInit () 重置清空棋盘2. getModel () 获取底层数据模型3. playBack () 回放棋谱4. loadGameRecord () 加载历史棋谱5. repaint () 刷新棋盘画面孙孟婷组员三1. com.gobang.model.GobangModel.java2. com.gobang.ai.AI.java3. com.gobang.net.ReceiveThread.java【GobangModel】1. 定义棋盘尺寸、空棋、黑棋、白棋、胜负全局常量2. 15*15 二维数组存储棋盘状态封装读写方法3. 落子队列实现支撑悔棋功能4. 内置棋型库与对应威胁分值数组5. 悔棋撤销、四向五子连珠胜负判定算法6. 棋盘副本复制方法供 AI 推演使用【AI.java】1. 独立子线程异步计算 AI 落子800ms 模拟思考延迟2. 全棋盘空位遍历进攻 3.2 倍加权防守打分3. 四方向 5 格窗口匹配棋型计算点位威胁分值4. 筛选最优落子点落子后更新棋盘、自动判胜弹窗【ReceiveThread.java】1. 后台独立线程持续监听对手网络消息2. 三类消息分流解析落子 byte 数组、控制指令字符串、对局状态整型3. 昵称同步、联机悔棋、双向和棋、聊天、胜负同步全逻辑处理4. Swing 多线程安全处理所有界面更新使用 UI 调度线程5. 网络异常捕获断连自动弹窗、终止监听线程1. 组员 1MainFrame.java 主窗口调用聊天、计时器、昵称接口2. 组员 2ChessPanel.java 棋盘面板刷新棋盘画面、更新对局状态【GobangModel】1. setChessmanArray () 设置棋子2. getChessmanArray () 获取棋盘数组3. getChessmanArrayCopy () 获取棋盘副本4. repeatOperation () 执行悔棋5. automatic () 胜负判定6. getModelLibrary () 获取棋型模板7. modelScore 棋型分值数组【AI.java】1. chessForMachine () 触发 AI 自动落子【ReceiveThread.java】无对外主动调用接口后台自动运行3.3 小组完整协同开发流程需求分析阶段全体组员共同梳理项目功能清单确定人机、联机两大核心玩法划分四层架构规范统一阶段小组协商统一网络通信指令、全局常量、代码注释格式、方法命名规则避免后期对接格式冲突并行开发阶段组员 1 开发主窗口与联机发送逻辑、组员 2 开发棋盘绘图与鼠标交互、组员 3 同步开发底层 Model、AI 算法、网络接收线程三人同步编码互不干扰单模块自测阶段每位组员完成自身模块后独立测试全部功能排查自身代码 BUG模块联调阶段整合视图、模型、AI、网络四大模块测试人机对战、联机对战完整流程统一解决模块对接报错功能迭代补充小组讨论新增认输、昵称同步、10 秒倒计时拓展功能分配对应组员完成开发全局综合测试全员循环测试全部功能场景覆盖人机对局、联机双人对局、棋谱保存回放、聊天交互、断连异常等全部情况最终优化整理统一完善全部代码注释优化弹窗提示文案修复剩余细微逻辑缺陷。四、核心功能模块详细实现原理4.1 底层数据模型 GobangModel 实现原理Model 层作为项目数据核心做到数据与界面完全分离视图仅做展示所有修改棋盘、存储落子、胜负判断逻辑全部封装在此类中。棋盘存储使用 byte [15][15] 二维数组0 代表空位置、1 代表黑棋玩家、2 代表白棋AI / 对手读写棋盘统一调用 setChessmanArray 方法禁止视图层直接操作数组落子记录ArrayList 集合存储每一步 byte [] 数组数组内依次存放 x 坐标、y 坐标、棋子颜色悔棋时直接移除集合最后一个元素同步清空棋盘对应点位棋型打分体系将五子棋常见威胁棋型转为数字字符串模板例如活三、冲四对应不同高分AI 遍历点位时匹配字符串即可快速获取威胁分值简化算法复杂度胜负判定逻辑落子后向四个方向循环延伸统计同色连续棋子数量任意方向连续棋子等于 5直接返回胜利棋子标识上层视图接收后结束对局。4.2 人机 AI 加权博弈算法实现原理本项目 AI 区别于简单随机落子采用进攻防守双重加权评分算法难度更高具备主动拦截玩家威胁棋型的能力。临时棋盘推演机制每次计算点位分数前复制完整棋盘数组在临时数组模拟落子打分不会修改当前正在进行的对局数据双重分值计算1进攻分模拟 AI 白棋落在该点位计算该点位能形成的全部威胁分值2防守分模拟玩家黑棋落在该点位计算玩家威胁分值乘以 3.2 权重放大防守优先级综合得分 进攻分数 加权防守分数遍历全部空位后选取总分最高坐标作为 AI 落子点多线程优化AI 遍历 15*15 棋盘包含大量双层循环、四方向字符串匹配计算耗时较长放入独立子线程异步执行不会阻塞界面按钮、鼠标操作。4.3 局域网 Socket 联机通信实现原理项目 TCP 通信分为发送、接收两端解耦开发基于对象序列化实现跨设备复杂数据传输。发送端组员 1 MainFrame端口固定 8888分为服务端、客户端两种角色1服务端创建房间启动 ServerSocket 阻塞等待客户端连接接入成功后创建双向 IO 流2客户端加入房间输入房主局域网 IP主动创建 Socket 连接对应端口ObjectOutputStream 负责序列化对象发送支持发送三类数据byte [] 落子数组、String 控制指令、Integer 全局状态每一个交互按钮绑定对应发送逻辑点击后自动封装指令并调用 flush () 强制推送消息保证对手实时接收。接收端组员 3 ReceiveThread独立后台线程持续循环读取输入流消息程序运行全程监听对手数据使用 instanceof 判断传输对象类型分流至落子处理、指令处理、全局对局状态处理三大分支所有界面修改操作全部使用 SwingUtilities.invokeLater将 UI 操作交给 Swing 专属绘制线程执行规避多线程并发修改组件抛出的运行时异常完整交互链路 1连接成功双方互发昵称 2任意一方落子发送 byte 数组同步坐标 3发起悔棋 / 和棋发送对应字符串指令接收方弹窗确认后发送回复指令 4一方认输、五子连珠胜利发送对局结束指令两端同步锁定棋盘。4.4 图形视图两层协同实现原理视图层拆分为 MainFrame 全局窗口与 ChessPanel 棋盘画布分工明确互不冗余MainFrame只管理窗口布局、按钮事件、网络发送、聊天、计时器等全局控制逻辑不参与棋盘绘制ChessPanel只负责棋盘、棋子、背景绘制、鼠标点击落子不管理全局按钮与网络连接两层通过对象引用互相调用公共接口落子、悔棋、切换背景、回放棋谱等操作统一调用 repaint () 方法触发画布重绘实时更新画面联机模式下 ChessPanel 持有网络输出流处理和棋、悔棋回复时向对手发送反馈指令完成双向交互闭环。4.5 拓展辅助功能实现细节110 秒落子倒计时通过 Swing Timer 定时器每 1 秒递减计时数值数值存储在 MainFrame 全局变量棋盘绘制时实时渲染剩余时间倒计时归零时停止计时器弹窗提示超时失败锁定对局结束。2认输双向同步人机对局点击认输直接弹窗提示 AI 获胜 联机对局点击认输后本地判定对局结束同时向对手发送 GIVE_UP 指令对手接收后弹窗提示我方认输胜利。3和棋双向交互流程我方点击申请和棋向对手发送 DRAW_APPLY对手接收指令弹出确认框选择同意 / 拒绝对手选择同意发送 DRAW_AGREE两端同步判定平局对手选择拒绝发送 DRAW_REFUSE我方弹窗提示申请被拒对局继续。4棋谱保存与回放​编辑CSDN同步助手对局结束时循环读取落子队列将每一步坐标写入本地 txt 文件回放时读取文件解析全部落子数据清空棋盘后按顺序复现所有落子步骤完整还原对局全过程。五、项目核心亮点结合小组完成的全部代码实现功能本项目相比简易单机五子棋存在多处设计与功能亮点也是本次课程大作业核心加分点分层低耦合模块化架构设计项目划分为视图层、数据模型层、AI 算法层、网络通信层四层数据与界面完全解耦。Model 统一管理所有棋盘数据视图仅负责页面渲染AI、网络模块仅依赖基础数据接口模块独立开发、单独调试多人并行开发无代码冲突后期维护、新增功能成本极低。多线程异步解耦解决 Swing 界面卡顿痛点将 AI 大量循环计算、网络消息监听全部放置独立子线程执行UI 主线程只负责画面刷新。同时严格遵循 Swing 线程安全规范所有界面更新操作使用SwingUtilities.invokeLater()彻底规避后台线程操作组件导致的程序崩溃、报错问题程序运行流畅无卡顿。高智能加权防守 AI 博弈算法AI 采用进攻 加权防守双维度打分机制防守权重设置 3.2AI 会主动优先封堵玩家四、三等高威胁棋型AI 难度更高游戏可玩性更强计算时使用棋盘副本推演不会污染真实对局数据逻辑稳定无 BUG。完整闭环局域网双人联机交互体系基于 TCP Socket 对象序列化实现局域网联机区分服务端创建房间、客户端加入房间双模式自定义完整通信指令协议实现昵称互通、实时聊天、联机悔棋、双向和棋、认输同步、落子实时同步全套交互逻辑两端对局状态完全一致。完善的对局辅助与容错机制内置 10 秒落子倒计时超时判负、棋盘背景切换、棋谱保存 / 加载 / 回放、对局重新开局功能同时覆盖文件读取失败、网络断开、端口占用、线程中断等各类异常全部搭配弹窗友好提示程序容错性强不易崩溃。规范团队协同开发规范开发前期统一全局常量、网络传输指令、代码注释、命名规范按模块精准拆分分工每人负责独立完整类文件无交叉冗余代码开发流程标准化便于版本管理与 Git 提交迭代。六、开发过程难点、问题与完整解决方案难点 1AI 棋盘大量循环计算阻塞 Swing 界面问题描述15*15 棋盘双层循环遍历 四方向 5 格窗口字符串匹配单次 AI 计算存在上千次循环操作若直接在 Swing 主线程执行会导致窗口卡死、按钮点击无响应、鼠标落子失效严重影响程序使用体验。解决方案组员 3 独立完成创建独立子线程承载全部 AI 打分、遍历逻辑主线程仅负责触发 AI 计算、等待线程完成后刷新棋盘画面线程内添加 800ms 休眠模拟 AI 思考效果既解决卡顿问题又提升游戏真实感同时捕获线程中断异常异常时弹窗提示用户。难点 2多线程并发修改 Swing 组件抛出线程安全异常问题描述网络接收线程、AI 子线程属于自定义后台线程直接调用 JOptionPane 弹窗、修改聊天文本域、修改画布状态时Swing 底层会抛出 IllegalThreadStateException 跨线程异常程序直接崩溃。解决方案组员 3 独立完成严格遵循 Swing 单线程绘制规范所有弹窗、修改界面控件、修改文本内容的代码全部封装在 SwingUtilities.invokeLater () 中将 UI 操作任务提交至 Swing 专属 UI 调度线程执行彻底消除跨线程报错。难点 3联机对战双方玩家昵称无法同步展示问题描述最初版本仅本地随机生成昵称连接后对手无法获取我方昵称聊天框只显示空白标识双人联机交互辨识度低。解决方案组员 1、组员 3 协同完成组员 1 在客户端、服务端连接成功后自动发送 NICK: 自定义前缀 本机昵称字符串指令组员 3 在 ReceiveThread 中判断字符串以 NICK: 开头截取真实昵称调用 MainFrame 提供的 setEnemyNick 接口更新全局对手昵称接收聊天消息时读取全局对手昵称拼接聊天内容展示实现两端昵称互通。难点 4网络异常断开后 Socket、IO 资源未释放端口持续占用问题描述联机过程强制关闭窗口、断开 WiFi、退出房间时Socket 套接字、ObjectOutputStream 未正常关闭再次创建房间会提示 8888 端口被占用无法开启服务端。解决方案组员 1 独立完成封装统一资源释放方法 closeOnlineSocket ()切换人机模式、断开连接、关闭窗口时自动执行依次关闭输出流、客户端 Socket、服务端 ServerSocket清空全局网络对象变量彻底释放端口与 IO 资源杜绝端口占用问题。难点 5联机悔棋、和棋双向交互逻辑复杂两端对局状态不一致问题描述仅单方发送申请指令缺少对方回复反馈逻辑会出现一方同意悔棋另一方棋盘未撤销、一方同意和棋另一方未判定平局两端对局状态不同步 BUG。解决方案组员 3 独立完成设计完整闭环指令交互链路发起方发送申请指令接收方弹窗选择操作向对方发送同意 / 拒绝回复指令两端同时执行对应逻辑同步修改棋盘、对局结束状态、刷新界面保证双人画面完全一致。七、项目整体总结与小组开发收获7.1 项目完成情况总结本项目完整落地前期全部开发需求成功实现高难度人机 AI 对战、局域网双人联机对战两大核心玩法配套完成聊天交互、自定义昵称、悔棋、认输、双向和棋、10 秒限时落子、背景切换、棋谱保存回放全套辅助功能。 代码严格采用四层分层模块化架构四人小组分工清晰每位组员独立完成专属模块模块间接口规范、低耦合程序具备完善异常容错机制无严重崩溃、卡顿、数据不同步等致命 BUG功能完整性、程序稳定性均达到课程大作业考核标准。7.2 个人技术能力提升总结熟练掌握 Swing 完整图形界面开发流程理解窗口、画布、组件布局、鼠标事件监听底层实现逻辑吃透 TCP Socket 网络编程原理掌握服务端 / 客户端创建、长连接通信、Object 对象序列化传输、IO 流资源管理深刻理解 Java 多线程并发开发核心要点掌握异步线程分离耗时操作、Swing 线程安全处理方案建立分层架构开发思维学会拆分视图、数据、算法、通信模块实现数据与界面解耦掌握简单博弈 AI 开发思路理解棋型威胁权重、棋盘推演打分算法设计逻辑熟练使用文件 IO 完成本地数据持久化实现文本文件读取、数据保存功能大幅提升团队协同开发能力学会统一代码规范、模块对接、协同排查联调 BUG。7.3 项目可优化拓展方向网络功能升级搭建多人联机大厅支持多组玩家同时双人对局不再限制单房间支持公网端口映射实现外网远程联机AI 算法升级引入蒙特卡洛博弈树、极大极小值算法进一步提升 AI 智能程度增加多难度 AI 切换简单 / 普通 / 困难账号积分系统新增本地账号登录、对局积分存储、胜负战绩统计功能UI 界面美化替换原生 Swing 简陋按钮使用图片自定义组件、美化弹窗样式、增加对局背景音乐数据存储升级将棋谱、玩家积分从 txt 文本迁移至轻量数据库实现数据长期管理拓展对战规则新增禁手规则贴合专业五子棋竞赛标准。小小五子棋视频演示