在 Project 1 中,同学们实现了一个命令行界面的斗兽棋小游戏。Project 2 延续 Project1 的内容,通过 GUI 扩展和部分进阶功能,使我们这个游戏更具娱乐性和可玩性。
我们将 Project2 中需要实现的内容分为逻辑和界面。在 Project 1 中,同学们基本上已经完成了大部分的逻辑操作,这次只需要对一部分原来没有实现和对未完善的部分进行完善,着重重构代码和使用面向对象设计的部分。图形化界面推荐大家仿造 野兽争霸斗兽棋 中的单机对战部分,其素材在 audio
和 pic
文件夹中给出。大家也可以自由发挥,打造属于你自己的斗兽棋,只要展示清晰、明了即可。
大部分同学的 PJ1 代码可以通过重构来提高代码质量。
PJ2 对代码风格有以下三点具体要求:
- 单个方法的长度不应超过 300 行(如有特殊情况可向助教提出)。
- 方法名和变量名命名得当。
- 方法和类的作用与意义清晰明确。
- 逻辑和界面分开设计,不要把他们混着写在一个很大的类里
使用面向对象的思想来设计代码结构是 PJ2 的重点要求。在同学们动手写 PJ2 代码之前,助教建议同学们根据所学知识,设计好 PJ2 基础功能的每个类。
推荐同学们将自己设计的 逻辑部分 中每个类以文档的方式记录下来。内容包括:
- 类名、类的意义和作用。
- 类的父类、子类和接口,以及这么设计的理由。(如果有)
- 类的构造函数、可见域和可见方法以及它们的作用。(最主要的一点,体现封装的概念)
- 类的私有域及其作用。(可以只列出关键的几个)
- 类的私有方法。(不一定需要)
- 其他有必要提及的内容,比如和其他某个类之间的联系。
以 第三次视频 中的 GameHistory 类为例:
类名:GameHistory
意义和作用:记录所有游戏历史,并提供悔棋、取消悔棋功能。
(没有父类和子类,也不实现特定接口)
类的构造方法:
1. public GameHistory();
作用:初始化所有私有域。
类的可见域:无
类的可见方法:
1. public void addRecord(String[][] board);
作用:复制board并添加入历史记录中。
2. public void undo(String[][] board);
作用:悔棋,并将悔棋后的棋盘写入board中。
3. public void redo(String[][] board);
作用:悔棋,并将取消悔棋后的棋盘写入board中。
4. public void restart();
作用:重新开始游戏时调用,清空并重新初始化历史纪录。
类的私有域:
1. private String[][][] boardHistory;
作用:记录所有的游戏历史。
2. private int currentStep;
作用:记录当前游戏地图在boardHistory中的位置。
3. private int lastStep;
作用:记录boardHistory中最后一步的位置。
类的私有方法:
视频中无,但是可以有一个copyBoard方法,即出现过三次的两层for循环可以提取出一个 private void copyBorad(String[][] from, String[][] to); 方法,减少代码重复性。
像这样的一份文档可以在写代码时提供很大帮助,并且其中的文字大多可以作为注释、文档的材料。
初步设计完后,同学们可以将自己的设计与助教和其他同学一起讨论,看看设计是否合理,有什么需要改进的地方。
在实际写代码的过程中,同学们很可能要经常修改自己的设计,希望同学们在修改设计的时候一并修改此文档。
图形化界面是 PJ2 相比 PJ1 最明显的升级,也是 PJ2 中最有趣的部分。
图形化界面部分自由度较高,同学们可以在此充分发挥自己的想象力和创造力。
游戏地图为 pic
目录下的 Map1.png
、Map2.png
和 Map3.png
。同学们根据自己的界面需要选取其中一张,或在其基础上修改,或自己设计一张。
动物图片在 pic
目录下的 animals
目录下,并分为左右两侧。相比我们参考的 Flash 版本,助教没有提供动物图片的“红色”版本,同学们可以自由发挥如何标识动物是否处于可以操作的状态(不标识也可以,但要在明确显示现在轮到哪一方移动)。
动物移动使用鼠标控制,与参考程序相同,点击一个动物,再点击移动至某个地块。此处请注意合法性判断。
如果有同学想对动物移动的操作方法进行改变,请联系助教。请不要通过键盘输入 1w
、4d
等字符串来进行移动,会被扣分。
基础功能中,不要求点击动物后显示其可以移动的地块,这个功能作为拓展功能的可选项。
这三个功能要求实现,具体实现方式由同学们自己定义,合理即可。
同学们可以创建菜单栏,将这些功能放入菜单中,也可以设置几个按钮,放在合适的地方。
胜利条件判断与 PJ1 相同。
胜利提示或胜利界面由同学们自己定义,合理即可。
考虑到游戏的正常逻辑,取消悔棋功能可以不在图形化界面中提供,但悔棋功能必须实现。
悔棋功能不再要求只能悔棋一步,同学们可以按照自己对游戏悔棋功能的理解提供悔棋功能。可以悔棋一步,可以悔棋两步,可以由一方提出并等待对面同意,合理即可。
PJ2 要求同学们实现两个拓展功能。拓展功能没有硬性要求,同学们可以自由发挥,但注意不要跑偏太远。
拓展功能部分共 15 分。每个拓展功能占 4 分,排名分占 3 分。
助教在评分时,会对每个拓展功能作出 0 - 5 分的评价,获得 4 分及以上,该拓展功能即可获得满分 4 分。
排名分则是同学们需要冲刺的分数,助教会将同学们的三个拓展功能分(5 分制)相加,全班排名前 5 的同学将获得 3 分满分,排名 6 - 20 名的同学将获得 2 分,其余同学获得 1 分。
注:若实现多于 3 个拓展功能,功能部分分数不超过 12 分。
玩家可以将目前的游戏状态存入文件中,并可以通过读取文件来继续之前的游戏。
深度挖掘:读取后的游戏能否支持悔棋?
计时、超时功能可以包括:游戏进行的总时长计时、玩家单步操作思考时长限制、玩家思考总时长限制等,并给予恰当的超时惩罚。
例如:
当点击一个动物时,显示其可以移动的位置。
当己方一个动物处于危险中(比如对方老鼠走到了己方大象旁边)时给予提示。
自由发挥~ 展现你的设计与创意~
注意:纯粹的美工与设计原则上不能取得大于 4 分的成绩,需要有代码上的难度才能取得最高的分数,比如结合代码和美术素材实现动画效果等。
助教给的资源中包括了音效,尝试将其应用到游戏中吧~
注:这个功能比较难深挖,所以取得高分可能有些困难,但拿到4分会比较容易。
Git 的使用远远不止上传 GitHub。在开发过程中,合理使用 Git 进行版本控制,养成良好的开发习惯。
此项适用于参与三叶草项目的同学。
Android版为拓展功能,JavaFX版本的斗兽棋必须实现。
这部分不推荐的原因主要是因为难度过高,同学们容易花太多时间在这些拓展功能上。若完成,该项拓展分给满分。
较难。如果是通过手动输入ip的方式,还稍简单一些。但如果想实现像 doushouqi.net 这样的网络对战功能,难度过高,非常不推荐。
Artificial Intelligence,难度较高,而且网上基本上没有关于如何写斗兽棋 AI 的文章,所以不推荐做这个功能。
不仅难,而且麻烦,不推荐。
学习成本相当高,有时间且技术水平高的同学谨慎尝试。
- 代码风格:10 分
- 面向对象设计:20 分
- 图形化界面:40 分
- 拓展功能:15 分
- 设计文档:7 分
- 用户手册:4 分
- 面试情况:4 分
本次课程项目提交截止时间为 2017 年 1 月 3 日 23:59。
建议同学们在截止时间前一周就将项目基本完成,以防来不及完成,或者来不及修正突然发现的 bug 。
请提交源代码、文档。源代码应以项目的形式提交。如有必要可以提交其他材料。
在截止时间之前将提交材料压缩并上传到:
ftp://10.142.141.33/classes/16/161 程序设计(戴开宇)/WORK_UPLOAD/PJ2
压缩包请重命名为:学号 + 姓名
。 如 16302010001陈雷远.rar
,16302010002李云帆.zip
。
如果发现之前提交的文件有问题,可以重新上传压缩包。ftp不允许删除或者覆盖文件,需要上传一个新的压缩包,命名格式为:学号 + 姓名 + 次数
, 如16302010002李云帆2.zip
。
每迟交一天,最终得分扣除20%。
注:如果提交多次,以面试时选择的提交文件的提交时间为准。评分亦以此文件为准。
本次课程项目面试时间为2016年 1月 4日 10:00 - 18:00,地点为机房。如有调整会提前通知。
原则上面试时不允许现场Debug,请确保你的程序能正常运行。
严禁任何形式的抄袭。
助教将检查每个同学的代码、文档等材料,如有发现抄袭现象,将严肃处理。
抄袭同学零分处理。被抄袭同学将视情况作出惩罚。