课件课后练习代码经典案例_第1页
课件课后练习代码经典案例_第2页
课件课后练习代码经典案例_第3页
课件课后练习代码经典案例_第4页
课件课后练习代码经典案例_第5页
已阅读5页,还剩54页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

JavaOOP贪吃虫游戏——定义Cell类,封装网贪吃虫游戏——随机生成Food与绘制贪吃虫游戏——构建可爬行贪吃虫游戏——实现自动爬行定义类型用于创建贪吃虫的单元格对象以及食物对象,贪吃虫和食物的逻辑关系如图图在舞台上的坐标位置.并且提供构造器方便创建初始化实例,提供属性方法,和便于调试publicpublicclassCellprivateintprivateintpublicCell()publicCell(intx,int{this.x=x;this.y=y;构造器publicCell(Cell{this(cell.x,publicint{returnpublicintgetX()returnpublicvoidsetX(intx)this.x=publicintgetY()returnpublicvoidsetY(inty)this.y=publicStringtoString()returnx+","+创建TestCell,添加mainpublicclassTestCellpublicstaticvoidmain(String[]{Cellhead=newCell(12,8);Cellfood=newCell(30,29);执试结果30,29publicclassCellprivateint privateinty;publicCell()}publicCell(intx,inty)this.x= this.y= 构造器publicCell(Cellcell)this(cell.x, publicintgetX()return publicvoidsetX(intx)this.x= publicintgetY()return publicvoidsetY(inty)this.y= publicStringtoString()returnx+","+ publicclassTestCellpublicstaticvoidmain(String[]args)Cellhead=newCellfood=newCell(30,}}解决随机生成食物问题.在贪吃虫业务功能中每当食物被虫,就需要重新生成一颗食物.创建贪吃虫的舞台,并在舞台上绘制随机生成的食物.JPanelpaint方法用于实现绘制publicclassWormStageextendsJPanel/**节点的大小,以绘制像数为单位publicstaticfinalintCELL_SIZE=/**舞台单元格的列数publicstaticfinalintCELL_COLS=/**舞台单元格的行数publicstaticfinalintCELL_ROWS=publicWormStage()setSize(CELL_COLS*CELL_SIZE,CELL_ROWS*publicvoidpaint(Graphicsg)g.setColor(newColor(35,31,32));g.fillRect(0,0,getWidth(),(food!=null)g.setColor(newColor(255,192,g.fillRect(food.getX()*WormStage.CELL_SIZE,g.setColor(newColor(35,31,g.drawRect(food.getX()**添加成员变量food代表食物的,添加方法randomFood()用于随机生成食物privateCellprivateCellrandomFood()intx;intx=RandomUtils.nextInt(CELL_COLS);y=returnnewCell(x,重写绘制方法paint }publicvoidaction()Scannerscanner=newScanner(System.in);food=randomFood();while(true)foodrepaint();publicstaticvoidmain(String[]args)JFramemain=newJFrame();main.setSize(460,470);Dimensiond=main.setLocation((d.width-main.getWidth())/(d.height-main.getHeight())/WormStagewormStage=newWormStage();intw=main.getContentPane().getWidth();inth=main.getContentPane().getHeight();wormStage.setLocation((w-wormStage.getWidth())(h-wormStage.getHeight())/2);/}执行结果如图图publicclassWormStageextendsJPanelpublicclassWormStageextendsJPanel/**节点的大小,以绘制像数为单位setSize(CELL_COLS*CELL_SIZE,CELL_ROWS*publicvoidaction()Scannerscanner=newScanner(System.in);food=randomFood();while(true){food=randomFood();publicstaticfinal=/**舞台单元格的列数publicstaticfinal=/**舞台单元格的行数publicstaticfinal=privateCellpublicWormStage() privateCellrandomFood()intintx=y=returnnewCell(x, publicvoidpaint(Graphicsg)g.setColor(newColor(35,31,g.fillRect(0,0,getWidth(),if(food!=null)g.setColor(newColor(255,192,g.fillRect(food.getX()* *g.setColor(newColor(35,31,g.drawRect(food.getX()* * publicstaticvoidmain(String[]args)JFramemain=newmain.setSize(460,Dimensiond=main.setLocation((d.width-main.getWidth())/(d.height-main.getHeight())/(h-wormStage.getHeight())/}}WormStagewormStage=newWormStage();intw=inth=wormStage.setLocation((w- /在Cell类中添加paintWormStage类paint方法代码.publicvoidpaint(Graphicsg,Colorb,Colorf)g.fillRect(x*WormStage.CELL_SIZE,y*WormStage.CELL_SIZE,WormStage.CELL_SIZE,WormStage.CELL_SIZE);g.drawRect(x*WormStage.CELL_SIZE,y*WormStage.CELL_SIZE,WormStage.CELL_SIZE,WormStage.CELL_SIZE);publicvoidpaint(Graphicsg)g.setColor(newColor(35,31,g.fillRect(0,0,getWidth(),if(food!=null)food.paint(g,newColor(255,192,newColor(35,31,图定义类Worm表示贪吃类型,贪吃虫包含多个CellpublicclassWorm/**节点数组*/privateCellcells;publicWorm()//WormStage.WORM_LENcells=newfor(inti=0;i<cells.length;{cells[i]=newCell(i,

图爬行(creep)@paramdirectionvoidcreep(intdirection)(direction+currentDirection!=0currentDirection=CellnewHead=(newHead!=null)for(inti=cells.length-1;i>=1;i--{cells[i]=cells[i-cells[0]=}}}图创建类Worm,包含数组类型属性cellspublicclassWorm/**privateCell[]WORM_LEN来自WormStage类中publicWorm()//WormStage.WORM_LENcells=newfor(inti=0;i<cells.length;{cells[i]=newCell(i,/**publicstatic/**方向下*/publicstaticfinalintDIRECTION_UP=intDIRECTION_DOWN=-/**publicstatic/**publicstaticintDIRECTION_LEFT=intDIRECTION_RIGHT=-/**privateintcurrentDirection=privateCellnewHead(intdirection)CellnewHead=null;Cellhead=cells[0];switch(direction){casenewHead=newCell(head.getX(),head.getY()-1);casenewHead=newCell(head.getX(),head.getY()+casenewHead=newCell(head.getX()-1,casenewHead=newCell(head.getX()+1,head.getY());return在Worm类中添加creep()cells[i]=cells[i-}cells[0]=} }爬行(creep)@paramdirectionpublicvoidcreep(intdirection)(direction+currentDirection!=0){currentDirection=CellnewHead=newHead(direction);if(newHead!=null){for(inti=cells.length-1;i>=1;i--)publicvoidpaint(Graphicsg,Colorb,Colorf)for(inti=0;i<cells.length;{cells[i].paint(g,b,重构WormStageworm,worm代表在舞台/**默认贪吃虫的长度publicstaticfinalintWORM_LEN=/**贪吃虫*/privateWormworm;重构WormStage类的绘制方法paint()重构WormStage类的绘制方法paint()wormpublicvoidpaint(Graphicsg)g.setColor(newColor(35,31,32));g.fillRect(0,0,getWidth(),getHeight());if(worm!=null)worm.paint(g,newColor(0,176,240),newColor(35,31,}if(food!=null)food.paint(g,newColor(255,192,0),newColor(35,31,}}重构WormStage类的action()方法增加从控制台字符UDLR,并根据字符控制贪吃虫爬publicvoidaction()//利用控制台输入的UDLR控制蛇的运动Scannerscanner=newScanner(System.in);food=randomFood();worm=newWorm();while(true){Stringcmd=intdirection;if("U".equals(cmd))direction=}elseif{direction=}elseif{direction=}elseif{direction=continue;}}}*publicclassWorm/**方向上publicstaticfinalintDIRECTION_UP=/**方向下publicstaticfinalintDIRECTION_DOWN=-/**方向左publicstaticfinalintDIRECTION_LEFT=/**方向右publicstaticfinalintDIRECTION_RIGHT=-2;/**虫的当前运行方向privateintcurrentDirection=DIRECTION_DOWN;/**节点数组privateCell[]cells;publicWorm()//WormStage.WORM_LENcells=newfor(inti=0;i<cells.length;i++)cells[i]=newCell(i, *爬行(creep)*@paramdirectionpublicvoidcreep(intdirection)(direction+currentDirection!=0)currentDirection=CellnewHead=(newHead!=null)for(inti=cells.length-1;ii--{cells[i]=cells[i-}cells[0]=}}}publicvoidpaint(Graphicsg,Colorb,Color{for(inti=0;i<cells.length;i++)cells[i].paint(g,b,}}privateCellnewHead(intdirection)CellnewHead=Cellhead=switch(direction)casenewHead=newCell(head.getX(),head.getY()-casenewHead=newCell(head.getX(),head.getY()+casenewHead=newCell(head.getX()-1,casenewHead=newCell(head.getX()+}return}}*publicclassWormStageextendsJPanel/**显示单元格大小像素个数publicstaticfinalintCELL_SIZE=/**舞台显示单元格的列数publicstaticfinalintCELL_COLS=/**舞台显示单元格的行数publicstaticfinalintCELL_ROWS=/**默认贪吃虫的长度publicstaticfinalintWORM_LEN=/**贪吃虫privateWorm/**食物privateCellfood;publicWormStage()/**根据行数和列数设置舞台大小setSize(CELL_COLS*CELL_SIZE,CELL_ROWS* publicvoidaction()//利用控制台输入的UDLRScannerscanner=newfood=worm=newwhile(true)Stringcmd=intif("U".equals(cmd))direction=}elseif("D".equals(cmd))direction=}elseif("L".equals(cmd))direction=}elseif("R".equals(cmd))direction=}elsecontinue; privateCellrandomFood()intintx=y=returnnewCell(x, publicvoidpaint(Graphicsg)g.setColor(newColor(35,31,g.fillRect(0,0,getWidth(),if(worm!=null)worm.paint(g,newColor(0,176,240),newColor(35,31,}if(food!=null)food.paint(g,newColor(255,192,newColor(35,31,}}}

publicstaticvoidmain(String[]args){JFramemain=newJFrame();main.setSize(460,470);Dimensiond=main.setLocation((d.width-main.getWidth())/2,(d.height-main.getHeight())/2);WormStagewormStage=newWormStage();intw=main.getContentPane().getWidth();inth=main.getContentPane().getHeight(); wormStage.setLocation((w- /(h-wormStage.getHeight())/}}执行代码得到如下结果,如图图在贪吃虫Worm中增加方法hit*@paramdirection@return如果发生撞击(撞击边缘)就返回true,否则返回publicbooleanhit(intCellnextHeadnewHead(direction);xEL_OLS||nextHead.getY()>=WormStage.CELL_ROWS){returntrue;}returnfalse;//没有发生撞击}publicvoidaction()//利用控制台输入的UDLR控制蛇的运动Scannerscanner=newScanner(System.in);food=randomFood();worm=newWorm();while(true)Stringcmd=intif("U".equals(cmd))direction=}elseif("D".equals(cmd))worm=newWorm();} }direction=}elseif{direction=}elseif{direction}elsecontinue;利用JavaAPI定时器类Timer在java.utilimport到WormStage类中.privateTimertimer=new代表定时器任务,类中包含抽象方法run()run()*publicclassCreepTaskextendsTimerTask/**privateWormStage/**publicCreepTask(WormStagewormStage)this.wormStage=/**run(),*/publicvoidrun(){publicvoidcreepForFood()将定时器任务实例交给定时器timer0200表示间隔200毫秒后再次执行定时任务,方法参考JavaAPI手册:publicvoidaction()worm=newfood=timer.schedule(newCreepTask(this),0,200);重构Worm类,添加重载方法creeppublicvoidcreep()重构Worm@return如果发生撞击就返回true,否则返回publicbooleanreturn重构WormStage类添加属性timerprivateTimertimer=new在WormStage类中添加方法creepForFood/**爬行方法,如果撞头就重新开始publicvoid{worm=newWorm();food=randomFood();}else*publicclassCreepTaskextendsTimerTask/**privateWormStage/**publicCreepTask(WormStagewormStage)this.wormStage=/**run(),*/publicvoidrun(){publicvoidaction()worm=newWorm();food=randomFood();timer.schedule(newCreepTask(this),0,200);完整代码参考(不包含Cell类型,Cell*publicclassCreepTaskextendsTimerTask/**privateWormStage/**publicCreepTask(WormStagewormStage)this.wormStage=}/**实现定时任务的执行方法run(),publicvoidrun(){ *publicclassWorm/**方向上publicstaticfinalintDIRECTION_UP=/**方向下publicstaticfinalintDIRECTION_DOWN=-/**方向左publicstaticfinalintDIRECTION_LEFT=/**方向右publicstaticfinalintDIRECTION_RIGHT=-2;/**虫的当前运行方向privateintcurrentDirection=DIRECTION_DOWN;/**节点数组privateCell[]cells;publicWorm()//WormStage.WORM_LENcells=newfor(inti=0;i<cells.length;i++)cells[i]=newCell(i, * *@paramdirection*@return如果发生撞击就返回true,否则返回publicbooleanhit(intCellnextHead=newHead(direction);//if(nextHead.getX()<0||nextHead.getY()<||nextHead.getX()>=||nextHead.getY()>=WormStage.CELL_ROWS)return}return} **@return如果发生撞击就返回true,否则返回publicbooleanreturn}*爬行(creep)*@paramdirectionpublicvoidcreep(intdirection)if(direction+currentDirection!=0currentDirection=CellnewHead=(newHead!=null)for(inti=cells.length-ii--{cells[i]=cells[i-}cells[0]=}}} publicvoidcreep()}publicvoidpaint(Graphicsg,Colorb,Color{for(inti=0;i<cells.length;i++)cells[i].paint(g,b,}}CellnewHead(intdirection)newHead=head=switch(direction)casenewHead=newCell(head.getX(),head.getY()-casenewHead=newCell(head.getX(),head.getY()+casenewHead=new-casenewHead=new+}return}}*publicclassWormStageextendsJPanel/**显示单元格大小像素个数publicstaticfinalintCELL_SIZE=/**舞台显示单元格的列数publicstaticfinalintCELL_COLS=/**舞台显示单元格的行数publicstaticfinalintCELL_ROWS=/**默认贪吃虫的长度publicstaticfinalintWORM_LEN=/**贪吃虫privateWorm/**食物privateCell/**驱动贪吃虫自动运行的定时器privateTimertimer=newTimer();publicWormStage()setSize(CELL_COLS*CELL_SIZE,CELL_ROWS* publicvoidaction()worm=newfood=timer.schedule(newCreepTask(this),0,

温馨提示

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

评论

0/150

提交评论