Robocode关于坦克大战的课程设计报告.docx

上传人:b****5 文档编号:27690618 上传时间:2023-07-04 格式:DOCX 页数:30 大小:123.18KB
下载 相关 举报
Robocode关于坦克大战的课程设计报告.docx_第1页
第1页 / 共30页
Robocode关于坦克大战的课程设计报告.docx_第2页
第2页 / 共30页
Robocode关于坦克大战的课程设计报告.docx_第3页
第3页 / 共30页
Robocode关于坦克大战的课程设计报告.docx_第4页
第4页 / 共30页
Robocode关于坦克大战的课程设计报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

Robocode关于坦克大战的课程设计报告.docx

《Robocode关于坦克大战的课程设计报告.docx》由会员分享,可在线阅读,更多相关《Robocode关于坦克大战的课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。

Robocode关于坦克大战的课程设计报告.docx

Robocode关于坦克大战的课程设计报告

目录

一.课程设计的目的与要求

1.1课程设计目的……………………………………………………………….

1.2课程设计的实验环境………………………………………………………

1.3课程设计的预备知识………………………………………………………

1.4课程设计主要内容…………………………………………………………

二.系统分析

2.1可行性分析………………………………………………………………….

2.2需求分析……………………………………………………………………..

2.3工作流程图………………………………………………………………….

三.课程设计内容

  3.1程序具体设计……………………………………………………………….

3.2主要方法和变量……………………………………………………………

3.3游戏主窗口………………………………………………………………….

四.系统的功能测试与调整

4.1菜单项测试………………………………………………………………….

4.2游戏运行测试………………………………………………………………

4.3坦克爆炸测试………………………………………………………………

4.4保存游戏信息测试…………………………………………………………

4.5帮助功能测试……………………………………………………………….

五.设计体会与小结…………………………………………………………

六.附录………………………………………………………………………

 

一.程设计的目的与要求

1.1课程设计目的

《JAVA面性对象程序设计》是电子商务专业的必修专业基础课程,其实践性、应用性很强。

实践教学环节是必不可少的一个重要环节。

本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA面性对象程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。

1.2课程设计的实验环境

硬件要求能运行Windows9.X操作系统的微机系统。

JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。

1.3课程设计的预备知识

熟悉JAVA语言以及ECLIPSE开发工具。

1.4课程设计主要内容

坦克大战游戏是在Eclipse环境下编程的游戏,其中包括对主战坦克的编写、坦克的初始位置的编写、坦克的移动方向的编写、坦克的速度的编写、坦克的子弹速度的编写、敌军的子弹速度的编写、设置游戏难度的编写、子弹的编写、敌军坦克的编写、构造函数的编写等等。

游戏主要实现的功能有:

(1).坦克可以上下左右移动

(2).坦克可以发子弹(可以连发)

(3).我的坦克击中敌人坦克时,敌人就消失(显示爆炸效果)

(4).我被击中后显示爆炸效果

(5).防止敌人坦克重叠运动

(6).玩游戏时可以暂停和继续

(7).记录玩家的成绩

二.系统分析

2.1可行性分析

2.1.1技术可行性

软件使用swing、GUI、Socket、面向对象设计等技术实现,这些技术均已是非常成熟的技术,之前已有相当多使用这些技术的成功案例,故现使用这些技术是可行的。

2.1.2经济可行性

本软件为免费软件,将免费提供软件的下载、运行和维护服务,软件暂无收入,待公布之后随着使用者越来越多,将添加相应的广告、服务,从而增加收入,若使用者寥寥无几,将再次分析是否重新策划软件或者放弃开发,以减少损失。

2.2需求分析

设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。

用户可以选择重新开始游戏,退出游戏,暂停游戏游戏帮助。

界面中包含我方坦克,和敌人坦克以及坦克发出的子弹和爆炸后的效果。

坦克:

坦克分为两种,敌方坦克和用户控制的坦克。

