Project通关指南
ChenGou
前言
关于笔记内容:
以下内容是我在 25Spring CS109 的项目开发过程中产生的一些记录, 结合一些经验教训, 一并总结成文. 内容重要性呈倒三角结构, 后附录的一些日志性记录可以作为一些真实状态的反应, 供同学们了解参考. 总评A, Project 100.
一些建议:
Project 压力极大, 上手难度曲线陡峭, 投入时间较多 ( 但是理论上能优化的很好, 但是对于笨蛋本科生来说还是太难了, 大家一定要多找学长, 多和同学聊天, 我就是闭门造车非常后悔.)(有追求的同学可以抛弃Demo的部分框架设计, 但是千万不要重复造轮子或者沉湎入自己的屎山.) 但是只要你开始 Step inside and hold your position, 你就能逐渐开始了, 项目进度开始滚动, 事情就这样成了. 善战者无赫赫之功. 如果你提前了解了 maven, git, github workflow 等工具的使用, 甚至使用 Linux 系统进行开发, 了解常见的设计模式并且善于使用自动编程工具, 我相信这将会是一段轻松的时光. 不过即使不会的同学, 这一段经历我相信也弥足珍贵了.
Project 开发强度 :
我做的工作比较多, 队友受伤了, 当时也没有学很多东西, 在 bug 的泥沼里挣扎了很久. 高强度投入了 2周约 50 小时, 属于是最悲壮地模式了, 希望同学们引以为戒. Have fun please.
还想说的一句话 :
项目就在这里, 只要你投入时间, 你将无往不利.
联系作者 :
Github 个人网站 SUSTech Email : 12412903@mail.sustech.edu.cn QQ code : 1339495928
License :
CS109_计算机程序设计基础笔记 © 2025 by 陈勾 is licensed under CC BY-NC-SA 4.0. To view a copy of this license, visit.
最后更新时间 : 2025年6月19日17:42:58
Report 回顾
项目快速得分点
评分标准
得分根据工作量和成果决定, 但是基础部分的比重远大于 advance, 难度远小于 advance. 规划项目的时候要全部完成! 个人感觉部分领域登峰造极, 做到旗帜鲜明就会收获.
- 10+ 档次的分数容量 :
- AI solver : (即使使用网上的接口也要自行实现动画, 像人在操作一样求解)
- AfterEffect and Animation : 最强的当然是实现 3D类, 实时渲染的背景动画, 简单一点的平滑移动, 明暗或者材质主题切换
- web service : 联网对战和聊天, 注意展示好功能.
- 简单好做不史山的 features (标准: 功能独立性高, 通过调库实现成熟技术方案):
- +4 : TOTP 基于时间的一次性 6 位数密码, 2FA 验证, 辅助手机OAuth, 结合 Device Signiture 检测账号状态
- +4 : 风格统一的页面样式, 加载图片材质(吴思彤组风格极强, 非常可爱)
- +2 : 同类玩法创新, 例如华容道限定移动方式
- +2 : 游戏机制创新, 展示小组里面使用炸弹道具炸掉方块
- +2 : 使用 Java 自带的邮件库就可以发送邮箱验证码了
- +2 : linux + gradle 实现 Android 等多平台兼容
- +2 : 使用 .css 实现明暗模式, 即多主题
- +2 : leaderboard 排行榜计分
- +2 : 使用 JSON + .css + .properties 实现多语言功能
- +1 : 使用 maven 进行项目依赖管理
- +1 : 插入音乐, 音效等
- +1 : 使用 jpackage 打包成 .msi 和 .exe, Mac似乎比Win要方便
- +1 : 使用 Github 进行开发合作, 要有一定且平衡的 commit, merge 记录. 备注 : 上方的给分分值根据个人回忆确定, 未必精准, 部分内容尽可能实现. 事实上 Project 想要的高分的方式只有两种
- 难度高的 Web, AI, AE 做的很好, 或者 UI 设计的很有意思, 能吸引老师或者是展示的时候拿得出手
- 涉及的功能足够丰富, 足够现代, 足够有趣而且完善
LabReport理论课展示
以下是刘庞烨老师班周五3-4节课上小组答辩的记录, 供参考
- 周支宇小组(信息竞赛的全方位碾压):(重要的是聊一聊游戏思路) 2. 精美的UI设计, 实时渲染的波浪条纹, OpenGL渲染的3D效果, 抗锯齿而且可以选中首页动画 3. HJKL的键盘使用控制 4. 联网模式的完善功能和不同的游戏模式 5. 用AI生成纯色背景像素风, 然后使用工具去除纯色背景 6. Hint, Auto和Stop的游戏功能,记录行动方向. auto是一个通用解法 7. 非侵入式的游戏提示 8. 游戏的音效和背景音乐, 平滑移动和自动移动 9. 自动音量下降的切换 10. 额外的Demo游戏逻辑, 完全是一个新的小游戏. 11. 没有传递棋盘的变化, 传递方块信息, 联网过程中是有真正的服务器在运行. 12. 小bug是能足够出彩的, 游戏功能的设计性(cooperate功能必须同时开始.) 13. 固定了曹操的位置, 所以随机结果必然有解.
- 王惠田小组: 自主学习的典范, 项目结构和项目特色.
- LibGDX的使用, 3D游戏的实现, 抗锯齿, 简陋但是自由的框架. UI美观.
- AI生成 + ps处理, 查看回放功能, 游戏结算和评分功能, 自动播放的速度.
- 游戏的音效和背景音乐, 平滑移动和自动移动
- 模块化设计, 通过 gameMain 分发全局控制句柄
- 网络模块使用观察者模式, 统一网络服务调用
- 服务器端使用MySql数据库调用, 完全云上存档
- 邮箱验证码功能(JavaMail自带库), 允许素材异步加载, 支持启用 Mipmap, MSAA等显示优化
- 游戏模式: 炸弹爆炸删除方块(非常非常有趣,因为_是项目展示所以只展现一种可能性而不必考虑可玩性_)
- 游戏状态检测, Online, Player.
- 首页视频加载的材质.
- 节省精力使用gradle管理以来, reed算法解决存档损坏问题.
- 丑陋的自定义序列化文件.
- Manager作为主类管理.
- 吴思彤小组: 强烈的可爱风格和 UI完整设计. 完整比完成设计
- 真随机的计算方法?
- 可爱的素材风格文化.
- 学校的WIFI远程连接不稳定, 统一使用对话框可以进行聊天.
- 邓智元小组: 水墨风的粒子特效, 打字机特效, 轮换特效 (这几个实现难度不高, 重点是知道有这么个东西)
- 文字, 联机, 快速BFS
Knowledge知识
经验分享
数据存储的三重形式
- 运行内存中
- 类与对象中
- 系统文件中
进阶工具与命令
- gradle
- github
- Eclipse
- git add -u
- IDEA add as library
- IDEA ignore filetype
学习使用的快捷键与功能Keymap
- ctrl + shift + alt + N 直接搜索类
- ctrl + R 替换
- ctrl + shift + F 全局搜索
- 左侧 toolbar 里面的 structure
- ctrl + shift + F12 关闭所有窗口
- ctrl + F4 关闭当前窗口
- ctrl + shift + - 折叠所有代码
好习惯
//写注释真是好习惯 //写输出日志也是好习惯 //写打印相关量也是好习惯
Reflection反思观点
善战者无赫赫之功, 良将先胜而后求战
- 总体难度与给分
- 对于有追求的同学来说, 上到理论课答辩不是难事, 筛选标准的重点是完善而且有趣.
- 老师很看重自动化: 高分的基本上是千篇一律的工业化产品: AI, UI, AfterEffect, 这个重大板块基本上一开始就知道了, 但是执行编写过程中没有落实到位. 基本上还是想到哪里写哪里的水平
- 开发经验
- 合理参考Java互助群里的各类资源和教程
- (使用linux和gradle才能实现多平台)
- 分工上最好还是前后端, 然后统一使用controller链接, 项目结构一开始就要管理好, 方便自己的清晰地工作.
- 当前AI不能做到完全替代编程, 只是一个加速学习相关知识的的工具, 但是在具体拆解后的任务完成上非常出色, 推荐的使用方式是自己规划任务到极细的颗粒度后让AI实现, 但是规范, 接口, 结构等一定要自行确定并牢记.
- 以下是我记录的答辩注意事项:
- 我们的特殊答辩顺序
- 准备好损坏的存档文件, 测试鲁棒性, 不能损坏
- 基础分必须一板一眼:不能commandLine任何交互, 棋子的pieces
- 打卡给分(小点是1分,而且过于简单还只有1分,展示自己的困难,页面美观性(AnimationEffect, AI, Online观战与速度 ))
- 准备测试的欺瞒东西
- demo预设地图
BugLog开发日记
记录
让我们重现来时路
知识经验
- 打包命令 jpackage –input “C:\Users\Xu2003\CS109\out\artifacts\CS109_jar” ^ –name “KlotskiPuzzle” ^ –main-jar “CS109.jar” ^ –main-class “Main” ^ –type “exe” ^ –dest “D:\desktop\Homework” ^ –module-path “D:\software\javafx-sdk-24.0.1\jmods” ^ –add-modules javafx.controls,javafx.fxml,javafx.media ^ –win-shortcut ^ –win-menu ^ –description “华容道经典益智游戏 - CS109 课程项目” ^ –vendor “CS109 Team”
- 环境变量与相关依赖设置问题:添加java/bin至PATH dotnet –version后安装NET SDK 最终参考此帖子 https://blog.csdn.net/m0_64776123/article/details/137831429
- 目录文件iml.idea等损坏后流程:目前还是使用idea管理项目结构
- 立马提交所有更改到github
- 删除原有目录
- clone git 创新新目录, edit configuration
- Note:设置新VMoption: –module-path D:\software\javafx-sdk-24.0.1\lib –add-modules=javafx.controls,javafx.fxml,javafx.media –add-opens javafx.base/com.sun.javafx=ALL-UNNAMED 右键directory标记为资源目录.
- 设计模式
- 单例模式: 设计模式的单例类, 只允许创建一个实例, 通过静态方法获取实例.
- 工厂模式: 提供一个创建对象的接口, 让子类决定实例化哪个类.
- 观察者模式: 定义了一种一对多的依赖关系, 当一个对象状态改变时, 所有依赖于它的对象都会得到通知并自动更新.
- 策略模式: 定义一系列算法, 将每个算法封装起来, 并使它们可以互换.
- 我就应该功利一点,把简单的分数拿齐全,而不是想着做出一个完美的项目, 优美清晰地结构没有用, 提交后就作废,完成再说
- 缩小范围debug才能有进展,只保存了requiremap,不符合规范不加载.
- 不要把工作留到明天
- GameConfigManager设计模式
- 避免硬编码
- 权限和模式分离
- 静态加载便于修改
参考引用
- 华容道深度研究:http://bbs.mf8-china.com/forum.php?mod=viewthread&tid=72215
- NOI求解算法赛题 : https://www.luogu.com.cn/problem/P1979
- 遍历解法:https://klotski.online/pages/about-klotski.html
碎碎念
- 一开始就要重视统一性?Json文件的格式,使用相同的逻辑.
- 多问一句,静态类写法真的太棒了
- 默认的toString方法返回的是地址
- static变量和 static方法是我一直想要的. 静态内部类实现builder模式
- 想法上容易复杂化,逻辑敏感性和天真的写法 重点是明白我的逻辑, ai是实现的工具,应用前先检查做对了没,相当于找了个低水平黑工. 电脑使用创造价值 最初设想的业务结构决定好了算法逻辑:想清楚再动手,只能开一个用户,但是可以多个存档, 所以不容易混乱? 吃饭两小时,但是实际上的开发有效时间也没有多少哈哈 提问的顺序:如何在全部见面获取对应语言内容并重新加载文本,basepage让在settingpage的微调没有用处. 越到后期越是要清楚代码结构,不接受大规模没有必要性的改动,看起来重构很好, 但是实际上的效益提升呢? BasePage的逻辑到底是怎样的 笑死了目前的情况是消除controller层直接连接model, manager和pages 事情是有先后顺序的,只有先完成了userModel才能完成save和log 及时行乐,赶紧休息,一次性最多开发 2小时, 剩下的都是垃圾时间了
- 要求自己写doc或许是一个熟悉业务的好方法.
- 对事情有一个整体的理解,才能知道到底在干什么, 那么技术上的细节不甚了了,也可以通过AI快速掌握,完全不理解当然改不出来bug
- 晚上先拿到一个版本,然后再进行重构, 先完成功能再说
- 笑死了大多数bug就是复杂度过高, 逻辑不清晰, 代码不规范, 变量命名不统一, 以及没有注释,基本上都是某个功能没有写
- 没有必要强行应用高级特性或者反复重构,功能优先,清晰简洁
功能开发记录
- README里保留的
- 2025年5月10日:整理好文件架构,在model中引入json功能 2025年5月11日:
- 清理完JavaFX转换时遗留的bug
- 同时进一步修改使得main可以运行,但是我的界面和游戏呢?
- 正确添加JavaFX路径依赖后终于动起来了,但是键盘监听和地图加载呢?
- 感觉我在写bug,不管了先提交一个版本吧。
- 14:50:32 添加日志功能,记录运行时文件的输出,包括上面的键盘监听和地图加载,方便调试,也为以后做准备。改写为动态代理模式。
- 15:05:01 着手增加计时器与TimeAttack模式,着手修改前面莫名其妙的地图和键盘问题。
- 和同学聊天时了解到他们有做聊天功能。
- todo:idea里面新添加package和新建profile有什么区别?
- 15:13:26定位到了GameFrame,修改了默认构造方法,logs没有完全加入所以是空空的
- 15:20:55 学习使用 IDEA 的 bookmark 功能,成功使用 IDEA CodeWithMe 功能,对于本项目而言比 github 方便
- 16:10:48 加入动态代理的 timer 功能,但是显然只弄好了模型,还没有进入应用层,接下来准备先debug,让游戏跑起来。
- todo:完成动态代理机制,目前暂时不能写入文档。
- todo:增加计时功能,并一并写入用户存档文件?保存每一步设置并且读取。
- todo:一种算法求解思路:是否处于某一种标准解法的状态?没有?后退一步!
- todo: 学习 bookmark 的使用
- todo: 最后应用程序的打包、封装、测试?能不能分发出全平台版本?
- 18:09:07 中间出去散步了一下,然后回来之后收集了一堆信息,算是完全明确接下来的开发方向了,但是实际上功能的更新很少,接下来要排除 bug 了
- 22:48:27 下午临走前想到需要重新设定胜利条件,于是更新MapModel,todolist更加清晰了,顺带着改好了WinCondition,更新了checkMove逻辑
- 23:03:16 特别容易忘记时间。接下来就是重构 Controller 和 view 狮山代码,主要是动起来!!!或许我也应该注意 开发日志 撰写规范hh,但目前感觉做起来真有意思,比写物理题目有趣的多,不过伤心的是在重复已有的东西,只能尽可能创新了? 2025年5月12日 10:19:48 思考觉得MapModel的参数有点复杂,把Json拆分模块化 JSON 配置 + 工厂设计模式 //todo 15:51:07 步数更新和方块移动 bug 仍然没有修复,好处是我对项目理解加深了。中午没睡觉、肚子不舒服明显感觉缺少激情。 16:15:49 重写了 4 种块的canMove判断,很人工;后面的 setBlock blockId 估计是 ai 加入的,明明是用参数结果还自己重载了,见buglog 16:19:53 一定要遵守开发规范,类名和变量名写一样真的好,多使用快捷键。 16:43:52 继续重构代码,发现了一个 bug,mapModel.getMatrix() 直接返回了引用,导致 mapModel.getMatrix()[row][col] = blockId; 直接修改了原始数据。解决方法是使用深拷贝。 修改完成MoveHandler,接下来做碰撞逻辑和视野检测,胜利条件,还有代码联系重构。 18:20:24 继续!
- bug起居注时代 : 记录格式 > 表象:原因:解决方案:消耗时间
- 选中方块容易错位:怀疑是this.selectedbox:没搞清楚this关键字的作用,学会不使用实例调用方法
- 修改地图matrix数据点觉得不对劲:getMatrix修改地图文件,然后数组reference导致了原始数据被修改:重写getMatrix和setMatrix方法
- restartGame按钮没有效果:mapModel的matrix一直在被改动,重置自身:另外保存OriginalMatrix
- ListenerPanel 抽象类居然没有子类:GamePanel里面具体重写业务代码:使用OOP重新设计
- IDEA找不到指定的类:out文件夹没有生成,需要编辑edit configuration:重新创建CS109Project并添加VMoption:30min
- 调试后发现,方块1地图没改写仍然是0,方块23没有正确加载,方块移动可以重叠且消失,有时突然卡住主动:initial和box对象初始化时占用周围格子为0,程序逻辑卡死:使用-1打墙发现,发现GameController里面moveblock写了两次,第二次是getId,于是会不正确加载?抄ai的好事.
- update,在不主动进行违法操作时,没有bug,进行某些违法操作时,系统可能会瘫痪,如,4*4block向左移动(本不可以)会很多报错,并且后续棋子移动出现问题:发现可能是边界超出索引,问题出现在view层:改写createBlock方法,使用setBlock方法,并且在GameController里面的moveBlock方法中添加了边界判断
- 棋子选中后红框不完全:可能是有重叠或者遮挡:已解决选中后红框不完全的问题,需要在选中状态时调用 bringToFront() 方法,将当前 BoxComponent 移动到父容器的最顶层.确保红框不会被其他棋子遮挡
- 步数记录问题:左下方步数记录到1后不能继续,右边步数一直为0 : 怀疑是重置了:左下角是 initialization的时候重置steps为0
- 键盘方向键操控了Restart和Load button 问题:选中棋子后,按方向键时不能移动棋子,但是改变了Restart 和 Load button 的选中状态(蓝框),是不是不应该被选中, update:已解决,通过设置按钮的 setFocusTraversable(false) 来禁用按钮的焦点,使得它们不会响应键盘焦点切换。
- json文件里面没有mapname和mapid字段:猜想在MapModel里面:构造方法忘记初始化了
- switch忘记写break了
- 动态代理忘记创建对象了
- 原本有json文件忘记提示了
- 前端没有继承 application
- undo功能问题
- 1.撤回时返回错误,undo只能撤回到上一步,不能多次撤回:undo之后最新日志未删除,导致倒数第二条日志仍然记录当前状态?:执行undo时,删除最新一条日志(是否考虑添加redo功能?)
- 第一步操作后撤回,返回的不是初始模型:初始模型一步没有记录日志,因此直接返回上一次游戏的最后一次日志:
- 3.步数未撤销:
- 4.撤销后选中状态消失:
- 5.不操作,直接点undo,一直沿着日志返回之前的操作。
- 不同账户登录,所用一个日志
- getRemaining Time返回值一直为0,导致GameFrame中一直显示剩余时间为0:是因为Timer == null:在Main方法构造器中删去对时间的初始化,消除了多线程干扰,改写了每秒更新计时的方法
- 2025年5月13日
- 基本功能可移动
- 胜利条件检测与提示,步数限制失败条件检测与提示(部分完成),胜利与失败动画
- 地图文件加载与保存(部分完成),修改文件管理逻辑,补充多地图预设
- 时间限制模式(部分完成)
- 2025年5月14日
- 调用外部api实现布局解法查询与动态演示,并提供当下解法查询(部分完成)(todo:可以移植到游戏本体,因为是全排布查询)
- 有效的地图随机生成器
- 游戏进度序列化存档与读取,实时自动保存与保存提示
- 游戏中功能:连续选中方块, 标签 steps 更新
- 初始化大量默认地图
- 游戏进程save, load, undo功能(部分实现)与UI显示,游戏日志文件
- bottonControl等UI控制组件,添加WASD控制
- 为按钮添加首字母快捷键,为图标添加图片(部分完成)
- 增加 MainPage和RegisterPage的显示和控制代码
- 增加地图选择器UI(请修改main方法页面加载逻辑),存档选择器UI
- 2025年5月19日
- 修复了undo功能的一些bug, 禁用键盘焦点
- 2025年5月20日
- 使用 MapOnlineQuery 实现了自动求解算法
- 添加了新的组件, 修复了 MainPage 的 bug, 并补充一些按钮,设置了 HelpPage
- 完善前端 UI 的结构设计, 重新架构 MainPage 为 多级页面
- 完善了选择地图功能, 发现每次没有正确传递是因为返回二级界面实际上是新建了一个二级界面
- 完胜了莫名其妙的 AI 求解功能并添加相应 UI 按钮 (太笨了似乎没什么用)
- 2025年5月21日
- 在FirstPage添加打开时背景音乐
- 更改背景音乐逻辑, 写作单例类可以全局控制, 并且在切换页面时切换至默认音乐
- 使用 css 美化 settingspage 控制音乐音量等
- 封装 ButtonFactory 和 Appearance 工具类, 复用常见按钮和棋子外观样式(待完善)
- 学习完成导出为.msi和安装包方法, 花费 1h 左右完成(准备Jar后,具体见CommandExecutor类)
- 添加 SoundEffect 类, 实现不同的音效.(30分钟)(待测试)
- 实现棋子平移的动画效果, 修改update更新逻辑为更新而非重新绘制(43分钟)
- 观察已有的MapModel机制,尝试加入不同玩法特性(19分钟)
- 添加随机地图挑战,经典地图生成器的入口(17分钟)
- 添加 SplashScreen 开屏动画(10分钟)
- 添加全局明暗主题切换功能,并且使用单例类模式统一全局样式(30分钟).删除css文件会使用系统原生样式.加载美化版本的css文件(7分钟)(待处理,感觉丑陋)
- 2025年5月22日
- (需要进行一些大改动!小打小闹浪费生命!)
- 尝试设置网络联机功能(20分钟)
- 增加全局语言切换模型,自动加载,缓存关联,修改资源文件路径,配置多语言和所有键值对,添加语言切换按钮和动画(60分钟)掉入basePage逻辑坑,应当模仿css样式修改(本质没有区别),自找苦吃,限时.
- 尝试转换为maven项目,然后损坏运行目录,自讨苦吃(两三次后终于明白)(70分钟+8分钟)隔离在新环境尝试使用maven
- 优化Astar算法,修改MapFileManager文件存储结构并修改了一些异常,重构了UserModel(40分钟)
- 理解了user文件夹运行逻辑,原来不是bug(19分钟),修改secondpage的退出按钮脱机,增加usermanager管理当下username,完善loginpage逻辑(20分钟)
- 开发邮箱和密码Validator,并增加图形界面提示与动态监视(14分钟)
- 修改 GameSaveManager 保存逻辑和 gamedata 处理方式, 修改 loadsave等相关功能(35分钟)
- 发现copilot到达限额(15min),尝试完成 2FA 并使用手机工具(18分钟),尝试使用JetBrainAI修改一些小问题后放弃(17分钟)
- copilot解禁前休息.(使用女友的账号,30分钟很playful)
- 尝试重构 GameSaveManager, 尤其是游戏存档的命名(26分钟),必须要统一协议格式
- 成功重构 GameSaveManager 和 SaveSelector, 原因在于filename的默认格式不同(48分钟)
- 自动加载最近自动保存存档, 删除存档功能, 恢复删除存档功能(10分钟),添加忘记账户相关量与修改组件(8分钟)
- 2025年5月23日
- 尝试构建微信扫码登录, 需要申请, 放弃,选择使用maven添加2FA(20分钟),最终下载jar包(25分钟)
- 使用 TOTP, authenticator, qrcode 完成 2FA 登录(25分钟),发现获得密码不统一,尝试修复(35分钟)(不要解决bug,玩乐心思更多了)
- 实在是无法解决(12分钟)
- 统一使用 FileHashUtil, 定下标准是最重要的(16分钟), 发现calculateSHA256中没有移除,没有成功移除mapId字段(25分钟)(debug太低效率)
- 增加设备指纹验证, 完善创建, 验证, 更新逻辑, 以及唤起 2FA验证(18分钟)
- C 盘空间不足,干等无聊(24分钟)发现MapModel参数设置,地图问题,以及log和undo显示问题.(18分钟)例如targetPosition设置
- 解决两步验证密码不一致问题, ai给出了答案但是我没有合适提示词,使用已有方法尝试构建测试集(35分钟)
- 设置默认地图训练集(20分钟)修复由于MapType2引起的读取字段缺乏问题(16分钟)
- 发现Save的Steps没有正确保存,修改了GamePanel,添加了出口标志和Type1型移动逻辑,删除Consumer逻辑使用GameConfig统一管理(40分钟),修改MapSelector验证寻找了一些bug(20分钟)
- 增加不同游戏模式,限制使用部分功能(12分钟)集成到GameConfig中(20分钟)使用内部类和静态方法(10分钟)
- 根据AI理解重构SecondPage真的清晰很多,然后管理GameConfig初始化设置后再调试GamePanel(30分钟)
- 统一GameConfig的使用, 统一启动方式,以及GamePage的单例类参数传递(40分钟)
- 2025年5月24日:尝试统计整体开发时间(09:46:24)
- 修改SecondPage的逻辑,save的选择决定于map,以及时间限制修正(27分钟)
- 尝试重构 GamePage 425 行的巨怪gamepage(20分钟),重构firstpage(23分钟)
- 同时完善MapType2的胜利条件,成功改善 showAlgorithm方法,修复了传入model为运行中map的bug,仍然无解(33分钟)
- 感觉做不出来网络和AI功能,用Qwen做似乎还是要调整(30分钟)
- 实现了网络连接,但是没有实现在线传输,没有定义数据结构(66分钟)
- 2025年5月25日
- .exe cannot find JVM, 需要添加–add-opens javafx.base/com.sun.javafx=ALL-UNNAMED,使用JMOS打包
- 网络端没有创建服务器,输入错IP地址,成功创建新页面,也成功发送信息,但是接收端没有正确更新(78分钟)
- 思考开发逻辑和需求,重构save, config, gamedata的层次(15分钟)
- 使用GameConfig和log重构Save,并且添加验证功能(52分钟)
- 重构 GamePage和GamePanel,删除无用的GameStateManager和ListenerPanel(20分钟)
- 完善LogModel的特殊存储,头文件签名和 LogId生成(34分钟)
- 尝试利用GameConfig重构 StepLabel 和 TimeLabel, 白做无用功增加复杂度.心情崩溃
- 用AI详细定位问题解决了TimerManager的问题, 热泪盈眶.
- 突然发现可以push上github,终于带来了一点安全感,我再也不想学习计算机了.和狮山搏斗.
- 2025年5月26日
- 终于修改完成TimerManager的限时模式(18分钟),原因在于GamePage没有正确传递GameConfig,导致无法获取时间限制
- restart的立刻失败是因为stopTimer多次调用,但是时间线重新设置和timelabel更新实在是困难.(70分钟)
- 成功加载棋子图片材质(70分钟),逻辑上的bug层出不穷,终于修复好了选中和加载(40分钟)
- 完成纵横移动限制和requiredEnd地图加载(40分钟)[我不想在这里!我想要休息,可是工作太多,帮手太少我只能做自己…]
- 完成 mapType == 3 的剩余两种情况的移动逻辑(26分钟)
- 避免重复技能, stepsLabel本身有步数回调机制,把缺失的重新设定补充,这里的回调不依赖于GameConfigManager(13分钟)
- 不同功能模式禁用部分功能, 例如AI, undo, restart, save, load(13分钟)实现不了ai算法
- 根据logmodel state重定义network实现远程观战(45分钟)[太低效率了完全不想做了那就去放松]
- 2025年5月27日
- 2025年5月28日
- 2025年5月29日: 尝试补救一些东西, 星期五第3-4节,三教502机房
- 音效部分
- .msi: OK, jmods, resources, 实现不了
- 步数Label恢复 : OK
- 平滑移动和切换图片外观 : OK
- 音效问题 : OK
- 快捷键: OK
- BFS : 广度优先
- Project 满分
疑问记录
以下是开发过程中备注的一些问题, 由得已经解决, 有的放弃处理, 随着 JavaProject 的结束都被扫入故纸堆里, 这里仅仅归类聚合不加处理, 以供读者了解我们实地的开发过程.
- 为什么GameStateManager里LoadGame要重置步数?不是应该保存现有步数吗?
- GameStateManager作为单例类,是否应该在构造函数中初始化?还是在使用时再初始化?这个类怎么用啊
- gameconfig作为参数传入,save应该是最高等级的游戏数据,包含一些运行时内容
- GamePage和GamePanel的逻辑太复杂了,需要重构
- 游戏log记录不排除失败,undo也没有steps(或许可以记录并显示点击次数.)undo需要选中box吗?restart未清除游戏记录.
- 外部暴露的地图接口(自由地图编辑器?)
- 需要解决的问题
- restart按钮对清楚you win 文字效果不起作用
- 加入自动保存功能后,之前添加的限时模式逻辑不够清楚.
- 整理代码,使用static模式,使用设计和单例(事实上是不断堆积的复杂度和整理所需要的工作量.)
- 关于地图存档说明:保存的smallTool里面的方法似乎没有把mapId修改,所以首先要写一个简单的代码来修改所有的mapId
- 这里唯一确定map文件的是一个键值对,int[][] mapData 和 补充相关信息后算法生成的 SHA256, 用作标记主键查询.
- 修改完成后启用validator
- 特殊移动模式中,对棋子移动可能性的UI显示套件皮肤arrow没有出现在顶部
- 刚进入后自动切换回图片材质(controller里的逻辑)
- 语言切换动画效果没有产生, 而且没有用多语言字段
- 打包的.msi, failToLaunchJVM, resources breakdown, 事实上不可用
- 一些待确定的问题,结构控制与优化
- 这个handleLoadMap功能应该在GamePanel里面吗
- 注意:每一个功能模块方法都要在controller里面实现,view里面写同名方法调用以显示和交互
- 提示:改代码的时候写一下buglog方便理解工作。
- 块体选中状态会自动消失——应该是用boxcomponent getboxat方法
- 继承Listener抽象类后鼠标选中失效.
- 块体 setSelected 后边框颜色显示不全
- view.game.InputListenerPanel 这个抽象类没有被使用,结构上很奇怪,用 copilt 梳理一下功能.
- 原来是在 GamePanel 重新写了组块功能
- GameController 里面的 handleLoadMap 方法没有被使用和调用
- 这个方法的功能是加载地图吗?还是加载游戏状态?还是加载游戏数据?
- 这个方法的参数是一个 MapModel 对象,表示地图模型吗?还是一个字符串,表示地图文件名?
- 这个方法的返回值是一个 boolean 值,表示加载成功吗?还是一个 MapModel 对象,表示加载后的地图模型?
- 这个方法的实现是一个空方法,没有任何逻辑和功能。
- Steps 更新问题
- GamePanel里面吗getGridSize 干什么用?根据地图是不是直接替代了。
- 华容道游戏模式有暂停吗?或者 ConditionChecker 里面除了 win, lose 还有别的需求吗?要写个 pauseCondition吗——以后的步数限制、时长限制可以另行补充。