Java程序设计第二阶段总结
前言:
再次经过几周的学习,我们熟练掌握了继承与多态、抽象类与接口、几个知识点
下面我们通过分析题目的方式来看看我们的学习成果吧。
点击链接查看近期PTA题目总结
https://blog.csdn.net/qq_62792553/category_11715436.html
目录:
农夫过河版本3
题目描述:
(1) 为之前的类添加合适的父类。
(2) 为父类添加适合的属性和方法。并以此为基础修改原有的类,使之与添加的类构成继承关系。
(3) 使用多态改进整个代码,提高代码的复用性。
(4) 修改程序代码,在游戏中增加胡萝卜、兔子两个角色,过河的规则改为一次可以带两样东西过河。
(5) 修改系统功能,运行程序后,用户可以选择玩新规则(五个角色、一次两样东西带过河)或者老规则(三个角色、一次一样东西带过河)的游戏。
这一次的农夫过河问题目的是让我们学会使用继承和多态
可以先将实体类进行分类,然后根据分类来做他们共同的父类
例如,狼、羊、菜可以分一类,因为他们都有吃或被吃的能力
人单独分一类,因为人是管理其他实体的
其次是使用多态,找到类之间的共同点,比如都有是否过河这个状态
是否存活这个状态,把这些共同点写到父类中。
然后是增加胡罗卜兔子两个角色。
这一步是建立在之前写的代码具有比较强的扩展性下才能实现的。
通过继承,类比羊和白菜写出的代码差不多。
然后就是二代系统,二代系统可以继承一代系统,然后在一代系统的基础上增加东西,达到二代游戏的目的

可以看到,狼、羊、白菜、兔子、胡罗卜都继承于Things这个父类。
父类中的几个判断方法,和几个属性,非常符合本题的类设计,都是几个子类共有的元素
然后是操作系统和显示系统,根据题目要求,要有两个版本的游戏,而第二代游戏只是在原有基础上增加内容,
所以第二代游戏的MVC中的VC【操作系统和显示系统】可以完全继承于第一代的。
例如GameGUI2继承于GameGui,然后新增menu2函数,通过menu2函数达到新增功能的目的。
继承与多态知识点在这个题目中得到了充分的使用
几个子类对于大类的继承,第二代系统对于第一代的继承,
几个子类对于同一操作的多态。
在此我们在次感受到了Java的特别之处。


农夫过河版本4
1、 以如下类图为基础,重构实验二中农夫过河游戏的代码。相关类说明如下:
抽象类:
MaterialObject:抽象物品类
AbstracTransport:抽象交通工具类
(place:所在地;capacity:容量;goodes:货物列表)
moveTo(String destination)移动到目的地
AbstractRule:抽象规则类
judge()根据规则判断结果
AbstractGame:抽象游戏类
(gameOverRule:游戏结束规则; gameSuccessRule:游戏输赢规则; gameData:游戏数据)
play()执行游戏
Animal:动物类
addedToRecipe(MaterialObject m)添加某物品进该动物的食谱
isFood(MaterialObject m)判断某物品是否在它的食谱中
canBeEat(MaterialObject m)判断某物品能不能被吃到
eat(MaterialObject m)吃某样食物
Person:人类
Plante:植物类
Boat:船类
crossRiver()过河
crossRiver(Person person)将人运载过河
crossRiver(Person person,MaterialObject m)将人和某样物品运载过河
board(MaterialObject m)物品m上船
crossRiver(MaterialObject m)物品m下船
CrossRiverRule:判断是否都渡过河的规则类
hasCross(MaterialObject m)物品m是否渡过了河
ObjectExistRule:判断物品是否都还存在的规则类
GameOverRule:判断游戏是否结束的规则类
GameSuccessRule:判断游戏输赢的规则类
GameUI:游戏界面类
参考类图

2、 在实验4-1的基础上新增一个高兴Happy和哭泣Cry接口,农夫、狼、羊实现Happy接口,农夫在成功渡河、狼在吃羊、羊吃白菜的时候执行高兴接口方法,通过控制台输出不同的内容(内容可自定义,但三观要正)。羊、白菜实现Cry接口,当羊和白菜被吃的时候会用自己的方式哭泣并在控制台输出。
怎么嗦呢,这个题给了我们极大的自由,这种自由既是好也是坏,
好处是,再也不用使用之前题目给的那个奇怪代码了,坏处是,接下来的所有代码都得我们手敲TAT
首先我们先看类图,好。看第一眼。。。。。
**,好大的类图,非常复杂。
不急,我们一级一级看,首先找到最顶端的,找到掌控所有类的类
不难看出Game类是所有类的总和【可恶,他究竟是怎么看出来的】
所有箭头的起点都是Game这个类。
我们把Game作为顶点,一级一级往下看

可以看到Game继承于AbstractGame,那么我们就要在Game里完成游戏的构建
然后关联了GameGui类,可能就是Game调用了Gui来显示。
再开看抽象游戏类

这个类关联了GameData与AbstractRule类,作为自己的私有属性
那么可以推断这个类里是做了规则与数据的总和
play方法应该是个抽象的
然后是这个具有美感的五角星阵。。。。

非常滴复杂,仔细来看,是几个Rule都是AbstractRule类的子类,父类中有一个judge的方法
子类中什么都没有,看来judge是个抽象方法,子类来实现这个方法
然后是下面几条蓝色的关联线。
给自己三秒看懂他
-1-
-2-
-3-
答案揭晓,GameOver类与GameSuccess类用过调用ObjectExist类与CrossRiver类来判断是否游戏结束,是否胜利。
怎么样,第一眼看的时候是不是很蒙。
然后就是几个实体类,没有难度啦。
这个题主要考察的是看懂类图的能力。
看懂了类图,写代码就十分简单啦。
测试数据
person sheep pass sheep pass

测试数据3
person sheep pass person pass person plant pass sheep person pass wolf person sheep pass

浙公网安备 33010602011771号