Skip to content

Latest commit

 

History

History
242 lines (139 loc) · 10.1 KB

README.md

File metadata and controls

242 lines (139 loc) · 10.1 KB

Project 2: 斗兽棋

项目目标

在 Project 1 中,同学们实现了一个命令行界面的斗兽棋小游戏。Project 2 延续 Project1 的内容,通过 GUI 扩展和部分进阶功能,使我们这个游戏更具娱乐性和可玩性。

我们将 Project2 中需要实现的内容分为逻辑和界面。在 Project 1 中,同学们基本上已经完成了大部分的逻辑操作,这次只需要对一部分原来没有实现和对未完善的部分进行完善,着重重构代码和使用面向对象设计的部分。图形化界面推荐大家仿造 野兽争霸斗兽棋 中的单机对战部分,其素材在 audiopic 文件夹中给出。大家也可以自由发挥,打造属于你自己的斗兽棋,只要展示清晰、明了即可。

基本要求

重构代码

大部分同学的 PJ1 代码可以通过重构来提高代码质量。

PJ2 对代码风格有以下三点具体要求:

  1. 单个方法的长度不应超过 300 行(如有特殊情况可向助教提出)。
  2. 方法名和变量名命名得当。
  3. 方法和类的作用与意义清晰明确。
  4. 逻辑和界面分开设计,不要把他们混着写在一个很大的类里

面向对象设计

使用面向对象的思想来设计代码结构是 PJ2 的重点要求。在同学们动手写 PJ2 代码之前,助教建议同学们根据所学知识,设计好 PJ2 基础功能的每个类。

推荐同学们将自己设计的 逻辑部分 中每个类以文档的方式记录下来。内容包括:

  1. 类名、类的意义和作用。
  2. 类的父类、子类和接口,以及这么设计的理由。(如果有)
  3. 类的构造函数、可见域和可见方法以及它们的作用。(最主要的一点,体现封装的概念)
  4. 类的私有域及其作用。(可以只列出关键的几个)
  5. 类的私有方法。(不一定需要)
  6. 其他有必要提及的内容,比如和其他某个类之间的联系。

第三次视频 中的 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.pngMap2.pngMap3.png。同学们根据自己的界面需要选取其中一张,或在其基础上修改,或自己设计一张。

动物图片

动物图片在 pic 目录下的 animals 目录下,并分为左右两侧。相比我们参考的 Flash 版本,助教没有提供动物图片的“红色”版本,同学们可以自由发挥如何标识动物是否处于可以操作的状态(不标识也可以,但要在明确显示现在轮到哪一方移动)。

动物移动

动物移动使用鼠标控制,与参考程序相同,点击一个动物,再点击移动至某个地块。此处请注意合法性判断。

如果有同学想对动物移动的操作方法进行改变,请联系助教。请不要通过键盘输入 1w4d 等字符串来进行移动,会被扣分。

基础功能中,不要求点击动物后显示其可以移动的地块,这个功能作为拓展功能的可选项。

帮助、重新开始、退出功能

这三个功能要求实现,具体实现方式由同学们自己定义,合理即可。

同学们可以创建菜单栏,将这些功能放入菜单中,也可以设置几个按钮,放在合适的地方。

游戏胜利

胜利条件判断与 PJ1 相同。

胜利提示或胜利界面由同学们自己定义,合理即可。

悔棋、取消悔棋

考虑到游戏的正常逻辑,取消悔棋功能可以不在图形化界面中提供,但悔棋功能必须实现。

悔棋功能不再要求只能悔棋一步,同学们可以按照自己对游戏悔棋功能的理解提供悔棋功能。可以悔棋一步,可以悔棋两步,可以由一方提出并等待对面同意,合理即可。

拓展功能

PJ2 要求同学们实现两个拓展功能。拓展功能没有硬性要求,同学们可以自由发挥,但注意不要跑偏太远。

拓展功能部分共 15 分。每个拓展功能占 4 分,排名分占 3 分。

助教在评分时,会对每个拓展功能作出 0 - 5 分的评价,获得 4 分及以上,该拓展功能即可获得满分 4 分。

