版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
常州工学院学士学位设计PAGEPAGEPAGE17目录第一部分设计方向…………………3一·设计需求……………3二·课题的相关资料………………4第二部分设计说明…………………8一·设计分析……………8二·设计过程……………9第三部分设计成果…………………12一·界面图片展示………………………12二·界面代码展示………………………13第四部分结束语……………………17一·毕业设计的归纳和总结……………17第五部分致谢…………18第六部分参考文献…………………19
第一部分设计方向一、设计需求1.设计背景:《植物大战僵尸》是一款益智策略类java小游戏,玩家可以通过自己对各种职业的了解来种植植物抵抗僵尸,有效地抵挡并且消灭僵尸。不同的僵尸,不同的玩法,大致的游戏内容就是:游戏玩家通过控制植物,抵御僵尸的进攻,保护主人的屋子。此游戏对玩家的大致考验是需要集中注意力和对各种植物的相互理解及配合,同时玩家也可以在游戏中获得一些生活中所学不到战略思维,及游戏成功时说带来的满足感,给自己的生活增添一丝自信。2.设计界面内容:通过玩家对不同植物的选择,例如向日葵可快速产生阳光,豌豆射手可攻击敌人等等,来操作游戏,后台通过调整时间和参数达到前端界面游戏的可玩性。功能类别子功能前端游戏界面素材收集主界面模式选择进入游戏确定关卡退出游戏内素材收集植物阳光僵尸3.技术要求:前端:Javascript后台:Servlet 开发工具:MyEclipse服务器:Tomcat6.0二、课题的相关资料主界面:玩家通过冒险模式进入游戏,体验游戏所带来的乐趣,达到休闲娱乐的目的。游戏界面:玩家可以通过获得阳光来种植不同的植物来抵抗僵尸的侵袭。1、豌豆射手耐久:300临界点:0攻击:20射程:正前方一整行射击间隔:1.4秒价格:100阳光冷却时间:7.5秒2、向日葵耐久:300临界点:0生产间隔:24秒价格:50阳光冷却时间:7.5秒3、土豆卫士耐久:4000临界点:0价格:50阳光冷却时间:30秒4、寒冰射手耐久:300临界点:0攻击:20射程:正前方一整行射击间隔:1.4秒价格:175阳光冷却时间:7.5秒5.僵尸最普通最常见的僵尸,生命力低,移动速度慢,最多能挨十下豌豆的攻击攻击力100/s速度:约4.7s走完一格(此为僵尸普遍速度)第二部分设计说明一、设计分析1.游戏背景新世纪的来临,面对时代的快速发展,人们在发展的同时,周围的生长环境日益变差,直到有一天,一群奇特的物种被周围的环境所影响,变成一个人们无法接受的事物,他们不断的入侵人类家园,而人们也不断的抵抗着,直到有一天,有人发现这类物种是因为环境污染导致的基因突变,同时也发现它们害怕植物,人们这时才意识到植物和环境的重要性,同时也通过保护自然环境、利用这些自然界的植物生产绿色武器来保卫家园。2.游戏逻辑(1)僵尸是攻击方,为了攻击,防御僵尸,人类通过栽种培植出的各种植物来抵御进攻型僵尸的攻击。植物需要相应的阳光值成长。(2)在作战地点,玩家需要通过种植各种攻击植物来消灭僵尸,也可以通过种防御植物来阻挡僵尸,还需要太阳花来产生种植需要的阳光。3.僵尸作战单位(1)普通僵尸。速度(1帧),血限3,毁掉植物需要3s。四、植物作战单位(1)太阳花。种植需阳光值50,作用:生产种植所需的阳光值,每隔10s生产50点阳光值,不具备攻击力。(2)碗豆射手。种植需阳光值100,作用:5s发射一颗炮弹,战斗值1。(3)寒冰射手。种植需阳光值175,作用:5s发射一颗炮弹,战斗值1.(4)土豆卫士。种植需阳光值50,作用:抵挡各种僵尸3s,主要用来防御,没有任何战斗力。等共5种可供选择种植的植物。关卡简介:所有的僵尸都会参与攻击,所有的植物也都会参与作战,每次只能选取5种植物参与作战。5碰撞逻辑说明僵尸会在屏幕的右边生成,然后缓慢向左边屏幕移动,如果在僵尸移动的线路上有攻击型植物,则发射炮弹。当种植的植物或炮弹与僵尸接触,即当他们的坐标相同的时候,即为接触,接触大小的区域就是图片的大小区域。当炮弹与僵尸碰撞之后,炮弹也就会立即消失,同时僵尸生命值的也随之减少一点。若炮弹未击中任何僵尸,越出屏幕后也将消失。二、设计过程1:首先了解植物大战僵尸含有哪些元素,有阳光,有僵尸,有能种植植物的草坪,有植物。有子弹。我们这里只是进行设计简单的实现游戏,植物有单发射手,寒冰射手,樱桃炸弹。僵尸只有普通僵尸。2:先设计最简单的阳光类Sun.java,阳光会从天空掉落和植物生成,从天空掉落的阳光会进行掉落运动,植物生成的阳光是禁止不动的,所以阳光有一个isStatic是否静止不动的布尔型标识,然后阳光在不是禁止不动的时候y坐标要增加就是下落,然后停止。所以在构造函数中随机一个目标y值,阳光非禁止不动状态下y坐标不断增加,当到达目标y值时候就把状态更改为禁止不动,其次阳光有一个消失标识,采用Vector动态数组存储阳光对象,绘制时候绘制该动态数组的所有阳光对象,如果该阳光的消亡标识为真就把该阳光从容器里面进行移除,阳光的消亡标识有两种情况下变成真,一是用户点击,二是到了一定时间消亡标识为真,所以阳光有一个计数器变量count,然后不断的自加,当到达阳光的消亡时间就让消亡标识为真,其次是用户点击了阳光,判断用户点到了阳光可以使用java中的Rect对象的contains方法判断点在矩形范围内,用户点击屏幕触摸坐标在阳光的矩形范围就让消亡标识为真。绘制的时候阳光要不断旋转,声明一个角度变量angle不断自加然后以阳光的中心点为旋转中心旋转阳光即可。3:接着我们设计一个草坪类Grass.java,草坪类的作用是用来种植植物,总共有5x9块草坪,横9竖5总共45块草坪,草坪的属性相对较于简单,就有一个是否可种植植物的布尔型标识,有植物在这块草坪上就不能进行植物种植了,所以声明一个5x9的二维草坪数组,然后把草坪坐标宽高传进去,其次草坪要有一个编号用来传递给植物用于植物铲除索引出该草坪改变它的是否可种植植物标识,草坪的编号对应0到44,草坪的绘制方法用草坪的编号值%2除以2的余数如果是0就绘制蓝色草坪否则绘制绿色草坪,这里我就是直接绘制一个矩形,然后在View的绘制函数中for循环绘制所有草坪这样我们就可以看到蓝绿相间的草坪了,当然草坪的方法还没写先写好其他类再接着写。4:设计好了草坪我们设计一个僵尸类Jiangshi.java,僵尸有一个整形变量type代表僵尸的类型,0代表普通僵尸,其次僵尸有一个整形变量hp代表僵尸的血量,然后有一个isMove布尔型标识表示僵尸是否可移动,僵尸在碰到植物的时候让僵尸停止移动即正在吃食物,僵尸与植物的碰撞检测可用矩形碰撞检测,java的Rect对象有一个intersect方法用来判断两个矩形是否交合用于矩形碰撞检测。僵尸的移动就是x坐标减去一个速度值即可即向左边移动,依旧使用一个Vector容器来进行存储僵尸,如果僵尸血量为0就从该容器移除僵尸,创建僵尸的时候可以使用一个固定二维数组,这是一个二维数组,第一维长度为10代表10波僵尸第二维表示要创建的僵尸,0表示普通僵尸,当到达一定的时间就循环该波数的数组长度创建僵尸,然后波数值增加,比如这里第一波是一个普通僵尸,第二波是两个普通僵尸,虽然僵尸数据是固定的,但是对僵尸出现的位置也要进行一下随机。5:然后设计子弹类Zidan.java,子弹依旧有一个整型变量type表示子弹的类型,0表示普通子弹,跟僵尸一样采用Vector存储子弹对象,依旧有一个是否消失的标识,当子弹碰撞到僵尸后或者子弹的x坐标大于屏幕右边就让消失标识为真从容器里面移除子弹,子弹的移动就是x坐标增加一个速度往右边移动。子弹同僵尸一样有一个列属性表示该子弹在哪一列,所以子弹与僵尸的列属性相等的碰撞才视为有效碰撞,碰撞以后取出该子弹类型不同的类型对僵尸造成不同的伤害。6:设计道具类Daoju.java,道具依旧有一个整形变量type表示道具的类型,0代表铁铲,1代表向日葵,2代表单发豌豆射手,3代表寒冰射手,道具有一个isSelect是否被选中的布尔型属性,如果被选中就在该区间绘制一个红色的边框,除此道具有一个布尔型变量是否冷却状态,表示该道具是否在冷却中,如果在冷却中该道具不可使用,另外还需有一个计时器count,如果在冷却状态不断自加,当达到了该道具的冷却时间以后把该道具的冷却状态改为假。如果为冷却状态就绘制一个半透明灰色矩形以count作为进度值绘制在道具上面。用一个整形变量表示使用该道具所要消耗的阳光,不同的道具消耗不同的阳光值。依旧使用一个Vector容器来存储道具对象。7:设计植物类Zhiwu.java,植物也有一个类型type,如果为0代表向日葵,1代表单发豌豆射手,2代表寒冰射手,也使用一个Vector存储植物对象,植物也有一个hp表示植物的血量,不同类型的植物有不同的血量,植物有一个编号标识表示是在哪块草坪上,当植物hp为0或者铲除植物时候从Vector进行移除该植物,并获取该植物编号所对应的草坪设置可种植状态为真,植物的逻辑处理在不同类型处理不同的逻辑,在阳光状态每隔一定时间从阳光容器里面进行添加阳光对象,如果是单发子弹就从子弹容器添加一个子弹对象,如果是双发射手就添加两个子弹对象,可以发子弹的植物需要封装一个是否可发射子弹的方法,每次都让可发射子弹的标识为假,当有僵尸出现在植物的攻击范围就是矩形碰撞检测就让发射子弹标识为真,如果为真才从容器添加子弹。
第三部分设计成果一、界面图片展示二、界面部分代码展示publicclassController{ privateWinwin; privateGridgrid; privateIndexWinindexwin; privateintx; privateinty; privateintlength=28; privateStringplantType="00111"; privateTimertimer; privateintsunValue; privateintcorpseNum; privatebooleanuproot=false;//断定能够挖除植物0可以挖除 privateintoperation=0;//0添加植物1铲除植物 privateMoneyEnoughThreadmoneyEnoughThread; privateMap<Integer,String>carRunList=newHashMap<Integer,String>(); privateMap<Integer,String>bulletList=newHashMap<Integer,String>(); privateSunAutoProduceThreadsunAutoProduceThread; privateMap<Integer,Plant>plantList=newHashMap<Integer,Plant>(); privateMap<Integer,CarThread>carList=newHashMap<Integer,CarThread>(); privateMap<String,CorpseMoveThread>corpseList=newHashMap<String,CorpseMoveThread>(); privateMap<Integer,ProduceBullet>produceBulletTimer=newHashMap<Integer,ProduceBullet>(); publicController(){ indexwin=newIndexWin(this); } publicvoidstart(){ SunAdd.stop=false; this.x=15; this.y=80; grid=newGrid(this.x,this.y); sunValue=50; win=Win.getWin(this); timer=newTimer(this); //grid.start(); indexwin.setVisible(false); sunAutoProduceThread=newSunAutoProduceThread(this); moneyEnoughThread=newMoneyEnoughThread(this); win.toShow(); putSunValue(0); timer.start(); sunAutoProduceThread.start(); moneyEnoughThread.start(); grid.getBoard()[1][0]="31111"; grid.getBoard()[4][0]="31111"; grid.getBoard()[7][0]="31111"; grid.getBoard()[10][0]="31111"; grid.getBoard()[13][0]="31111"; corpseNum=grid.getNum(); } publicvoidnewCorpseThread(){ for(inti=0;i<grid.getBoard().length;i++){ if("11,12,13,14".contains(grid.getBoard()[i][length-1].substring(0,2))&& corpseList.get(grid.getBoard()[i][length-1])==null){ corpseList.put(grid.getBoard()[i][length-1],newCorpseMoveThread(this,i,length-1)); corpseList.get(grid.getBoard()[i][length-1]).start(); } } } publicintmoveBullet(intx,inty){ if(y+1==length-1&&grid.getBoard()[x][y].equals("21bullet")){ grid.getBoard()[x][y]="00111"; return-1; } if("11,12,13,14".contains(grid.getBoard()[x][y].substring(0,2))){ return-1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& ("01,02,03,04,05".contains(grid.getBoard()[x][y+1].substring(0,2)))){ bulletList.put(100*x+y+1,"21bullet"); grid.getBoard()[x][y]="00111"; returny+1; } if(y+1!=length-1&&("01,02,03,04,05".contains(grid.getBoard()[x][y].substring(0,2)))&& ("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))&&bulletList.get(100*x+y)!=null){ if(isHit(grid.getBoard()[x][y+1])){ grid.getBoard()[x][y+1]="00111"; return-1; } bulletList.remove(100*x+y); returny+1; } if(y+1!=length-1&&("01,02,03,04,05".contains(grid.getBoard()[x][y].substring(0,2)))&& !("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))&&bulletList.get(100*x+y)!=null){ grid.getBoard()[x][y+1]=bulletList.get(100*x+y); bulletList.remove(100*x+y); returny+1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& !("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))){ grid.getBoard()[x][y+1]=grid.getBoard()[x][y]; grid.getBoard()[x][y]="00111"; returny+1; } if(y+1!=length-1&&grid.getBoard()[x][y].equals("21bullet")&& ("11,12,13,14".contains(grid.getBoard()[x][y+1].substring(0,2)))){ if(isHit(grid.getBoard()[x][y+1])){ grid.getBoard()[x][y+1]="00111"; return-1; } grid.getBoard()[x][y]="00111"; returny+1; } return-1; } publicintmoveCorpse(intx,inty){ if(y==0&&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ fail(); return-1; } if(y-1!=-1 &&!("01,02,03,04,05".contains(grid.getBoard()[x][y-1].substring(0,2))) &&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ grid.getBoard()[x][y-1]=grid.getBoard()[x][y]; grid.getBoard()[x][y]="00111"; returny-1; } if(y-1!=-1 &&("01,02,03,04,05".contains(grid.getBoard()[x][y-1].substring(0,2))) &&("11,12,13,14,15".contains(grid.getBoard()[x][y].substring(0,2)))){ plantList.get(x*100+y-1).setHp(plantList.get(x*100+y-1).getHp()-1); if(plantList.get(x*100+y-1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 26年急性白血病靶点检测用药适配
- 胃癌化疗期间护理技巧
- 面部护理的注意事项
- 2026 男性塑型维持期饮食课件
- 2026 增肌期酸奶选择搭配课件
- 脊髓损伤患者的康复护理社会支持与资源利用
- 高效护理时间管理策略
- 2024-2025学年广东香山中学、高要一中、广信中学高一下学期第一次质量检测政治试题含答案
- 胎盘早剥的伦理护理问题
- 2026 塑型进阶鸡枞菌课件
- 四议两公开培训会
- 血脂知识科普课件
- 肺部磁共振成像在肺疾病诊断中的价值
- 初中八年级数学课件-一次函数的图象与性质【全国一等奖】
- 《石墨类负极材料检测方法 第1部分:石墨化度的测定》
- 贵州艺辰纸业有限责任公司年产15万吨化学机械木浆的林纸一体化生产线及配套的纸板生产线(一期)环评报告
- 鳞翅目检疫性害虫课件
- 硬笔书法 撇和捺的写法课件
- JJG 444-2023标准轨道衡
- GB/T 15530.6-2008铜管折边和铜合金对焊环松套钢法兰
- GRR培训-完整版课件
评论
0/150
提交评论