潜艇游戏项目设计文档笔记
潜艇游戏第一天:
创建了7个类,创建World类并测试
潜艇游戏第二天:
给7个类添加构造方法,并测试
潜艇游戏第三天:
设计侦察潜艇数组、水雷潜艇数组、鱼雷潜艇数组、深水炸弹数组、鱼雷数组、水雷数组数组,并测试
设计SeaObject超类,7个类继承超类
给SeaObject添加两个构造方法,7个类分别调用
潜艇游戏第四天:
将侦察潜艇、鱼雷潜艇、水雷潜艇数组统一组合为SeaObject潜艇数组,并测试
将鱼雷、水雷数组统一组合为SeaObject雷数组,并测试
在7个类中重写step()移动方法
画窗口:----------在World类中
import Jframe+JPanel
设置World类继承JPanel--------------非常容易忘记
main中代码Ctrl C+V
潜艇游戏第五天:
给类中成员添加访问控制修饰符
设计Images图片类
潜艇游戏第六天:
设计窗口的宽和高为常量,适当地方做修改
画海洋图、7个对象:
1)想画对象需要去获取对象的图片,每个对象都能获取图片,
意味着获取图片行为为共有的行为,所以设计在SeaObject超类中,
每个对象获取图片的行为都是不一样的,所以设计为抽象方法
----在SeaObject中设计抽象方法getImage()获取对象的图片
2)7个类中重写getImage()获取对象的图片
----返回对应对象的图片即可
3)画对象时需要去判断对象的状态,因为只有活着的时候才会画对象,
每个对象都有状态,意味着状态为共有的属性,所以设计在SeaObject超类中,
状态一般都设计为常量,同时设计state变量表示当前状态
----在SeaObject中设计LIVE、DEAD状态常量,state变量表示当前状态
状态有了,还需要判断状态,每个对象都能状态判断,
意味着判断状态行为为共有行为,所以设计在SeaObject超类中,
每个对象判断状态的行为都是一样的,所以设计为普通方法
----在SeaObject中设计isLive()、isDead()判断状态
4)对象的图片、x坐标、y坐标都有了,就可以开画了,每个对象都能画图片,
意味着画图片行为为共有的行为,所以设计在SeaObject超类中,
每个对象画图片的行为都是一样的,所以设计为普通方法
----在SeaObject中设计paintImage()画图片
5)画图片的行为做好之后,在World类中调用即可:
----给对象数组填充数据
----重写paint()方法:画海洋图、画对象
潜艇游戏第七天:
潜艇入场:
潜艇是由窗口产生的,所以在World类中设计nextSubmarine()生成潜艇对象
潜艇入场为定时发生的,所以在run中调用submarineEnterAction()实现潜艇入场
在submarineEnterAction()中:
每400毫秒,获取潜艇对象obj,submarines扩容,将obj添加到submarines最后一个元素上
注意:在调用submarineEnterAction()后必须调用repaint()方法来重画
雷入场:
雷是由潜艇发射出来的,所以在SeaObject中设计shootThunder()实现生成雷对象
雷入场为定时发生的,所以在run中调用thunderEnterAction()实现雷入场
在thunderEnterAction()中:
每1秒,遍历潜艇数组得潜艇,让潜艇发雷obj,thunders扩容,将obj添加到thunders最后一个元素上
对象移动:
移动为对象所共有的行为,所以在SeaObject中设计抽象方法step()移动,在7个派生类中重写step()
对象移动为定时发生的,所以在run中调用stepAction()实现对象移动
在stepAction()中:
遍历潜艇数组潜艇动,遍历雷数组雷动,遍历深水炸弹数组深水炸弹动
潜艇游戏第八天:
深水炸弹入场:
深水炸弹是由战舰发射出来的,所以在Battleship中设计shootBomb()生成深水炸弹
深水炸弹入场为事件触发的,所以在侦听器中重写keyPressed()键盘按下事件:
在keyPressed()中:
判断若按下的为空格键,则调用bombEnterAction()实现深水炸弹入场 在bombEnterAction()中: 获取深水炸弹对象obj,bombs扩容,将obj添加到bombs最后一个元素上
战舰移动:
战舰移动为战舰的行为,所以在Battleship中设计moveLeft()左移、moveRight()右移
战舰移动为事件触发的,所以在侦听器的keyPressed()中:
判断若按下的为左键头,则调用moveLeft()实现战舰左移 判断若按下的为右键头,则调用moveRight()实现战舰右移
删除越界的对象:
在SeaObject中设计isOutOfBounds()检测潜艇是否越界
Bomb中重写isOutOfBounds()检测深水炸弹是否越界
Torpedo和Mine中重写isOutOfBounds()检测鱼雷和水雷是否越界
删除越界对象为定时发生的,所以在run中调用outOfBoundsAction()删除越界对象
在outOfBoundsAction()中:
遍历所有潜艇,判断若潜艇越界了,则将越界潜艇替换为最后一个元素,缩容 遍历所有雷,判断若雷越界了,则将越界雷换为最后一个元素,缩容 遍历所有深水炸弹,判断若深水炸弹越界了,则将越界深水炸弹替换为最后一个元素,缩容
设计EnemyScore得分接口,ObserveSubmarine和TorpedoSubmarine实现得分接口
设计EnemyAward奖励接口,MineSubmarine实现奖励接口
潜艇游戏第九天:
深水炸弹与潜艇的碰撞:
在SeaObject中设计isHit()检测深水炸弹与潜艇的碰撞、goDead()对象去死
在Battleship中设计addLife()增命
深水炸弹与潜艇的碰撞是定时发生的,所以在run中调用bombBangAction()实现深水炸弹与潜艇的碰撞
在bombBangAction()中:
遍历深水炸弹得炸弹,遍历潜艇得潜艇,判断若都活着并且还撞上了: 深水炸弹去死、潜艇去死 若被撞潜艇能得分,则强转为EnemyScore接口,玩家得分 若被撞潜艇能得奖励,则强转为EnemyAward接口,获取命数,战舰得奖励
画分和画命:
在Battleship中设计getLife()获取命数
在paint()中:画分、画命
潜艇游戏第十天:
雷与战舰的碰撞:
在Battleship中设计subtractLife()减命
雷与战舰的碰撞为定时发生的,所以在run()中设计thunderBangAction()实现雷与战舰的碰撞
在thunderBangAction()中:
遍历所有雷得到每个雷,判断若都活着并且还撞上了: 雷去死、战舰减命
检测游戏结束:
借用Battleship的getLife()获取命数
检测游戏结束为定时发生的,所以在run()中调用checkGameOverAction()实现检测游戏结束
在checkGameOverAction()中:
判断若战舰的命数<=0,表示游戏结束了,则修改当前状态为GAME_OVER游戏结束状态
画状态:
在World类中设计START、RUNNING、GAME_OVER状态常量,state变量表示当前状态
在Images中设计start、gameover状态图片,在静态块中赋值
在paint()中:设计为在不同的状态下画不同的图片
在按下空格键后,根据当前的状态做不同的处理
启动状态时变为运行状态,运行状态时发射深水炸弹,游戏结束状态时先清理现场再变启动状态
设计那一堆action()为仅在运行状态下执行



