java游戏编程实验二.docx
- 文档编号:22898640
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:12
- 大小:17.23KB
java游戏编程实验二.docx
《java游戏编程实验二.docx》由会员分享,可在线阅读,更多相关《java游戏编程实验二.docx(12页珍藏版)》请在冰豆网上搜索。
java游戏编程实验二
湖南文理学院实验报告
课程名称Java游戏编程基础实验名称实验二贪食蛇游戏设计成绩
学生姓名专业班级网工13102学号201317030
实验日期同组人姓名学号
一实验目的
通过设计和制作贪食蛇游戏来理解游戏程序的运行机制,同时学习运用java的事件处理机制来改变游戏状态和传递控制命令。
二实验内容
学习和了解贪食蛇游戏的基本设计思想(参考教材4.4节内容及相关代码),在此基础上进行改进,要求实现如下功能:
1.当窗口最小化或被遮挡时暂停游戏;
2.改变蛇的运动速度,按+号键加速,按-号键减速;
3.手动控制蛇的移动,按下方向键时让蛇朝对应的方向移动,否则静止不动;
4.能够添加多个食物,如当按下某个键后随机添加一个新食物(原来的食物不消失);
5.添加游戏结束规则(比如蛇头碰到边界或蛇身时结束),并能重新开始游戏。
要求至少实现3个功能。
还可以根据自己的创意,加入更多功能。
三实验步骤
1.启动java开发环境,运行示例程序。
2.阅读示例程序,分析程序整体结构及各个类的功能。
3.根据实验内容要求修改或添加代码,以实现相应的功能。
4.书写实验报告,详细阐述代码编写的基本思想及主要过程。
四课时分配
2课时
五提交文档
实验报告、源程序代码
importjava.awt.*;
importjava.util.Random;
/*
*Tochangethistemplate,chooseTools|Templates
*andopenthetemplateintheeditor.
*/
/**
*
*@authornew
*/
publicclassFood{
publicPointlocation;
publicPointsize;
privateGamePanelgameP;
privateSnakesnk;
privateRandomrand;
publicFood(GamePanelgp,Snakesk){
gameP=gp;
snk=sk;
rand=newRandom();
location=newPoint(Math.abs(rand.nextInt()%gameP.width),Math.abs(rand.nextInt()%gameP.heigth));
size=newPoint(sk.diameter,sk.diameter);
}
publicvoidupdate(){
if((Math.abs((snk.x+snk.diameter/2)-(location.x+size.x/2)) (Math.abs((snk.y+snk.diameter/2)-(location.y+size.y/2)) location=newPoint(Math.abs(rand.nextInt()%gameP.width),Math.abs(rand.nextInt()%gameP.heigth)); if(snk.length snk.length++; } } } publicvoiddraw(Graphicsg){ g.setColor(Color.black); g.fillRect(location.x,location.y,size.x,size.y); } } /* *Tochangethistemplate,chooseTools|Templates *andopenthetemplateintheeditor. */ /** * *@authorAdministrator */ importjava.awt.*; importjava.awt.event.*; publicclassGameFrame{ publicGameFrame(){ Frameapp=newFrame("GameFrame"); app.addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ System.exit(0); } }); app.setLocation(100,100); GamePaneldrawB=newGamePanel(); app.add(drawB,BorderLayout.CENTER); app.pack(); app.setResizable(false); app.setVisible(true); drawB.gameStart(); } /** *@paramargsthecommandlinearguments */ publicstaticvoidmain(String[]args){ newGameFrame(); //TODOcodeapplicationlogichere } } /* *Tochangethistemplate,chooseTools|Templates *andopenthetemplateintheeditor. */ importjava.awt.*; importjava.awt.event.*; /** * *@authorAdministrator */ publicclassGamePanelextendsPanelimplementsRunnable,KeyListener{ publicintwidth; publicintheigth; publicintincre=1; privateImageim; privateGraphicsdbg; privateThreadgamethread; privatestaticfinalintFPS=30; privatebooleanrunning=false; privatebooleanisPaused=false; privateintdirection; publicstaticfinalintSOUTH=0; publicstaticfinalintNORTH=1; publicstaticfinalintEAST=2; publicstaticfinalintWEST=3; privateSnakesk; privateFoodbk; publicGamePanel(){ width=300; heigth=300; setPreferredSize(newDimension(width,heigth)); sk=newSnake(this); bk=newFood(this,sk); setFocusable(true); requestFocus(); addKeyListener(this); } publicintgetDirection(){ returndirection; } publicvoidgameStart(){ if(! running){ gamethread=newThread(this); gamethread.start(); } } publicvoidgameStop(){ running=false; } publicvoidgamePaint(){ Graphicsg; try{ g=this.getGraphics(); if(g! =null&&im! =null){ g.drawImage(im,0,0,null); } g.dispose(); }catch(Exceptione){ } } publicvoidgameRender(){ if(im==null){ im=createImage(width,heigth); if(im==null){ System.out.println("imisnull"); }else{ dbg=im.getGraphics(); } } dbg.setColor(Color.white); dbg.fillRect(0,0,width,heigth); sk.draw(dbg); bk.draw(dbg); } publicvoidgameUpdate(){ if(! isPaused){ sk.update(); bk.update(); } } publicvoidrun(){ longt1,t2,dt,sleepTime; longperiod=1000/FPS;//计算每一次循环需要的执行时间,单位毫秒 t1=System.nanoTime();//保存游戏循环执行前的系统时间,单位纳秒 while(true){ gameUpdate(); gameRender(); gamePaint(); t2=System.nanoTime();//游戏循环执行后的系统时间,单位纳秒 dt=(t2-t1)/1000000L;//本次循环实际花费的时间,并转换为毫秒 sleepTime=period-dt;//计算本次循环剩余的时间,单位毫秒 if(sleepTime<=0)//防止sleepTime值为负数 sleepTime=2; try{ Thread.sleep(sleepTime);//让线程休眠,由sleepTime值决定 }catch(InterruptedExceptionex){} t1=System.nanoTime();//重新获取当前系统时间 } } publicvoidkeyTyped(KeyEvente){ } publicvoidkeyPressed(KeyEvente){ intkeycode=e.getKeyCode(); if(keycode==KeyEvent.VK_P){ isPaused=! isPaused; System.out.println("keyisP"); } if(! isPaused){ switch(keycode){ caseKeyEvent.VK_DOWN: direction=SOUTH; System.out.println("keyisdown"+direction); break; caseKeyEvent.VK_UP: direction=NORTH; System.out.println("keyisup"+direction); break; caseKeyEvent.VK_RIGHT: direction=EAST; System.out.println("keyisright"+direction); break; caseKeyEvent.VK_LEFT: direction=WEST; System.out.println("keyisleft"+direction); break; } } } publicvoidkeyReleased(KeyEvente){ } } importjava.awt.*; /* *Tochangethistemplate,chooseTools|Templates *andopenthetemplateintheeditor. */ /** * *@authornew */ publicclassSnake{ GamePanelgameP; privatePoint[]body; publicstaticfinalintMAXLENTH=20; privateinthead; privateinttail; publicintlength; privateintspeed; publicintx; publicinty; publicintdiameter; publicSnake(GamePanelgp){ gameP=gp; body=newPoint[MAXLENTH]; head=-1; tail=-1; length=1; speed=10; x=50; y=50; diameter=10; } publicvoidupdate(){ intdirection=gameP.getDirection(); switch(direction){ caseGamePanel.SOUTH: y+=speed; break; caseGamePanel.NORTH: y-=speed; break; caseGamePanel.EAST: x+=speed; break; caseGamePanel.WEST: x-=speed; break; } if(x>gameP.width){ x=-diameter; } if(y>gameP.heigth){ y=-diameter; } if(x<-diameter){ x=gameP.width; } if(y<-diameter){ y=gameP.heigth; } head=(head+1)%body.length; tail=(head+body.length-length+1)%body.length; body[head]=newPoint(x,y); } publicvoiddraw(Graphicsg){ g.setColor(Color.blue); if(length>1){ inti=tail; while(i! =head){ g.fillOval(body[i].x,body[i].y,diameter,diameter); i=(i+1)%body.length; } } g.setColor(Color.red); g.fillOval(body[head].x,body[head].y,diameter,diameter); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 游戏 编程 实验