潜艇大作战Java课程设计.docx
- 文档编号:7063337
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:102
- 大小:508.79KB
潜艇大作战Java课程设计.docx
《潜艇大作战Java课程设计.docx》由会员分享,可在线阅读,更多相关《潜艇大作战Java课程设计.docx(102页珍藏版)》请在冰豆网上搜索。
潜艇大作战Java课程设计
《面向对象程序设计》
课程设计报告
题目:
潜艇大作战软件设计与实现
院(系):
信息科学与工程学院
专业班级:
计算机科学与技术1201班
******
学号:
***********
******
2014年12月29日至2015年1月9日
华中科技大学武昌分校制
面向对象程序设计课程设计任务书
一、设计(调查报告/论文)题目
潜艇大作战软件设计与实现
二、设计(调查报告/论文)主要内容
内容:
设计一个战舰猎捕潜艇的游戏,玩家以键盘输入来控制战舰的行动,猎杀潜艇获得分数,进入前十名有排名。
基本功能与要求:
1首先绘制一个首页,首页包括开始,退出按钮,采用事件监听。
2进入游戏后使用,通过读取文件,读出以前的最好成绩,使用菜单按钮开始游戏。
3通过方向键来控制潜艇的移动方向,空格键释放鱼雷。
4击中敌人后加分,同时被敌人击中一次就扣除一次机会,共三次机会
三、原始资料
1.《面向对象程序设计课程设计》指导书
2.耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
四、要求的设计(调查/论文)成果
1.课程设计报告
2.课程设计软件
五、进程安排
布置任务,查找资料、需求分析1天
总体设计1天
详细设计1.5天
编制源程序实现3.5天
测试与修改1天
撰写课设报告2天
六、主要参考资料
[1]张广彬.Java课程设计案例精编(第二版).北京:
清华大学出版社,2011.
[2]耿祥义.Java课程设计(第二版).北京:
清华大学出版社,2008.
[3]耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
[4]邹林达.陈国君Java2程序设计基础.北京:
清华大学出版社,2010.
[5]邹林达.Java2程序设计基础实验指导.北京:
清华大学,2010.
指导教师(签名):
20年月日
1需求与总体设计
1.1需求分析
1.1.1界面需求
界面是一个窗口,游戏在此窗口上运行,窗口上有分数设置。
1.1.2性能需求
此游戏分敌方潜艇(若干)和我方战舰(生命值3条)两个角色,敌方潜艇在水下攻击我方战舰,我方战舰于水上猎杀敌方潜艇。
1.2总体设计思路,功能图,类图
1.2.1程序设计思路
此游戏的关键点是潜艇是否被击中的判断,整个屏幕是个二维坐标系,军舰在一个水平位置移动,当在某个位置发射鱼雷,判断鱼雷的图片与不断移动的潜艇图片是否会有重合的地方,如果有发生爆炸,如果没有继续移动。
1.2.2功能图
1.2.3类图
2详细设计
2.1详细设计思路与类的说明、细化
2.1.1流程图
本游戏的基本运行流程是启动后把整个画布昨为一个线程,随时准备响应用户按键操作K的响应,100ms扫描一次潜艇和水雷等物体的运行状态。
在扫描潜艇和水雷运动时,执行各个物体画面的移动方法。
程序并不为每隔新增潜艇和水雷开启一个新线程,太多线程会造成程序的性能直线下降;而是将每一个物体类型直接加入到画布中,每当一个新物体产生,将直接在画布上画出;当物体消除时,将直接在画布上被消除。
这样就形成以种注册机制,所有游戏物体产生和消除都需要画布注册,画布拥有不同类型物体的所有“名单”,所有,当执行的命令只是需要遍历画布中所有游戏物体,依次执行每隔游戏物体中定义的移动方法即可。
2.1.2类的说明
Blast:
潜艇发射鱼雷击中战舰后爆炸的效果。
Bum:
炸弹
FrameObservable:
监听者模式来监听游戏画面切换。
HelpDialog:
游戏规则的对话框,提示游戏规则信息。
Hit:
潜艇被击中的爆炸效果。
InfoDialog:
关于我们的对话框,关于游戏的一些信息。
InputDialog:
玩家得分进图前十名的提示对话框。
MainPanel:
进图游戏的主界面面板。
MyButton:
绘制游戏背景
MyDialog:
暂停游戏的提示对话框。
MyFrame:
游戏窗体。
MyPanel:
主程序
ScoreDialog:
玩家没有进入前十名游戏就结束的提示对话框。
Submarine:
潜艇对象。
SubmarineWarMain:
重新开始游戏。
TimeManager:
计时器产生潜艇。
TimeManager2:
计时器产生鱼雷。
Torpedo:
潜艇发射的鱼雷对象。
WallDialog:
玩家进入前十名之后的成绩排名信息对话框。
WarShip:
战舰对象。
3编码实现
3.1JAVA编码实现
packagecom.stj.views;
importjava.awt.Color;
importjava.awt.Graphics2D;
importjava.util.Random;
/*潜艇发射的鱼雷击中战舰后爆炸的效果对象,原理:
绘制多个从小到大然后从大到小的圆显示爆炸效果*/
publicclassBlastimplementsRunnable
{
privateintX;
privateintY;
privateint[]r={2,3,5,8,12,15,18,20,25,30,33,25,17,15,13,9,5};//圆的半径集合
privateintstep=0;//集合中圆的位置标记
privatebooleanflag=false;
publicBlast(intx,inty)
{
this.X=x;
this.Y=y;
}
publicvoiddrawBlast(Graphics2Dg)
{
Randomrandom=newRandom();
intc=random.nextInt
(2);
if(c==0)
{
g.setColor(Color.RED);
}
elseif(c==1)
{
g.setColor(Color.ORANGE);
}
if(this.step { //System.out.println("draw"); //g.setColor(Color.gray); g.fillOval(this.X,this.Y,this.r[this.step],this.r[this.step]); //step++; } } publicvoidrun() { while(! this.flag) { step++; //System.out.println(step); try{ Thread.sleep(10); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } if(this.step==r.length) { this.flag=true; } } } publicintgetX(){ returnX; } publicvoidsetX(intx){ X=x; } publicintgetY(){ returnY; } publicvoidsetY(inty){ Y=y; } publicbooleanisFlag(){ returnflag; } publicvoidsetFlag(booleanflag){ this.flag=flag; } } packagecom.stj.views; importjava.awt.*; importjavax.swing.ImageIcon; publicclassBumbimplementsRunnable { privateWarShipship; privateintbeginX; privateintbeginY; privateintwidth=5; privateintheight=15; publicbooleanflag=false; privateMyPanelpanel; privateImageimage; publicBumb(MyPanelp,WarShipship) { this.beginX=ship.getBeginX()+20; this.beginY=ship.getBeginY()+20; this.panel=p; this.ship=ship; image=Toolkit.getDefaultToolkit().getImage("imgs/炸弹.png"); image=newImageIcon(image).getImage(); this.width=image.getWidth(panel); this.height=image.getHeight(panel); //System.out.println("bumbwidth: "+this.width); //System.out.println("bumbheight: "+this.height); } publicvoidrun() { while(! flag) { this.moveDown(); if(this.panel.isStop()==true) { synchronized(MyPanel.subLock) { try { MyPanel.subLock.wait(); } catch(Exceptione) { e.printStackTrace(); this.flag=true; } } } try { Thread.sleep(10); } catch(Exceptionevent) { event.printStackTrace(); this.flag=true; } } } publicvoiddrawBumb(Graphics2Dg) { //g.setColor(Color.BLACK); //g.fillOval(this.beginX,this.beginY,this.radius,this.radius); g.drawImage(image,this.beginX,this.beginY,this.panel); } publicvoidmoveDown() { this.beginY+=1; if(this.beginY>(this.panel.getHeight()-this.height/2)) { flag=true; } //this.panel.repaint(); } publicWarShipgetShip(){ returnship; } publicvoidsetShip(WarShipship){ this.ship=ship; } publicintgetBeginX(){ returnbeginX; } publicvoidsetBeginX(intbeginX){ this.beginX=beginX; } publicintgetBeginY(){ returnbeginY; } publicvoidsetBeginY(intbeginY){ this.beginY=beginY; } publicintgetWidth(){ returnwidth; } publicvoidsetWidth(intwidth){ this.width=width; } publicintgetHeight(){ returnheight; } publicvoidsetHeight(intheight){ this.height=height; } } importjava.util.Observable; /*监听者模式来监听游戏画面切换,从游戏进入画面到游戏主画面,用MyFrame对象监听MainPanel*/ publicclassFrameObservableextendsObservable { publicvoidnotifyObservers(Objectarg) { //System.out.println("notify"); this.setChanged(); super.notifyObservers(arg);//arg为被观察的对象 } } importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics; importjava.awt.Graphics2D; importjava.awt.LinearGradientPaint; importjava.awt.Shape; importjava.awt.Frame; importjava.awt.event.MouseEvent; importjava.awt.event.MouseListener; importjava.awt.event.MouseMotionListener; importjava.awt.geom.AffineTransform; importjava.awt.geom.Area; importjava.awt.geom.Ellipse2D; importjava.awt.geom.Point2D; importjava.awt.geom.RoundRectangle2D; importjavax.swing.JDialog; importjavax.swing.JFrame; importjavax.swing.plaf.basic.BasicGraphicsUtils; importcom.sun.awt.AWTUtilities; /*游戏规则的对话框,提示游戏规则信息*/ publicclassHelpDialogextendsJDialogimplementsMouseMotionListener,MouseListener { privatestaticfinallongserialVersionUID=1L; protectedJFrameframe1; privateMyPanelpanel; privatebooleanflag=false; privatebooleanisDraw=false; privatebooleanisOutDraw=false; publicHelpDialog(Frameframe,booleanmodal,MyPanelpanel) { super(frame,modal); this.panel=panel; this.addMouseMotionListener(this); this.addMouseListener(this); this.setLocation(frame.getBounds().x+180,frame.getBounds().y+200); this.setSize(300,200); this.setUndecorated(true); this.setVisiableRigeon(this.getWidth(),this.getHeight()); this.setVisible(true); } publicvoidpaint(Graphicsg) { super.paint(g); Graphics2Dg2=(Graphics2D)g; //g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); Point2Dstart=newPoint2D.Float(this.getWidth()/2,0); Point2Dend=newPoint2D.Float(this.getWidth()/2,this.getHeight()); float[]dist={0.05f,1.0f}; Color[]colors={newColor(58,95,205),Color.CYAN}; LinearGradientPaintp= newLinearGradientPaint(start,end,dist,colors); g2.setPaint(p); g2.fillRect(0,0,this.getWidth(),this.getHeight()); Stringtitle=newString("游戏规则"); g2.setFont(newFont("华文行楷",Font.BOLD,25)); g2.setColor(Color.yellow); BasicGraphicsUtils.drawString(g2,title,100,90,50); Stringcontext=newString("按<-或A键控制军舰向左"); g2.setFont(newFont("华文行楷",Font.BOLD,15)); g2.setColor(Color.yellow); BasicGraphicsUtils.drawString(g2,context,100,50,100); Stringcontext1=newString("按->或D键控制军舰向右"); g2.setFont(newFont("华文行楷",Font.BOLD,15)); g2.setColor(Color.yellow); BasicGraphicsUtils.drawString(g2,context1,100,50,120); Stringcontext2=newString("按空格键扔炸弹"); g2.setFont(newFont("华文行楷",Font.BOLD,15)); g2.setColor(Color.yellow); BasicGraphicsUtils.drawString(g2,context2,100,50,140); //g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); this.repaintShape(); }//设置对话框为圆角矩形 publicvoidsetVisiableRigeon(intwidth,intheight) { Shapeshape=newRoundRectangle2D.Float(20,20,this.getWidth()-40,this.getHeight()-40,15.0f,15.0f); Shapeshape2=newEllipse2D.Double(this.getWidth()-40,10,30,30); Areaarea=newArea(shape); Areaarea2=newArea(shape2); area.add(area2); AWTUtilities.setWindowShape(this,area); } publicvoidmouseClicked(MouseEventarg0){ } publicvoidmouseEntered(MouseEventarg0){ //System.out.println("enter");} publicvoidmouseExited(MouseEventarg0) { //System.out.println("exit"); this.flag=false; this.isDraw=false; if(! this.isOutDraw) { //this.repaint(this.getWidth()-40,10,30,30); this.repaintShape(); } this.isOutDraw=true; } publicvoidmousePressed(MouseEventarg0){ intx=arg0.getX(); inty=arg0.getY(); Shapeshape=newEllipse2D.Double(this.getWidth()-40,10,30,30); //System.out.print(111111); if(shape.contains(x,y)) { this.panel.goOn(); this.setVisible(false); } } publicvoidmouseReleased(MouseEventarg0){ //TODOAuto-generatedmethodstub } publ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 潜艇 作战 Java 课程设计