中国象棋程序的设计与实现(七)--心得体会和开发日志

上大学那会,还没有自己专属的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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值