排名分则是同学们需要冲刺的分数,助教会将同学们的三个拓展功能分(5 分制)相加,全班排名前 5 的同学将获得 3 分满分,排名 6 - 20 名的同学将获得 2 分,其余同学获得 1 分。

注:若实现多于 3 个拓展功能,功能部分分数不超过 12 分。

推荐的拓展功能

存档、读档功能

玩家可以将目前的游戏状态存入文件中,并可以通过读取文件来继续之前的游戏。

深度挖掘:读取后的游戏能否支持悔棋?

计时、超时功能

计时、超时功能可以包括:游戏进行的总时长计时、玩家单步操作思考时长限制、玩家思考总时长限制等,并给予恰当的超时惩罚。

智能提示

例如:

当点击一个动物时,显示其可以移动的位置。

当己方一个动物处于危险中(比如对方老鼠走到了己方大象旁边)时给予提示。

好看的界面

自由发挥~ 展现你的设计与创意~

注意:纯粹的美工与设计原则上不能取得大于 4 分的成绩,需要有代码上的难度才能取得最高的分数,比如结合代码和美术素材实现动画效果等。

音效

助教给的资源中包括了音效,尝试将其应用到游戏中吧~

注:这个功能比较难深挖,所以取得高分可能有些困难,但拿到4分会比较容易。

科学的Git使用

Git 的使用远远不止上传 GitHub。在开发过程中,合理使用 Git 进行版本控制,养成良好的开发习惯。

Android版斗兽棋

此项适用于参与三叶草项目的同学。

Android版为拓展功能,JavaFX版本的斗兽棋必须实现。

不推荐的拓展功能

这部分不推荐的原因主要是因为难度过高,同学们容易花太多时间在这些拓展功能上。若完成,该项拓展分给满分。

网络对战功能

较难。如果是通过手动输入ip的方式,还稍简单一些。但如果想实现像 doushouqi.net 这样的网络对战功能,难度过高,非常不推荐。

AI 功能

Artificial Intelligence,难度较高,而且网上基本上没有关于如何写斗兽棋 AI 的文章,所以不推荐做这个功能。

3D 界面

不仅难,而且麻烦,不推荐。

使用游戏引擎

学习成本相当高,有时间且技术水平高的同学谨慎尝试。

评分标准

  1. 代码风格:10 分
  2. 面向对象设计:20 分
  3. 图形化界面:40 分
  4. 拓展功能:15 分
  5. 设计文档:7 分
  6. 用户手册:4 分
  7. 面试情况:4 分

提交与面试

提交截止时间

本次课程项目提交截止时间为 2017 年 1 月 3 日 23:59

建议同学们在截止时间前一周就将项目基本完成,以防来不及完成,或者来不及修正突然发现的 bug 。

提交方式

请提交源代码、文档。源代码应以项目的形式提交。如有必要可以提交其他材料。

在截止时间之前将提交材料压缩并上传到:

ftp://10.142.141.33/classes/16/161 程序设计(戴开宇)/WORK_UPLOAD/PJ2

压缩包请重命名为:学号 + 姓名。 如 16302010001陈雷远.rar16302010002李云帆.zip

如果发现之前提交的文件有问题,可以重新上传压缩包。ftp不允许删除或者覆盖文件,需要上传一个新的压缩包,命名格式为:学号 + 姓名 + 次数, 如16302010002李云帆2.zip

迟交惩罚

每迟交一天,最终得分扣除20%。

注:如果提交多次,以面试时选择的提交文件的提交时间为准。评分亦以此文件为准。

面试注意事项

本次课程项目面试时间为2016年 1月 4日 10:00 - 18:00,地点为机房。如有调整会提前通知。

原则上面试时不允许现场Debug,请确保你的程序能正常运行。

抄袭惩罚

严禁任何形式的抄袭。

助教将检查每个同学的代码、文档等材料,如有发现抄袭现象,将严肃处理。

抄袭同学零分处理。被抄袭同学将视情况作出惩罚。