期末课程设计:基于Swing的手写五子棋小游戏(含简单人机算法)

📅 2026/7/2 7:04:37
期末课程设计:基于Swing的手写五子棋小游戏(含简单人机算法)
*期末课程设计基于Swing的手写五子棋小游戏含简单人机算法期末课程设计基于Swing的手写五子棋小游戏含简单人机算法项目背景与简介大一下学期的《面向对象 程序设计》迎来了期末大作业。为了巩固这学期学到的 Java 知识我和另外两个同学组队决定用最原生的 Java Swing 写一个五子棋对弈游戏。虽然现在开发桌面软件很少用 Swing 了但对于初学者来说不依赖任何第三方框架、纯手敲 1000 多行代码确实非常锻炼面向对象思维和逻辑处理能力。本项目实现了以下几个基础功能双人对战两个人在同一台电脑上轮流下棋。人机对战写了一个简单的电脑 AI支持“随机乱下”和“贪心打分”两种难度。悔棋功能下错了一键撤销。比分记录通过 IO 流把胜局次数保存在本地文本里下次打开游戏还在。模块划分为了防止三个人写代码的时候互相冲突我们按照功能把项目拆分成了三个大块核心逻辑模块主要负责 15x15 二维数组的维护、判断输赢有没有连成5个以及电脑 AI 怎么计算落子点。界面UI模块主要负责画出窗口、菜单栏、右侧的控制按钮以及处理鼠标点击棋盘的事件。画图与存储模块负责用 Graphics2D 在面板上画出网格和立体的棋子并且用 Properties 类读写本地文件。几个关键功能的实现思路其实写这个五子棋最难的不是画界面而是里面的一些小逻辑。我挑几个印象比较深的总结一下。3.1 怎么判断赢没赢一开始我们想的是全盘扫描但是那样太浪费性能了。后来发现其实只要看刚刚下的那一颗棋子周围就行了。也就是以刚下的棋子为中心往四个方向横着、竖着、左斜、右斜去“数”。比如横着就往左边探几步遇到同色的就加1遇到空位或者不同色的就停下再往右边探。如果加起来大于等于5就说明赢了。3.2 简单的 AI 算法是怎么做的人机对战里最难搞的就是电脑怎么知道该下哪里。我们查了一些资料最后用了一个相对简单的**“打分法”**电脑遍历棋盘上所有的空位。假设自己下在这里看看能连成几个子如果是活四就给极高的分如果是眠二就给低分。假设玩家下在这里对电脑的威胁有多大威胁大也给高分逼着电脑去堵人。最后找一个分数最高的空位落子。虽然比不上那种带深度搜索的顶级 AI但对付平时随便玩玩的玩家也足够了。3.3 鼠标坐标怎么对齐到棋盘上这里卡了我们挺久。因为鼠标点击获取的是屏幕像素比如 x138但是我们的棋盘数组索引是 0~14。最后的计算公式是先把鼠标像素减去棋盘边缘的留白然后加上半个格子的宽度再除以格子的总宽度。加上这“半个格子”是为了实现四舍五入这样就算玩家鼠标点得有点偏只要离哪个交叉点近棋子就会自动吸附过去。3.4 怎么防止界面卡死在人机对战的时候玩家一落子电脑瞬间就跟着落子了由于电脑算得太快界面有时候会卡一下而且玩家的棋子还没画出来电脑就下完了。后来我们在调用电脑下棋的代码外面套了一个 javax.swing.Timer设置了 400 毫秒的延迟。这样不仅界面不卡了还有了一种“电脑正在思考”的真实感。课设总结反思经过这次课设最大的收获就是体会到了什么叫“面向对象”。以前写代码习惯把所有东西都塞在一个 main 方法里这次我们分了将近 7 个类画图的专门画图算逻辑的专门算逻辑代码看着清爽多了。当然过程中也踩了不少坑比如数组越界报错ArrayIndexOutOfBoundsException、文件 IO 流忘记在 finally 里面 close() 导致文件被锁死等等。好在最后通过疯狂打日志、查报错都一一解决啦。————————————————