上大学那会,还没有自己专属的SVN仓库,但是我已经意识到了管理代码的重要性,我最常用的一种需求就是恢复到上一个正确的版本。
为此,我每实现一个重要功能,就会备份整个项目一次,增加开发日志,如“2010/11/13 实现玩家列表同步”。
前前后后1年时间完成这个项目,还是有很多体会的。
总结使人进步,分享使人快乐。
希望对大家有所帮助,有所启发。
心得体会
1.软件复用实在是太重要。
2.前期对需求的了解不全面,当功能越来越多的时候,改动很麻烦。
前期对需求并不清楚,功能都是一点点的加上的,当功能越来越多时,发现有了太多的if else这样的语句,使用
继承和接口重构了项目。
3.模块划分清楚、弄清模块之间的依赖关系,便于分工合作。
4.开发环境运行和打包成exe文件运行还是有很大区别的,需要修改目录,不然没有声音、棋谱保存路径不对。
5.编码只是软件开发过程中的一部分,把握需求、分析和设计、充分的测试、高质量的技术文档和用户文档都是很重要的。
6.工业产品和校园产品 差距很大,锻炼作用。
后期项目维护,没有了激情。
7.复用–毕业设计,课程设计之类的,一次编写,处处使用。
开发日志
2010/10/25 到2010/10/28 下载一个简单的中国象棋 花4天读懂原理、优化变量等
2010/10/29到2010/11/11 第一个版本中国象棋完成
2010/11/13到2010/11/28 功能更强的中国象棋完成
11/13 实现玩家列表同步
11/14成员组不同步
11/16 2个玩家可以对战了
11/17实现了观察者
11/18进一步美化界面
11/19有了棋子移动提示和炮兵卒位置标记
11/20玩家组有聊天功能 帮助完善
11/23 实现了装载游戏
11/24棋子由用函数绘制 改为 美观的图片,界面变得更好了
11/26 打谱由坐标点的移动 改为 标准的棋局记录方式
棋子的移动方式由拖动改为了点击移动 棋子闪烁实现了
11/27 菜单完善 保存消息记录、棋谱记录描述、并且不再有乱码
11/28实现了棋局自动演示、打谱界面及部分功能实现
游戏状态栏优化__打谱装载棋谱功能构思
2010/11/29
常量字段分类__重组已有包__更多功能构思__模仿QQ__展示玩家信息__图片形式
2010/11/30 下午 初步想好了 书的章节和写作思路 初步了完成了书的附录
晚上 写好了棋子闪烁实例、对象读写实例、字符串读写实例
2010/12/1 上午 初步实现了 装载列表 显示目录和文件 及相关实现
下午 进一步描述了 书的目录,基础知识准备 初步写了中国象棋基础小节
感想:可以修改棋盘背景色、更加侧重编程实现
晚上 修正了装载列表中的一个问题,减少了几个变量 curPath,topPath
棋子闪烁线程可以正常关闭 构思了书的特色
2010/12/2 上午扩从附录内容 添加了标准类和接口
完善了前言,简要写了书的目录
下午及晚上 进一步完善了第2章 基础知识准备 部分小节
2010/12/4 利用继承重新实现棋盘类 打谱增加了残局打谱 重构了全局打谱类
第二个版本完成
2011/4/15 修改棋子的类别属性,由String类型改为枚举类型
2011/4/16 增加一个功能,输入一个字符串,如馬八进七,自动移动棋子。花了2个多小时。晚上8:16第一次测试成功,但移动
的棋子为对方的。如果能够将说的话转化为 字符串馬八进七,则功能很强大。
2011/4/17 调试 新增功能,根据棋谱字符串 馬八进七 自动走棋;
修改棋子提示标记所需坐标,由棋盘中的绝对坐标如 123,23 转换为在棋子点二维数组中的坐标;
新增一个功能,选中一个棋子时,提示用户哪些地方可以走棋。
棋子移动标记用绿色框表示,可走位置用蓝色框表示,吃掉对方的棋子用红色或黑色框表示。
测试很多步,没有出现问题。
需求在不断变化。(面试官的需求)
2011/4/18 到 2011/4/21 初步完成了 迷宫问题,只寻找一条路径,很容易;找出所有的路径,单步跟踪+打印语句 调试了
15个小时左右。
2011/4/22 下午和晚上,初步解决了 中国象棋 馬的迷宫求解问题,棋子的每一步移动路径对用户可见。
最开始,棋子移动时,界面没有及时更新,需要用到多线程。移动一步,停顿几百毫秒。
移动棋子,使用movePiece函数,复用代码。
2011/4/23上午,规定棋子移动时,不能吃子,测试了左边的4个方向,测试了3组数据。
线程暂停,使用sleep(int time)函数,重用代码。
2011/4/25 晚上8点多,看JDK源代码时,发现System类是public static final System,并且构造函数也是私有的,感觉挺好的,
所以修改了ChessUtil类,增加final修饰符,将构造函数改为私有的,不允许被继承,不允许实例化。
游戏规则类,棋子起点和终点坐标,需要检查范围是否合法,提取一个函数实现,private static void rangeChesk();
2011/4/26 开始研究 人工智能 首先看别人的源代码
2011/4/27 晚上 6点,将Location类名改成Position类,棋子的getLocation方法改成getPosition.避免和Compopnent类中的函数重名。
游戏规则类中,棋子移动坐标检查代码,放在rangeChesk函数中,残局打谱不能执行下标检查或者下标检查代码不应该和全局
打谱下标检查代码一致。
发现一个bug,当棋子点击过快时,总是出现NullPointerException。判断是否为空!
全局/残局打谱 选中棋子时,添加声音。
7点,将棋子的id,由int类型改成枚举类型。
7:50,在ChessBoard中增加public void movePiece(winkPiece,startI,startJ,m,n);方法,重用很多代码,使得代码行数减少 了100行左右。8:30在ChessBoard中增加addChessRecord(winkPiece, startI,startJ, endI, endJ);方法,减少了几十行代码。
遇到一个问题,悔棋时总是出现问题,原因:应该先增加记录,再移动棋子。
9:20解决一个bug,残局打谱时,放置棋子后,如果点击了黑方的棋子,此时棋子还在闪烁,再锁定棋局并且让红方先走,
则棋子不能正常移动,改正方法:锁定棋局时,增加2个函数,board.setSelected(false);board.setNeedWink(false);
2011/4/28 上午,增加棋子查找方法,根据id,name查找。
游戏规则类中增加,老将是否对脸方法。
2011/5/1 下午,测试棋谱的逆向解析,解决了几个问题:
1.根据名字获取棋子的类别时,少考虑了一个问题,马二进三、馬二进三,可以是简写也可以是繁写。
2.生成棋谱时,有些情况没有将枚举类型的棋子类别转换成String类型的。
3.完善了一个功能,可以解析 前炮进2 类特殊棋谱情况。
4.棋谱逆向解析时,探索过程的状态,及时显示在界面上,但还有问题。
2011/5/2 新增practice包,增加八皇后算法。将八皇后、迷宫求解、线性规划等问题放入一个包中。
排序算法,还有点问题。
晚上,换种方法,只需要用冒泡排序一次就可以了。
回溯求解时,列优先,大大简化了问题。
增加了布局列表显示及其事件响应,第一步…
待实现的功能:保存和高级保存,将合理的布局保存起来。
2011/5/4 全局打谱中,测试老将是否对脸算法,有问题:需要分2种情况考虑,1种是移动的棋子是將或帥,另一种是其他类型的棋子移动。
八皇后保存:第0种布局!(1,1) (3,2) (2,3) (5,4)(4,5)
八皇后高级保存:
保存和高级保存的数据一致了,主要是2种保存对应的布局应该一致,一一对应。
2011/5/5 完成八皇后 保存和高级保存,测试暂时没有问题。
將棋子点二维数组转换成 FEN字符串,测试正确。 需要注意的是,一行行的读,应该是二维数组的列优先。
2011/5/6 上午,FEN字符串转换成表示局面的棋盘和棋子点二维数组,测试正确。
下午,重新构思入口界面,变得更好了。
2011/5/7 下午,看《中国象棋入门与提高》局面评估,晚上编写局面评估算法。敲了5个函数,都没有测试。
2011/5/8 上午10点到下午4点,简单的人机对弈算法写了,有很多错误。
2011
/5/9 下午,发现了2个错误。一个是FEN错误,另一个是获取最佳走法的错误。初步测试,没有问题,但是“机器很笨”。
晚上,需求分析说明书大纲写好。
2011/5/10 下午,修改极大极小搜索算法,又增加了负极大值搜索算法和alphaBetaSearch搜索剪枝算法。
最佳走法总是为null,暂时不知道原因。
晚上,使用模版方法设计模式优化棋盘类设计,使用享元模式优化棋子工具类,棋子图标资源不用重复获得。
2011/5/11 晚上,花了3个小时,判断棋子移动之后是否会被将军。考虑不周,很累很郁闷,悔棋时或者撤销刚刚的走法时,
如果有棋子被吃,需要给被吃的棋子添加事件响应,pieceRemoved2.addMouseListener(board.getMouseAdapter());
2011/5/12 5/13 细化书的目录
2011/5/14 修正八皇后问题,理解有误。
2011/7/19
2011/7/20
修改 联网对战时 消息id 为枚举类型
修改 玩家角色 为 枚举类型
修改 棋谱类型 为枚举类型
删去了很多常量接口,取而代之,用自定义的属性读取类读取常量字符串,
可以读取中文和英文。
2011/7/21
观察者发送消息时,需要屏蔽一些关键词,public static String filter(String message).
最麻烦的问题,红方、黑方的相对位置,有3种情况,总是需要分别处理。
楚汉棋兵中,有很多地方是相同的,很多地方是相似的,也有很多地方是不同的。
2012/5 为完成毕设,完善已有文档,添加新的文档。
原文参见:http://FansUnion.cn/articles/2489