大学课程设计飞机大战_第1页
大学课程设计飞机大战_第2页
大学课程设计飞机大战_第3页
大学课程设计飞机大战_第4页
大学课程设计飞机大战_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大学课程设计飞机大战湖北大学本科课程设计题目Java课程设计——飞机大战姓名学号专业年级指导教师职称12月18日----目录----项目介绍--------------------------------1概要设计2.1资源需求------------------------------1 2.2游戏流程------------------------------1类设计3.1游戏界面类----------------------------23.2飞行物类------------------------------23.3敌机类--------------------------------23.4蜜蜂类--------------------------------33.5玩家飞机类-----------------------------33.6子弹类--------------------------------4编码分析4.1游戏界面类----------------------------44.2飞行物类------------------------------114.3敌机类--------------------------------124.4蜜蜂类--------------------------------134.5玩家飞机类-----------------------------134.6子弹类--------------------------------15游戏测试画面-----------------------------16总结------------------------------------18一.项目介绍针对Java课程设计,我做了一个小游戏——飞机大战,游戏代码包含到本学期所学全部知识点。程序运行后,进入到开始画面,鼠标单击开始游戏。敌机自上向下移动,随机出现,玩家机随鼠标移动并发射子弹,消亡敌机能够取得分数,随机出现小蜜蜂,消亡后可取得奖励。二.概要设计2.1资源需求此游戏需要导入图片:背景图片,开始界面,玩家飞机,敌机,小蜜蜂,子弹,暂停界面,结束界面。显示标题界面2.2游戏流程显示标题界面单击鼠标游戏主界面游戏主界面暂停界面鼠标移出暂停界面单击鼠标游戏结束玩家死亡游戏结束三.程序结构游戏界面:ShootGameextendsJPanelstatic块:导入图片main():创建窗口重写paint():画图action():鼠标事件TimerTask重写run():游戏运行活动飞行物类:abstractFlyingObject属性:x,y坐标,image,图片长宽move():飞行物移动outOfbound():飞行物出界shootBy():子弹击中飞行物敌机类:AirplaneextendsFlyingObjectIntspeed:移动速度重写move()重写outOfBound()getScore():击中敌机后得分Airplane():初始化敌机蜜蜂类:BeeextendsFlyingObjectIntxSpeed,ySpeed:移动速度 IntawardType:奖励类型(双倍活力或加命)Bee():初始化蜜蜂重写move()重写outOfBound()getType():获取奖励类型玩家飞机类:PlayerextendsFlyingObjectIntlife,doubleFire:生命,双倍火力Player():初始化玩家重写move():换图片,形成飞机动态效果重写outOfBound()shoot():生成子弹moveTo():玩家机移动isHit():玩家碰撞到飞行物setDoubleFire():设置双倍火力addDoubleFire():奖励双倍火力addLife():奖励生命deleteLife():减命getLife():获取生命数子弹类:BulletextendsFlyingObjectIntspeed:移动速度Bullet():初始化子弹重写move()重写outOfBound()四.编码分析ShootGame类这类继承JPanel类构建游戏窗口并控制游戏运行类组员变量:publicstaticfinalintWIDTH=400;//窗口宽publicstaticfinalintHEIGHT=600;//窗口高//图片属性publicstaticBufferedImageairplane;publicstaticBufferedImagebackground;publicstaticBufferedImagebee;publicstaticBufferedImagebullet;publicstaticBufferedImagegameover;publicstaticBufferedImageplayer0;publicstaticBufferedImageplayer1;publicstaticBufferedImagepause;publicstaticBufferedImagestart;publicstaticfinalintDOUBLE_FIRE=0;//双倍火力属性为0publicstaticfinalintLIFE=1;//奖励生命属性为1publicPlayerplayer=newPlayer();//创建玩家对象privateBullet[]bullets={};//创建子弹对象(当前为空)privateFlyingObject[]flyings={};//创建飞行物对象(当前为空)publicstaticfinalintSTART=0;//状态:开始为0publicstaticfinalintRUNNING=1;//状态:运行为1publicstaticfinalintPAUSE=2;//状态:暂停为2publicstaticfinalintGAME_OVER=3;//状态:游戏结束为3privateintstate=0;//当前状态1.static块静态块,在类加载时导入游戏所需图片static{try{airplane=ImageIO.read(ShootGame.class.getResource("airplane.png"));background=ImageIO.read(ShootGame.class.getResource("background.png"));bee=ImageIO.read(ShootGame.class.getResource("bee.png"));bullet=ImageIO.read(ShootGame.class.getResource("bullet.png"));gameover=ImageIO.read(ShootGame.class.getResource("gameover.png"));pause=ImageIO.read(ShootGame.class.getResource("pause.png"));start=ImageIO.read(ShootGame.class.getResource("start.png"));player0=ImageIO.read(ShootGame.class.getResource("player0.png"));player1=ImageIO.read(ShootGame.class.getResource("player1.png"));}catch(Exceptione){e.printStackTrace();}}main()在main方法中创建窗口publicstaticvoidmain(String[]args){JFrameframe=newJFrame("ShootGame");ShootGamegame=newShootGame();frame.add(game);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocation(400,100);frame.setAlwaysOnTop(true);frame.setVisible(true);frame.setSize(WIDTH,HEIGHT);game.action();}paint()//画图(g是画笔)publicvoidpaint(Graphicsg){g.drawImage(background,0,0,null);paintPlayer(g);//画玩家飞机paintFlyings(g);//画飞行物paintBullets(g);//画子弹paintScore(g);//画分数paintState(g);//画游戏状态}//画每一个子弹privatevoidpaintBullets(Graphicsg){for(inti=0;i<bullets.length;i++){Bulletb=bullets[i];g.drawImage(b.image,b.x,b.y,null);}}//画飞行物(敌机,蜜蜂)privatevoidpaintFlyings(Graphicsg){for(inti=0;i<flyings.length;i++){FlyingObjectflying=flyings[i];g.drawImage(flying.image,flying.x,flying.y,null);}}//画玩家privatevoidpaintPlayer(Graphicsg){g.drawImage(player.image,player.x,player.y,null);}//画分数publicvoidpaintScore(Graphicsg){g.setColor(Color.RED);//设置画笔颜色为红g.setFont(newFont(Font.SANS_SERIF,Font.BOLD,20));//设置字体,加粗,字号g.drawString("Score:"+score,10,25);g.drawString("Life:"+player.getLife(),10,45);}//画状态publicvoidpaintState(Graphicsg){switch(state){caseSTART:g.drawImage(start,0,0,null);break;casePAUSE:g.drawImage(pause,0,0,null);break;caseGAME_OVER:g.drawImage(gameover,0,0,null);break;}}action() 此方法处理鼠标响应事件:玩家机随鼠标移动,点击鼠标则游戏开始,鼠标移出则暂停游戏publicvoidaction(){ MouseAdapterl=newMouseAdapter(){//鼠标移动事件 publicvoidmouseMoved(MouseEvente){ if(state==RUNNING){ intx=e.getX(); inty=e.getY(); player.moveTo(x,y); } } //鼠标点击事件:假如当前状态为start则开始游戏,假如当前状态为游戏结束则初始化全部对象,游戏重新开始 publicvoidmouseClicked(MouseEvente){ switch(state){ caseSTART: state=RUNNING; break; caseGAME_OVER: flyings=newFlyingObject[0]; player=newPlayer(); bullets=newBullet[0]; score=0; state=START; } } //鼠标移出,在当前状态为运行情况下,改state为暂停 publicvoidmouseExited(MouseEvente){ if(state==RUNNING){ state=PAUSE; } } //鼠标移入,在当前状态为暂停情况下,游戏继续运行 publicvoidmouseEntered(MouseEvente){ if(state==PAUSE){ state=RUNNING; } } }; this.addMouseListener(l); this.addMouseMotionListener(l);TimerTask.run()//游戏运行 privateTimertimer; privateintinterval=10;//时间间隔,10毫秒intscore=0;//分数 timer=newTimer(); //每隔10毫秒运行一次run方法 timer.schedule(newTimerTask(){ @Override publicvoidrun(){ if(state==RUNNING){ enterAction();//飞行物入场(敌机或蜜蜂) stepAction();//飞行物移动 shootAction();//射击(子弹入场) bangAction();//碰撞 outOfBoundsAction();//删除出界对象 checkGameOverAction();//检验游戏结束 } repaint(); } },interval,interval); } //子弹击中飞行物 publicvoidbangAction(){ for(inti=0;i<bullets.length;i++){ if(bang(bullets[i])){ Bulletb=bullets[i]; bullets[i]=bullets[bullets.length-1]; bullets[bullets.length-1]=b; bullets=Arrays.copyOf(bullets,bullets.length-1); } } } //判断每一个子弹和飞行物是否碰撞 publicbooleanbang(Bulletb){ intindex=-1;//被击中飞行物下标 for(inti=0;i<flyings.length;i++){ FlyingObjectobj=flyings[i]; if(obj.shootBy(b)){ index=i; break; } } if(index!=-1){ FlyingObjectobj=flyings[index];//判断被击中飞行物是什么类型,是敌机则得分,是蜜蜂则取得奖励 if(objinstanceofAirplane){ Airplanea=(Airplane)obj; score+=a.getScore(); } if(objinstanceofBee){ Beebee=(Bee)obj; inttype=bee.getType(); switch(type){ caseDOUBLE_FIRE: player.addDoubleFile();break; caseLIFE: player.addLife();break; } } flyings[index]=flyings[flyings.length-1]; flyings[flyings.length-1]=obj;//将击中飞行物放到最终,并删去 flyings=Arrays.copyOf(flyings,flyings.length-1); returntrue; }else{ returnfalse; } }//删除出界飞行物 publicvoidoutOfBoundsAction(){ FlyingObject[]flyingAlive=newFlyingObject[flyings.length]; intindex=0;//新数组下标//将未出界飞行物放入新数组 for(inti=0;i<flyings.length;i++){ if(!flyings[i].outOfBound()){ flyingAlive[index]=flyings[i]; index++; } } flyings=Arrays.copyOf(flyingAlive,index);//缩小数组,将出界飞机删除 index=0; Bullet[]bulletAlive=newBullet[bullets.length];//将未出界子弹放入新数组 for(inti=0;i<bullets.length;i++){ if(!bullets[i].outOfBound()){ bulletAlive[index]=bullets[i]; index++; } } bullets=Arrays.copyOf(bulletAlive,index);//缩小数组,将出界子弹删除 }//检验游戏是否结束 publicvoidcheckGameOverAction(){ if(isGameOver()){ state=GAME_OVER; }//判断游戏结束 publicbooleanisGameOver(){ for(inti=0;i<flyings.length;i++){ intindex=-1;//被撞飞行物下标 if(player.isHit(flyings[i])){ player.deleteLife(); player.setDoubleFire(0); index=i; } if(index!=-1){//将被撞飞行物从数组中删除 FlyingObjectobj=flyings[index]; flyings[index]=flyings[flyings.length-1]; flyings[flyings.length-1]=obj; flyings=Arrays.copyOf(flyings,flyings.length-1); } } returnplayer.getLife()<=0; } intshootIndex=0;//射击频率//玩家发射子弹(生成子弹) publicvoidshootAction(){ shootIndex++;//300毫秒新建一组子弹 if(shootIndex%30==0){ Bullet[]bs=player.shoot();//将新建子弹加入到子弹数组中 bullets=Arrays.copyOf(bullets,bs.length+bullets.length); System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); } }//子弹,玩家,飞行物走步 publicvoidstepAction(){ for(inti=0;i<flyings.length;i++){ flyings[i].move(); } for(inti=0;i<bullets.length;i++){ bullets[i].move(); } player.move(); } intflyEnteredIndex=0;//飞行物入场计数//飞行物入场(新建对象) publicvoidenterAction(){ flyEnteredIndex++;//400毫秒新建一个飞行物(敌机或蜜蜂) if(flyEnteredIndex%40==0){ FlyingObjectobj=nextOne(); flyings=Arrays.copyOf(flyings,flyings.length+1);//扩容 flyings[flyings.length-1]=obj; } } //工厂方法:生成对象 publicstaticFlyingObjectnextOne(){ Randomrand=newRandom(); inttype=rand.nextInt(20); //生成蜜蜂概率为5% if(type==0){ returnnewBee(); }else{ returnnewAirplane(); } }FlyingObject类组员变量:protectedintx;//x坐标protectedinty;//y坐标protectedintwidth;//图片宽protectedintheight;//图片长protectedBufferedImageimage;//图片publicabstractvoidmove();//抽象方法:飞行物移动publicabstractbooleanoutOfBound();//抽象方法:判断是否出界//飞行物是否被子弹击中publicbooleanshootBy(Bulletb){ intx=b.x; inty=b.y; returnx>this.x&&x<this.x+width&&y>this.y&&y<this.y+height;}Airplane类组员变量:privateintspeed=2;//敌机移动速度 publicAirplane(){ x=(int)(Math.random()*ShootGame.WIDTH);//随机生成敌机x坐标 y=-height; image=ShootGame.airplane; width=image.getWidth(); height=image.getHeight(); } //敌机移动方法(每次向下移动一个单位) publicvoidmove(){ //TODOAuto-generatedmethodstub y+=speed; } //一个敌机分数为5 publicintgetScore(){ return5; } //判断敌机是否出界 publicbooleanoutOfBound(){ returnthis.y>ShootGame.HEIGHT; }Bee类组员变量:privateintxSpeed=1;//蜜蜂在x轴方向移动速度privateintySpeed=2;//蜜蜂在y轴方向移动速度privateintawardType;//奖励类型 publicBee(){ image=ShootGame.bee; x=(int)(Math.random()*ShootGame.WIDTH); y=-height; width=image.getWidth(); height=image.getHeight(); awardType=(int)(Math.random()*2);//0或1 } //取得奖励类型 publicintgetType(){ returnawardType; } //蜜蜂移动方法 publicvoidmove(){ y+=ySpeed; x+=xSpeed; if(x>ShootGame.WIDTH-width){ xSpeed=-1; }elseif(x<0){ xSpeed=1; } } //判断蜜蜂是否出界 publicbooleanoutOfBound(){ returnthis.y>ShootGame.HEIGHT; }Player类组员变量: privateBufferedImage[]images;//图片数组 privateintindex;//换图片计数 privateintlife;//玩家生命 privateintdoubleFile;//双倍火力 publicPlayer(){ x=150; y=300; image=ShootGame.player0; width=image.getWidth(); height=image.getHeight(); images=newBufferedImage[]{ShootGame.player0,ShootGame.player1}; life=3; doubleFile=0; index=0; } //生成子弹 publicBullet[]shoot(){ if(doubleFile>0){ Bullet[]bs=newBullet[2]; bs[0]=newBullet(this.x+this.width/4,this.y-20); bs[1]=newBullet(this.x+3*this.width/4,this.y-20); returnbs; }else{ Bullet[]bs=newBullet[1]; bs[0]=newBullet(this.x+width/2,this.y); returnbs; } }//将玩家机移动到鼠标位置 publicvoidmoveTo(intx,inty){ this.x=x-this.width/2; this.y=y-this.height/2; } //奖励双倍活力 publicvoidaddDoubleFile(){ doubleFile+=40; }//设置双倍火力值 publicvoidsetDoubleFire(inta){ doubleFile=a; }//取得生命数值 publicintgetLife(){ returnlife; }//减命 publicvoiddeleteLife(){ life--; }//奖励生命 publicvoidaddLife(){ life++; }//重写move方法实现玩家飞机动态效果 publicvoidmove(){ index++; switch((index/10)%2){ case0:image=images[0];break; case1:image=images[1];break; } }//重写outOfBound(),玩家飞机永不出界 publicbooleanoutOfBound(){ returnfalse; }//玩家碰撞到飞行物 publicbooleanisHit(FlyingObjectf){ if(this.x>=f.x&&this.x>=f.x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论