用户方和敌方坦克均可以发射子弹,可以改变路径的行走,且在行走过程中遇到墙等阻碍物和游戏边界时要改变方向,而不能一直顶着障碍物不放。

坦克之间不能穿越,碰撞到后自动调换方向。

墙:

游戏中的边界王家的坦克和敌人的坦克都不能越过,坦克的子弹也不能穿过。

子弹:

子弹可以由敌方和用户方发射,且发射出去的子弹可以直线移动,直到碰到障碍物就消失,子弹可以穿越树林和河流。

敌方坦克受到一颗子弹攻击会爆炸从而导致死亡,死亡后坦克消失。

用户方受到子弹攻击后会减少寿命,且受到四次攻击则死亡,此时如还有敌方坦克存在,则用户方输掉本次游戏。

爆炸:

当子弹射击到坦克身上时,要产生爆炸效果。

方向:

坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。

2.3工作流程图

三.课程设计内容

3.1程序具体设计

图形用户界面需要用到抽象窗口工具即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。

坦克都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。

界面的构造在程序中由MyPanel类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。

由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。

界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新。

坦克主要由Tank类来实现。

坦克的属性:

速度(有X轴和Y轴的速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。

所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。

在设计过程中,坦克出现的位置由坐标而定。

用户之后的位置由键盘监听方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。

敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。

坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。

Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。

由于坦克在碰到墙,界面边界和“家”等阻碍物时要改变方向,所以在Tank里面必须对于每一种阻碍物要设计一个方法来作为应对策略,当然解决方法是把下一步的位置调整到上一步的位置。

子弹的属性:

子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。

由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。

如:

imgs.put(“L”,bulletImages[0]);

类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。

darw()方法和move()方法来控制画子弹和移动子弹。

接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接returntrue就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。

具体代码:

publicbooleanhitTanks(Listtanks){

//当子弹打到坦克时

for(inti=0;i

if(hitTank(tanks.get(i))){

//对每一个坦克,调用hitTank

returntrue;

}

}

returnfalse;

}

子弹打到其他坦克上时用hitTank(Tankt)方法,子弹打到墙上时hitWall(CommonWallw)方法,打到金属墙上hitWall(MetalWallw),打到家hitHome(),当然在这些方法里,都要作相应的操作来表示接受到子弹的后果,:

还有,当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方,用户方要减少生命值,没接受一枪,就执行

t.setLife(t.getLife()-50);//受一粒子弹寿命减少50

接受4枪就死,总生命值200,当然方法里面还要做其他很多的判断,如生命值是否小于0,如果是的话就执行t.setLive(false);从而结束游戏。

坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:

位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义privatestaticToolkittk=Toolkit.getDefaultToolkit();其他的方法只能的大同小异。

菜单功能包括游戏的重新开始,暂停,退出等。

这些功能的用户界面放在了MyPanel的构造方法里,用到的是面板类和相应的监听功能,实现出来很简单。

 

3.2主要方法和变量

属性

intFram_width

游戏用户界面的全局静态变量宽度,初始化为600

intFram_length

游戏用户界面的全局静态变量长度,初始化为500

voidupdate(Graphicsg)

图形用户界面的更新方法

voidframPaint(Graphicsg)

画图形用户界面的方法,需要重画的界面元素都在这个方法里面

voidactionPerformed(ActionEvente)

监听菜单项的方法

staticvoidmain(String[]args)

主函数,启动整个程序

用户类主要是综合调用各个类来协作完成游戏的设计。

2.3游戏主窗口

游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道,并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据的输入、输出。

在程序中须创建一个类,继承自Frame来创建一个窗口。

2.3.1游戏数据的输入

游戏中坦克需要能往上、下、左、右四个方向运动,故须设立4个按键,使其能操作坦克,另须设一个键控制坦克开火。

为方便操作,本游戏设置WSAD分别表示上下左右,小键盘数字键4,表示开火。

具体实现为,为窗口添加KeyListener(键盘监听器),监听键盘的按下和抬起。

在类中添加内部的适配器类,由于不需要其它类访问,将其设计为private的,以保证面向对象设计的封装性。

2.3.2游戏数据的输出

玩家需要从游戏输出数据中获得游戏信息,如坦克在往上行驶、坦克发了颗子弹、坦克爆炸等,这些均需要通过游戏数据的输出来告知玩家。

由于继承自Frame,Frame类中的方法paint,可以在窗口中绘制图形,即满足了游戏需要图形界面的需求;另有方法repaint可以刷新窗口,以及时提供游戏信息,故须创建线程,不断地刷新窗口,来获取最新的游戏信息。

四.系统的功能测试与调整

4.1菜单项测试

菜单项可以选择开始新游戏,退出,暂停,继续,储存游戏记录,帮助功能,对于开始新游戏,退出两个功能,要给出提示,用户是否真的想继续操作!

菜单效果图:

 

4.2游戏运行测试

4.3坦克爆炸测试

4.4保存游戏信息设置

4.5帮助功能测试

五.设计体会与小结

本软件是使用java开发的小型游戏,其不仅实现了基本的功能需求,而且涉及到了java程序的编写的各个知识点,如事件监听、多线程、异常处理、数组、向量。

图形界面等,所创建的每一个类都体现了java面向对象编程的特点,为以后的网络编程等java的高级运用打下了基础。

由于本软件拓展方便、界面生动,多处使用了各种设计模式,是程序的编写效率更高,运行效率更高。

由于程序中多数是面向父类或者面向接口的编程,以后如果要更换某些模块、元素的功能,以及添加功能,是非常容易的。

六.附录

程序代码:

packagecome.test9;

/*

*1.坦克大战

*2.坦克可以上下左右移动

*3.坦克可以发子弹(可以连发)

*4.我的坦克击中敌人坦克时,敌人就消失(显示爆炸效果)

*5.我被击中后显示爆炸效果

*6.防止敌人坦克重叠运动

*7.玩游戏时可以暂停和继续

*8.可以分关

*9.记录玩家的成绩

importjava.awt.*;

importjava.io.*;

importjavax.imageio.ImageIO;

importjavax.swing.*;

importcome.test9.Help;

importcome.test9.Shot;

importcome.test9.EnemyTank;

importcome.test9.Recorder;

importcome.test9.MyPanel;

importcome.test9.MyTank;

importcome.test9.ReSuccess;

importjava.awt.event.*;

importjava.util.*;

publicclassTankGameextendsJFrameimplementsActionListener{

MyPanelmp=null;

//定义一个开始面板

MyStartPanelmsp=null;

//做出我需要的菜单

JMenuBarjmb=null;

//开始游戏

JMenujm1=null;

JMenujm2=null;

JMenuItemjmi1=null;

JMenuItemjmi2=null;

JMenuItemjmi3=null;

JMenuItemjmi4=null;

JMenuItemjmi5=null;

JMenuItemjmi21=null;

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

TankGamed2=newTankGame();

}

//构造函数

publicTankGame(){

jmb=newJMenuBar();

jm1=newJMenu("游戏(G)");

//设置快捷键

jm1.setMnemonic('G');

//设置菜单选项

jmi1=newJMenuItem("新游戏(N)");

jmi1.setMnemonic('N');

jmi2=newJMenuItem("暂停(S)");

jmi2.setMnemonic('s');

jmi3=newJMenuItem("继续(C)");

jmi3.setMnemonic('c');

jmi4=newJMenuItem("储存游戏记录(Q)");

jmi4.setMnemonic('q');

jmi5=newJMenuItem("退出游戏(E)");

jmi5.setMnemonic('E');

//对jmi1响应

jmi1.addActionListener(this);

jmi1.setActionCommand("newgame");

//对jmi2响应

jmi2.addActionListener(this);

jmi2.setActionCommand("suspend");

//对jmi3响应

jmi3.addActionListener(this);

jmi3.setActionCommand("continue");

//对jmi4响应

jmi4.addActionListener(this);

jmi4.setActionCommand("save");

//对jmi5响应

jmi5.setActionCommand("exit");

jmi5.addActionListener(this);

jm2=newJMenu("帮助(H)");

jm2.setMnemonic('h');

jmi21=newJMenuItem("操作说明(U)");

jmi21.setMnemonic('u');

jmi21.addActionListener(this);

jmi21.setActionCommand("help");

this.setJMenuBar(jmb);

jmb.add(jm1);

jmb.add(jm2);

jm1.add(jmi1);

jm1.add(jmi2);

jm1.add(jmi3);

jm1.add(jmi4);

jm1.add(jmi5);

jm2.add(jmi21);

msp=newMyStartPanel();

//启动msp的线程

Threadt=newThread(msp);

t.start();

this.add(msp);

this.setSize(600,500);

setResizable(false);

setTitle("坦克大战");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

publicvoidactionPerformed(ActionEvente){

//对用户不同的点击做不同的处理

if(e.getActionCommand().equals("newgame")){

if(this.mp!

=null){this.remove(mp);

}

//创建战场面板

mp=newMyPanel("newgame");

//启动面板的线程

Threadt=newThread(mp);

//先删除旧的面板

this.remove(msp);

t.start();

this.add(mp);

//注册监听

this.addKeyListener(mp);

Recorder.setEnSize(5);

Recorder.setMyLife

(1);

Recorder.setAllEnemy(0);

//要显示战斗场面先要移除开始画面

this.remove(msp);

//显示刷新JFrame

this.setVisible(true);

}//战斗暂停

elseif(e.getActionCommand().equals("suspend"))

{

//让子弹和坦克的速度变为0

MyTank.setSpeed(0);

EnemyTank.setSpeed(0);

Shot.setSpeed(0);

//让坦克不能改变方向

EnemyTank.setTingzhi(true);

MyTank.setMytingzhi(true);

EnemyTank.setStrar(false);

MyTank.setStrar(false);}

/战斗重新开始

elseif(e.getActionCommand().equals("continue"))

{

//恢复子弹和坦克的速度

MyTank.setSpeed(3);

EnemyTank.setSpeed

(1);

Shot.setSpeed(3);

EnemyTank.setStrar(true);

MyTank.setStrar(true);}

/储存游戏

elseif(e.getActionCommand().equals("save"))

{

//调用保存游戏函数

Recorder.saveRecording();

//跳出保存成功窗口

ReSuccessre=newReSuccess();

}

elseif(e.getActionCommand().equals("exit")){

//用户点击了退出游戏菜单

//保存击毁敌人数量

Recorder.saveRecording();

System.exit(0);

}

//帮助

elseif(e.getActionCommand().equals("help"))

{Helph=newHelp();

}}}

//开始面板

classMyStartPanelextendsJPanelimplementsRunnable{

inttimes=0;

publicvoidpaint(Graphicsg){

super.paint(g);

g.fill3DRect(0,0,440,360,false);

if(times%2==0){

//提示信息

g.setColor(Color.yellow);

FontmyFont=newFont("华文新魏",Font.BOLD,50);

g.setFont(myFont);

g.drawString("第一关",140,140);}

}

@Override

publicvoidrun(){

while(true){

//休眠

try{

Thread.sleep(100);

}catch(InterruptedExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

times++;

//重画

this.repaint();

}}}

//我的面板

classMyPanelextendsJPanelimplementsKeyListener,Runnable{

Stringflag;

//定义一个我的坦克

MyTankmytank=null;

//定义敌人的坦克组

Vectorets=newVector();

//定义炸弹集合

Vectorbombs=newVector();

intenSize=5;

//定义三张图片,组成一颗炸弹

Imageimage1=null;

Imageimage2=null;

Imageima

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1