栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

学习Java第一个项目-潜艇游戏

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习Java第一个项目-潜艇游戏

潜艇游戏项目设计文档笔记
潜艇游戏第一天:
创建了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()为仅在运行状态下执行

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352163.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号