# 葫芦娃大战妖精
## 使用到的面向对象特性
1. **封装,继承**:
* 封装**人物基类**:`Character`,所有地图上的生物(葫芦娃,老爷爷,蛇精,小喽啰,蝎子精)均(直接/间接)继承自Character。
* 封装**关键人物基类**:`KeyCharacter`,继承自`Character`,表示一个队伍中的**关键人物**,是老爷爷和蛇精的父类。
* 封装**葫芦娃基类**:`Calabash`,七个葫芦娃(`CalabashOne`~`CalabashSeven`)均继承自`Calabash`。
* 封装**队伍基类**(**泛型**):`BasicTeam`,用于统一管理**葫芦娃队伍和敌人队伍**。每支队伍拥有一个**领队者**和**一队士兵**。葫芦娃队伍(`CalabashTeam`)和敌人队伍(`EnemyTeam`)均**实例化**`BasicTeam`。
* 封装**子弹基类**:`Bullet`,寒冰弹(`IceBullet`)继承自`Bullet`
* 封装**纪录类**:`Record`,用于保存需要记录的内容。
* 封装**地图类**:`NMap`,用于提供全局的地图访问。
2. **多态**
* 用`Calabsh`列表统一管理所有的葫芦娃,用`SmallEnemy`列表统一管理所有的小喽啰和蝎子精。在程序中使用`Character`统一管理所有的生物。
* `Character`提供基本`run()`方法,空`selectOneEnemy()`,`attacked()`方法,子类**重写**(**Override**)各自对应的方法,实现不同生物的操作的动态绑定。
## 使用到的Java特性
1. #### 泛型
* <font color=ff0000>队伍基类`BasicTeam`中使用**泛型设计**</font>,领队者继承`KeyCharacter`,士兵继承`Character`。
```java
public class BasicTeam <T1 extends KeyCharacter, T2 extends Character>{
protected T1 keyCharacter; //关键人物,老爷爷或蛇精
protected List<T2> normalTeam; //普通队伍,葫芦娃或小喽啰
}
```
* 葫芦娃队伍`CalabashTeam`和敌人队伍`EnemyTeam`分别**实例化**`BasicTeam`。
```java
public class CalabashTeam extends BasicTeam<GrandFather, Calabash>{} //葫芦娃
public class EnemyTeam extends BasicTeam<Snake, SmallEnemy>{} //敌人
```
2. #### 注解
* **<font color=ff0000>自定义角色属性注解,子弹属性注解</font>**,均作用于类属性上,保留范围是`RUNTIME`。
* **角色属性注解**有`Blood`一个属性,表示人物的初始血量。
* **子弹属性注解**有`attackPower`,`speed`两个属性,表示子弹的攻击力和速度。
* 将**注解和工厂模式一起使用**,统一管理所有的属性。
```java
//子弹属性
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BulletAttributes {
int attackPower() default 2; //攻击力
int speed() default 4; //速度
}
//角色属性
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CharacterAttributes {
int blood() default 5; //血量
}
```
```java
//在队伍工厂TeamFactory中,与之配合:
public class TeamFactory{
@CharacterAttributes
private static int calabashOneAttr; //大娃属性
@CharacterAttributes(blood = 4)
private static int calabashTwoAttr; //二娃属性
......
}
```
* 在单元测试时使用`@Test`,`@BeforeClass`等注解,以及项目中的`@override`注解等。
3. #### I/O流
* <font color=ff0000>读取人物,地图,子弹的图片使用**I/O**流完成。读取队伍位置列表也使用**I/O**流完成。</font>
* 使用`InputStream`将图片资源作为输入流入读。
* 使用`Scanner`从位置列表文件中依次读入整型数。
* **使用了`Java7`后*try-with-resources*的异常处理方式。**
```java
//try-with-resources
try(InputStream is = fileClassLoader.getResourceAsStream(imageProperties.getProperty(name))){
return is == null ? null: new Image(is); //读取文件
}
```
4. #### 序列化
* <font color=ff0000>**记录的保存与读入**使用序列化实现,实现`Serializable`接口。</font>
* 每个记录中保存该帧的葫芦娃队伍,敌人队伍和子弹列表。
* 对于不需要的属性,使用`transient`修饰,不进行序列化。`javafx`中的`Image`无法进行序列化。
```java
public class Record implements Serializable {} //记录,可序列化
//序列化
objectOutputStream.writeObject(record);
objectOutputStream.flush();
//反序列化
Record record = (Record)objectInputStream.readObject();
```
5. #### 类型,自省与加载
* <font color=ff0000>**通过反射读取注解中的内容。**</font>
```java
CharacterAttributes characterAttributes = TeamFactory.class.getDeclaredField(fieldName).getAnnotation(CharacterAttributes.class); //反射读取注解
int blood = characterAttributes.blood();
```
* 通过**类加载器**加载资源文件,作为输入流进行输入。
```java
ClassLoader fileClassLoader = FileUtils.class.getClassLoader(); //加载器
InputStream is = fileClassLoader.getResourceAsStream(path);
```
6. #### 异常
* <font color=ff0000>对于各类异常进行了处理,**打印对应异常栈和特殊输出**,便于调试。</font>
```java
try(InputStream is = fileClassLoader.getResourceAsStream(formationProperties.getProperty(name))){
} catch (IOException e) {
System.out.println(name + "位置文件读取错误");
e.printStackTrace();
}
```
7. #### 并发编程
* **每个人物**为一个线程,其中移动和攻击分别为一个线程。
* **所有子弹列表**单独为一个线程。
* **绘制画面**和**重放画面**分别为一个线程。
* 使用`synchronized`来控制访问,`wait()`和`notifyAll()`来等待和唤醒线程。
8. #### Lambda
* 在`javafx`框架的控件操作实现中,使用`Lambda`表达式代替对象。
* 多线程并发时使用`Lambda`表达式代替`Runnable`对象。
```java
MapCanvas.setOnKeyPressed(event -> {……});
new Thread(() -> {……});
```
9. #### 内部类
* **绘画线程**和**重放线程**为私有内部类,仅能被对应的绘画类访问。
```java
public class ReplayPaint{
……
private class ReplayThread extends Thread{} //内部类
}
```
10. #### 构建与测试
* 使用`maven`构建,并针对关键方法做了**单元测试**,具体见后续。
11. #### GUI编程
* 项目使用`javafx`+`fxml`+`scene builder`进行图形化编程。
## 使用到的设计原则
* #### OCP,开放封闭原则
* 画图抽象出**画图基类**`DrawBase`,每个具体需要绘制的事物(人物/子弹)实现绘图实现类,继承`DrawBase`,这样在有新的需要绘制的人物时只需要从`DrawBase`中派生出一个新的类即可,**不需要改动原来的代码**,遵循了**OCP**原则。
* 人物移动抽象出移动接口`MoveInterface`,四个方向的移动具体实现移动接口,这样在新增加移动方式时,**不用修改原来的代码**,只用增加新的派生类即可,遵循**OCP**原则。
* 结构示意如下:
```java
//基类:DrawBase
public class DrawBase{
void drawPic(Picture picture); //绘制一个图片
public void draw(); //绘制具体的一个对象,用于派生类重写
}
//派生类:葫芦娃队伍
public class DrawCalabashTeam extends DrawBase{
private Cal
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip Java课程作业,葫芦娃小游戏.zipJava课程作业,葫芦娃小游戏.zip
资源推荐
资源详情
资源评论
收起资源包目录
Java课程作业,葫芦娃小游戏.zip (164个子文件)
Game.fxml 2KB
Game.fxml 2KB
Opening.fxml 2KB
Opening.fxml 2KB
Replay.fxml 1KB
Replay.fxml 1KB
Game_2.gif 10.27MB
FileUtils.java 7KB
NMap.java 6KB
Character.java 5KB
TeamFactory.java 5KB
BulletFactory.java 4KB
GameController.java 3KB
GamePaint.java 3KB
BulletList.java 3KB
Record.java 3KB
ReplayPaint.java 2KB
RecordUtils.java 2KB
Calabash.java 2KB
OpeningController.java 2KB
Control.java 2KB
AnnotationTest.java 2KB
CalabashOne.java 2KB
BasicTeam.java 2KB
CalabashFive.java 2KB
CalabashTwo.java 2KB
Bullet.java 2KB
FileUtilsTest.java 1KB
DrawMap.java 1KB
SmallEnemy.java 1KB
Picture.java 1KB
Scorpion.java 1KB
DrawBase.java 1KB
GrandFather.java 1KB
PropertiesTest.java 1KB
Direction.java 1KB
Point.java 1016B
DrawBulletList.java 954B
ConstValues.java 882B
CalabashTeam.java 871B
EnemyTeam.java 834B
Main.java 819B
ReplayController.java 803B
DrawCalabashTeam.java 683B
DrawEnemyTeam.java 625B
KeyCharacter.java 594B
Snake.java 560B
IceBullet.java 488B
DrawPic.java 447B
MoveRight.java 370B
MoveDown.java 369B
MoveLeft.java 369B
MoveUp.java 365B
MoveServer.java 352B
BulletAttributes.java 351B
CharacterAttributes.java 343B
CalabashThree.java 330B
CalabashSeven.java 303B
CalabashFour.java 301B
CalabashSix.java 299B
DrawServer.java 218B
MoveInterface.java 213B
Rank.java 155B
Color.java 136B
Replay.jpg 999KB
Game_1.jpg 979KB
Openning.jpg 476KB
ExtendsRelationUML_1.jpg 181KB
Lose.jpg 168KB
background.jpg 133KB
background.jpg 133KB
start.jpg 93KB
start.jpg 93KB
DIPUML.jpg 73KB
hlw.jpg 72KB
hlw.jpg 72KB
ExtendsRelationUML_3.jpg 71KB
ExtendsRelationUML_2.jpg 63KB
DrawBaseUML.jpg 49KB
MoveInterfaceUML.jpg 31KB
Win.jpg 29KB
Form2.jpg 2KB
Form2.jpg 2KB
Form4.jpg 2KB
Form4.jpg 2KB
Form0.jpg 2KB
Form0.jpg 2KB
Form1.jpg 2KB
Form1.jpg 2KB
yeye.jpg 2KB
yeye.jpg 2KB
Form3.jpg 2KB
Form3.jpg 2KB
Snake.jpg 2KB
Snake.jpg 2KB
5.jpg 2KB
5.jpg 2KB
4.jpg 2KB
4.jpg 2KB
7.jpg 1KB
共 164 条
- 1
- 2
资源评论
土豆片片
- 粉丝: 1555
- 资源: 5641
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功