20162301实验五 数据结构综合应用
北京电子科技学院(BESTI)
实 验 报 告
课程:程序设计与数据结构
班级:1623
姓名:张师瑜
学号:20162301
指导教师:娄嘉鹏老师、王志强老师
实验日期:2017年11月20号
实验密级:非密级
实验时间:五天
必修/选修:必修
实验名称:图的实现与应用
实验仪器:电脑
实验目的与要求:
目的:学会实现无向图及有向图。
要求:
??1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
??2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
??3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
实验要求
0 分析系统架构
1 编译、运行、测试系统
2 修改系统
3 分析数据结构、排序、查找算法的应用
0 分析系统架构
ISprite类是精灵类,其中战斗机类、走直线的精灵类(其中子弹类、敌机类都继承了这个类)、爆炸类都继承精灵类。
战斗机类CombatAircraft:首先确保战斗机完全位于Canvas范围内,每隔7帧发射单发黄色子弹。战斗机如果被击中,执行爆炸效果,具体来说,首先隐藏战斗机,然后创建爆炸效果,爆炸用28帧渲染完成,爆炸效果完全渲染完成后,爆炸效果消失。然后战斗机会进入闪烁模式,战斗机闪烁一定次数后销毁。
走直线的精灵类AutoISprite:走直线的Sprite类,其位置只能直上直下。在y轴方向移动speed像素,检查Sprite是否超出了Canvas的范围,如果超出,则销毁Sprite。
敌机类EnemyPlane:敌机类,从上向下沿直线运动。设置一个敌机的抗打击能力和打一个敌机的得分。敌机在绘制完成后要判断是否被子弹打中,判断方法为判断敌机是否与子弹相交。若敌机已经没有能量了,执行爆炸效果。创建爆炸效果完成后,向GameView中添加得分并销毁敌机。
爆炸类Explosion:爆炸效果类,位置不可变,但是可以显示动态的爆炸效果。爆炸效果由14个片段组成,每个爆炸片段绘制2帧。当绘制完所有的爆炸片段后,销毁爆炸效果。得到绘制完整爆炸效果需要的帧数,即28帧。
1 编译、运行、测试系统
- 从码云上克隆项目
git clone +XXX
,用Android Studio打开项目编译运行。
2 修改系统
- 在主界面增加了带有开发团队bak的按钮,点击后展现出一个新的页面。
- 操作过程为:① 在activity_main.xml中增加一个按钮
<Button
android:id="@+id/btnMe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/btnDev"
android:layout_below="@+id/btnDev"
android:layout_marginTop="21dp"
android:onClick="onClick"
android:text="开发团队bak" />
② 增加activity_zsybak.xml并加入DatePicker来改变原来的界面。
<DatePicker
android:id="@+id/datePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
③ 增加DevActivitybak
public class DevActivitybak extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zsybak);
}
}
④ 在MainActivity中的onClick方法中加入片段
if (viewId == R.id.btnMe){
startMe();
}
public void startMe(){
Intent intent = new Intent(MainActivity.this, DevActivitybak.class);
startActivity(intent);
}
⑤ 最后,在AndroidManifest中加入<activity android:name=".DevActivitybak"></activity>
- 结果如下:
3 分析数据结构、排序、查找算法的应用
我们小组的数据结构为线性结构,主要使用了线性表。例如获取处于活动状态的敌机、存储所有的精灵等。
public List<EnemyPlane> getAliveEnemyPlanes(){ List<EnemyPlane> enemyPlanes = new ArrayList<EnemyPlane>(); for(ISprite s : sprites){ if(!s.isDestroyed() && s instanceof EnemyPlane){ EnemyPlane sprite = (EnemyPlane)s; enemyPlanes.add(sprite); } } return enemyPlanes; }
将所有敌机存储在list中,并进行遍历观察是否与战斗机有交点。若有交点则战斗机死亡。
List<EnemyPlane> enemies = gameView.getAliveEnemyPlanes();
for(EnemyPlane enemyPlane : enemies){
Point p = getCollidePointWithOther(enemyPlane);
if(p != null){
//p为战斗机与敌机的碰撞点,如果p不为null,则表明战斗机被敌机击中
explode(gameView);
break;
}
}
- 未使用排序、查找算法。
感想
- 作为本学期也是一年的java课程以来的最后一次实验,或许也是最后一篇博客,感触颇深。在这次大项目的过程中,作为组长的我虽有很多不足但成长了很多收获了很多。本来以为6个人在一个月的时间内完成一个完整的app是一件不能完成的任务,但到今天看到一个打飞机的游戏呈现在自己面前觉得很欣慰也很感激。甚至说,小组成员们在一次次讨论后,在一起学习代码后让我体会到了战友一般的感觉。将原本生疏无比的Android学习到现在对游戏的整体结构了然于心,真的是深刻的体会了“做中学”的意义。