当前位置:文档之家› Java游戏开发项目及游戏源码

Java游戏开发项目及游戏源码

Java游戏开发项目及游戏源码
Java游戏开发项目及游戏源码

J a v a程序设计项目

1.项目背景

为了提高学生动手能力,增加学生实践的机会,某软件公司实习单位要求学生5-6人组成开发团队进行Java程序项目开发,参考自己团队的实力与客户的要求,使用Java语言开发某一项目,此项目可以是应用程序,也可以是游戏开发等,项目名称自拟。

2.硬件资源和软件资源

(1)每组配备联网PC台,智能手机一部(带有手机数据

线)HP打印机一台。

(2)eclipse-SDK-3.6.1-win32软件开发程序(含有eclipseme插件)、SUNWTK 无线开发包或Symbian_3_SDK_v0_9等手机开发包。

3.实验室功能需求

(1)实现学生机和教师机器(服务器)进行通信,相互共享资源。

(2)教师机器(服务器)上安装一台打印机,实现学生机可以共享打印。

(3)实现教师机器(服务器)连接和访问Internet。

(4)实现每一台学生机器访问Internet。

(5)要求为每一项目组学生机和教师机器分配一个标识,即学生机器的机器名为ST1~ST10,教师机器名为Server。

4.项目实施要求

(1)要求各项目小组拿出详细的某某Java程序设计项目报告书(具体项目规划书格式参考附表一),关键步骤要有相应的截图。

(2)要求项目组长向各小组讲解与演示自己小组的项目成果,组长小组成员要熟练的解释与分析自己负责编写的Java代码或项目分工成果。

(3)最后提交用小组命名的文件夹,其中包括开发所用的所有资料与项目成果。

附表一:

雷霆战机项目报告书

一、项目概述

本项目为一个Java游戏,是一个基于J2ME平台的飞机射击类游戏。

二、项目开发团队

三、所用Java相关知识点

用了java的MIDP2.0的游戏类、GameCanvas类、游戏中的多线程应用、游戏引擎框架结构等等。

四、项目需求分析

1.游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。

2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。

3.玩家飞机的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定的智能性;敌人飞机的运行算法也要进行相关的设置,已免游戏过于简单。

4.对于双方发射的子弹应该赋予不同的速度,同时,程序应该设定敌人飞机的子弹不与敌人的飞机进行碰撞检测,已增加游戏的可玩性。

5.双方的飞机在前进时也需要考虑到是否碰撞到对方飞机,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。每一次刷新页面、每前进一步都需要进行相关的碰撞检测。

6.为了增加界面的美观,在程序中添加了白云。由于手机屏幕大小有限,所以白云的数量和出现的位置要经过相关的设置,才能实现白云不规则出现的效果。

7.游戏的地图不可能通过绘图来解决。否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和Java的优势。

8.Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。

9.游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。

五、类设计(包含结构图)

5.1游戏进入前的选择

每个MIDlet程序都必须有一个主类,该类必须继承自MIDlet。它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。该类中拥有可以管理程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进入暂停状态。)、结束的函数。本程序主类为lzhhdm,并实现接口CommandLIstener。

图5-1游戏背景介绍

首先显示的是游戏的背景介绍(图5-1),为此,在类lzhhdm定义Form类对象a,在startApp()函数中判断isSplash是否为真,如果为真的话,将创建Form类的实例a,并且调用append()方法在表单上放置StringItem类的实例以显示游戏背景信息。使用语句ok=newCommand("ok",Command.OK,1);实例化Command类对象ok。调用addCommand()命令建立ok命令与Form之间的关联,调用setCommandListener()命令使Form与CommandListener建立关联。调用Displayable的seturrent()函数显示背景介绍窗口。当玩家点击ok后将调用display.setCurrent(menuscreen)

以显示游戏菜单menuscreen(图5-2)。

图5-2游戏的菜单

类menuscreen继承自Canvas类,并实现接口Runnable和CommandListener。在类menuscreen中定义了lowColor和highColor、highBGColor三个整型变量及布尔型变量co。其中lowColor赋值为0x000000FF,代表兰色,higColor赋值为0x00FF0000,代表红色,highBGColor赋值为0x00CCCCCC,代表兰灰色,即背景条。当玩家按住上或下键时,在函数keyPressed

(intcode)中的整型变量menuIndex相应的减1或加1,相应的,在paint()函数中会根据menuIndex绘制选项是否被选中。在函数run()中,如果co为真,

则不停的repaint(),设置co的意义在于,当进入游戏主画面后,co赋值为

false,以终止绘制选项的repaint(),提高游戏速度。

当移动选项条到某项,并点击ok时,在commandAction()方法中根据menuIndex

的值判断选择了哪个选项,列如当选择“关于”时,将调用lzhhdm类中的renwuShow()方法以显示”关于”界面(图5-3),在renwuShow()方法中,Form

类对象a=null,表示清空Form,并重新调用用append()方法在表单上放置StringItem类的实例以显示游戏关于信息,“帮助“界面的显示与”关于“界面相同,只不过调用的是helpShow()方法。

图5-3关于界面

5.2mybullets类

在介绍游戏主类gameScreen类之前,应该先简要说明一下玩家子弹类

mybullets类,实际上,mybullets类是应该删除的,其要实现的功能应该放在

gameScreen类中,但是由于设计游戏的过程也是一个学习的过程,而在当时,

我并没有意识到这一点。

Mybullets类继承自Sprite类,以实现玩家子弹的相关功能。首先,创建子弹

状态数组privateint[][]bullets,其中,[i][0]代表子弹的X坐标,[i][1]代

表子弹的Y坐标,[i][2]代表子弹Y方向速度,[i][3]代表子弹存活状态(由于

此类是在早期设计的,而之后子弹存活状态使用了子弹射程作为标志位,所以其

并没有起到作用)。类中定义的方法setfirstposition()起到定义玩家子弹发射

坐标的作用(此方法在设计时起到的作用是消除每按一次开火玩家子弹位置就重

新定位这个BUG,但是,这个BUG完全可以用设置标志位的方法消除)。方法

newposition()实现的功能为更新玩家的子弹位置,并且检测玩家子弹与普通敌

人的碰撞及记录玩家战果(更新子弹位置的功能可以由使用move()加设置标志

位的方法取代;由于设计这个类的时候并没有考虑到添加BOSS等,所以在此检

测碰撞,但添加BOOS等功能后,此处的检测完全可以和飞机对飞机等的碰撞检

测封装在同一个方法中)。

mybullets类在gameScreen中建立了对象数组huokebullet[9],代表玩家

所能发射的9发子弹。

5.3游戏逻辑及 gameScreen 类是游戏的主类,决定着敌人何时出现,控制着敌人出现的方法,判断敌人及玩家是否被击中等。它运行在独立的线程中,以恒定的频率刷新画面。本程序设置为1/20秒。其主逻辑如图4-4所示。 5.3.1gameScreen 类

所实现的功能 gameScreen 类要实现地图的滚动、敌人飞机的相关

属性、玩家的相

关属性等功能。

gameScreen 类包括了

LayerManager ,这样所有静态和动态的图象都不需要手动刷新,只需要在LayerManager 中加入所有的需要控制的精灵,在统一由LayerManager 刷新即可,因此,在gameScreen 中创

建LayerManager 的对象lm ,并在构

造函数中实例子化。

其他精灵类的对象如敌人飞机、

玩家飞机、玩家飞机

的子弹、敌人的

子弹、BOSS 及BOSS 所属的子弹都需在gameScreen()类中建立相应的对象,并在构造喊数中实例化,且由lm.appned()方法添加到LayerManager 类对象lm 中。 4.3.2地图的创建

由于手机存储空间的限制,不可能将整张地图完整地存储在手机中,为了节约空间,往往提出地图中相同的图片组成一张PNG 格式的图片,然后象拼图一样拼出地图来,专业的游戏设计者往往自己写一个地图编辑器,以使拼图过程不是那么痛苦。

图5-4gameScreen 类主要关系流程图

创建地图就需要使用TiledLayer。TiledLayer指的是由一块一块类似用瓷砖拼凑起来的画面。地图实际即为TiledLayer的一个对象。先利用TiledLayer 的构造函数建立TiledLayer,根据构造函数的参数可以给定Cell数组的大小,并且地图图片切割成等尺寸的画面,并调用setCell()

地图

图片如图5-5所示。

因此,创建一个返回TtiledLayer的方法createBackGround(),以便在gameScreen()的构造函数中调用。在方法中,定义整型数组map1[]以存储Cell 的索引值。并使用tiledLayer.setCell(column,row,map1[i])设定TtiledLayer 的内容,以形成地图。其中i的值由循环for(inti=0;i

画出地图后,由lm.append()将地图添加到LayerManager类对象lm中。由于地图位于Layer的最低层,即离用户视线最远的层,所以Tiledlayer最后一个被添加到lm中。

4.3.3地图的移动

根据游戏的设定,游戏中地图是向下移动的,实现此功能的方法如下:

首先,在使用createBackGround()函数创建地图数组时,用

(row+1)*16-getHeight()

语句对整型变量row2赋值,其中row+1代表地图有多少列,16为地图片的高度,而减去getHeight()是因为要留出一个屏幕的可视区域,由于J2ME规定坐标系中下方向为正,所以使用语句y1=-row2将row2的数值变为负数。

其次,render()函数中,使用

lm.setViewWindow(0,0,getWidth(),getHeight()+10000)设定可视区域的范围,(0,0)表示ViewWindow的起始坐标,(getWidth(),getHeight()+10000)使用lm.paint(g,0,y1)决定ViewWindow从屏幕的哪里画起。在run()函数中的

while(conti)中,使用语句y1=y1+1使得每次绘图都使地图下移1个象素。(参考图5-6)

图5-6

5.3.4gameScreen类的构造函数

gameScreen类的构造函数要将游戏中出现的所有精灵都实例化,实际上,这种方法

严重的占用了内存,但在当时,我并没有意识到这一点。

由于敌人要求不停的出现,但是不可能设置过多的精灵,解决的办法是设定6个Sprite类对象j0、j1、j2及jbullet1、jbullet1、jbullet2,分别代表三架敌机及其配属的子弹。所以在gameScreen类的构造函数分配这6个Sprite

类的存储空间,并且使用newSprite(Imageimg,intwidth,intheight)实例化这6个类变量。同关尾cboss与游戏进行中的大飞机其他的Sprite类对象都需要使用相同的方法实例化。同样处于节约内存的考虑,sboss与cboss同用3个Sprite类对象bossbullet0,1,2。

在构造函数中,定义boolean型变量conti=true。conti的作用在于控制是否进行游戏画面的重绘及其他需要在画面重绘前进行的运算。

在构造函数中,将mybullets类里的no和score初始化,现在看来no的初始化没有必要,但是score的初始化是必须的,因为这个变量存储着玩家每次游戏的成绩,如果不在此进行初始化,则玩家重新开始游戏后score并不归0。

5.3.5关于commandAction()方法

每个创建Command实例的J2ME的应用程序也必须创建实现CommandListener接口的实例。每当用户通过commandAction()方法的方式与命令进行交互的时候,就会通过CommandLIstener.所以实现CommandListener的类必须实现commandAction()方法。

在commandAction()方法中,使用getabel()方法获取命令的标签。如果getLabel()=“暂停”时,表示玩家点击了暂停键,此时,conti赋值为false,游戏画面的绘制及游戏相关的运算暂停,并且,使用removeCommand(c)语句将“暂停”移除,使用addCommand(newCommand("继续",Command.OK,2));将”继续“按纽”添加进来。当玩家点击“继续“时,conti赋值为true,并且,一定要调用start()方法,否则继续功能不可用。必须调用start()方法的原因是:J2ME的线程已stop()方法拿掉,如果想停止线程的运做,就必须依靠一个旗标(flag),在本程序中,flag就是boolean型变量conti。所以一旦此标识变量被

图5-8游戏界面

设为false ,那么while(conti)循环就会结束,线程也会跟着结束。当用户按下“继续”的时候,start()将重新产生一个线程继续执行相关的运算和画面绘制。 当玩家通关时或者任务失败时,将显示相应信息,并使用上面的方法将“暂停”键变为“返回”键盘,当点击“返回”键时,将返回主菜单选项,调用类lzhhdm 里的方法menuscreensecond(),在此方法中,实例化一个MenuScreen 类对象,并且使选项“新游戏”改变为”重新开始“(图5-7)。完成此项功能的语句子为MenuScreen.mainmenu[0]=”重新开始”。当选择”重新开始“时,使用

gamescreen=newgameScreen(this)将使所有变量重新被初始化,如地图的绘制、敌人出现位置的重置、敌人的数量、玩家飞机的当前位置等。使用gamescreen.start()重新开始程序的循环。 5.3.6Sprite 类对象的碰撞检测及相关属性

游戏进行中,即在while(conti){}中,需要进行玩家飞机、子弹与敌机及敌机子弹与玩家飞机的碰撞检测,即使用函数collidesWith(Sprite,boolean)。由于设计的问题,玩家发射的子弹与普通敌机的碰撞检测被写在了mybullets 类中,并且只检测第一发子弹是否与敌人相碰撞,如果碰撞为真时,则使用setVisible(false)函数将敌机隐藏,使用setImage()函数将子弹精灵的三张图片置换为爆炸图片(图5-8)。当敌人剩余飞机消失后,即所有的敌人都飞出了屏幕后,使用函数setVisible(true)将敌机重新设置为可见。在按“开火”键时,使用setImage()函数将huokebullets 重新设定为子弹图片(每次击落敌机后屏幕上的爆炸效果有3团,并且按“开火”后爆炸图片就消失了,实际上setVisavle(false)的应该是子弹数组,而对敌人精灵使用setImage(),这样效果会好一些)。

敌机与玩

家的碰撞检测原理同上,都是使用的

collidesWith()函数,遗憾的是,我在写这段代码的时候,并没有考虑设置玩家有4次机会,所以对敌人飞机setVisable(fasle)了,而将玩家的飞机换成了爆炸图片,之后,添加了玩家4次机会这个功能,由于玩家被击落后会重新从屏幕下方进入屏幕,所以爆炸的图片一闪而过,效果不是很好。 5.3.7玩家10次游戏机会的实现方法

根据游戏设置,玩家在每关中有共四次机会,当玩家飞机被击中或撞击爆炸后,程序首先检测整型变量playerno的值,并根据playerno的值决定屏幕右上角所画玩家飞机标志的数量(参考图4-8),playerno的初始值设为3,因为碰撞后才减1,所以玩家共有4次机会,当playerno<0时,游戏结束,同时将变量pver 赋值为1,render()或renderboss()函数中,over=1代表在屏幕上GAMEOVER等相关信息,同时,将整型变量inputno赋植为1,以使手机的方向键失效,以消除玩家可以控制爆炸图像移动这个BUG。同时整型变量pzbz赋植为1,以消除玩家爆炸图像继续与敌人进行碰撞检测这个BUG。

当playerno>0时,碰撞后,将变量planert赋值为1,在之后的if(planert==1)判断语句中,重新设定玩家飞机的图片和可视状态,同时使用setPosition()函数设定玩家非的位置在屏幕下方。设定pzbz=1,即不检测碰撞,玩家有短暂时间无敌,无敌时间由屏幕右上角进度条表示。设定inputno=1,即飞入屏幕的过程中手机键盘是不可以用的。设置planert=2,即以上这些设置只执行一便。

在if(planert==2)判断语句中,使用语句move(0,-2)使飞机自己向上运动,使用if(c1.getY()<(planepo-24))判断飞机是否到达屏幕最下方(planepo是屏幕下边缘的坐标),如条件为真,则将inputno设置为1,表示键盘可用,将planert 赋值为3,使其不再执行以上各步。

5.3.8input()

input()函数的作用是检测用户的输入。首先使用if(inputno==0)判断用户的输入是否被禁止,如为真,则用户输入不被禁止。其次,调用getKeyStates()查询按键的状态。

当玩家按方向键时,玩家飞机就向不同的方向运行,这需要使用

c1.move(intx,inty)函数,当玩家控制飞机向左或右飞时,需要使c1.setFrame()函数改变飞机的图形(参见图5-7,此时飞机右飞)。同时,还需要判断飞机是否飞出屏幕,如,当飞机右飞时,用if(c1.getX()>(getWidth()-c1.getWidth())) 语句判断(getWith()为屏幕的宽度,c1.getWidth()为玩家飞机c1的宽度),如果条件为真,则使用c1.setPosition((getWidth()-c1.getWidth()),c1.getY())语句将飞机设置在紧靠屏幕右边的位置。上、下、左的设置原理同上。

语句if((keystate&LEFT_PRESSED)==0)的作用是消除左、右飞后在上、下飞时飞机的形态不变的BUG。如果为真,则执行语句c1.setFrame(0),表示只要左键松开飞机的形态都是平飞。

根据游戏设定,玩家一次最多只能发三组子弹,并且子弹有射程限制(在类mybullets中使用整型变量no表示),而当玩家按下“开火“键时,即

if((keystate&FIRE_PRESSED)!=0)中判断条件为真时,首先执行循环语句

for(inti=0;i<=6;i=i+3),即检测3组子弹中每组的第一发,即0,3,6。其次,检测huokebullet[i].no是否等于1,当等于1时使用语句

for(intz=i;z

huokebullet[z].no=huokebullet[z].bulletheight赋予子弹射程。当程序循环运行时no--,当一次发射了三组子弹后,只有某一组子弹消失,即no等于1后才能继续发射子弹。

现在看来,玩家发射子弹的设置是完全失败的,降低了效率。

5.3.9render()和renderboss()

在方法render()过程中,除了要重绘飞机、地图、子弹外还要在上方绘制关卡信息、战果、玩家飞机数、及无敌状态时的无敌时间、大飞机生命条等。

首先使用lm.setViewWindow()和lm.paint()设定可视范围ViewWindow和从哪里画起(见5.3.3)。

其次,使用g.drawString()绘制屏幕上方的关卡信息、战绩、玩家剩余生命标志。

drawString()中使用

String.valueOf(huokebullet[0].rscore()+huokebullet[3].

rscore()+huokebullet[6].rscore())返回玩家成绩score的字符串表示。

其中根据playerno的值绘出玩家的飞机标志数(应该有更好方法,但是没有想到)当每次刷新绘图页面时,应使用GameCanvas的flushGraphics()将屏幕后台的缓冲区内的图像刷新到前台来(flushGraphics()应该写在render(){}的最后)。

renderboss()方法重绘的是关尾的精灵cboss 、相关信息等,与render()的区别在与于函数lm.paint(g,0,0),起始坐标是不可变的,即,关尾的地图背景是不可变的。实际上,renderboss()是完全不需要的,只要在render()函数中设置相关标志位就可以解决关尾的绘图问题。

玩家飞机的生命标志使用drawImage()就可以绘制在屏幕上了。 5.4根据游戏设定,当y1=-1000时,会出现如图4-8所示的飞机(sboss),当玩家击落他后,屏幕会显示“援军到达“,并且玩家剩余飞机数加1。

使用if((y1==-1000)&&(sbz==0)){}设定sboss 的初始位置,根据游戏设定,sboos 从屏幕上方倒飞入屏幕,所以sboss 设定的初始位置(50,planepoup-65),其中planepoup 为屏幕上边缘的标志位。最后,要将sbz 赋值为1,消除sboos 不停设置初始位置的BUG 。

当sboss 飞入屏幕后,将sbz 赋值为2,以执行下面 的if(sbz==2)语句。

在判断语句if(sbz==2)里,将根据玩家的位置自动飞

行。首先,根据玩家飞机的位置对sbmove 赋值,当c1在右时,其对应的值为1、2、3、4在这4个if 语句中,要设置标志位(smovebz==0)。设置这个

标志位的目的是防止sboos 根据c1的位置不停的改变运行状态,即防止sboos 成为跟踪飞机。当sboos 根据c1的位置改变一次运行方向后,smovebz 赋值为1,即不检测c1

的位置。只有sboss 运行到屏幕的边缘时,才将smovebz 重新赋值为0,使其可以再次通过c1的位置决定sboos 的运行方向。

当玩家子弹击中sboss 后,使用sboss.setFrame(1),此时飞机变红,在本次repaint 结束前,使用sboss.setFrame(0)使飞机变为本来颜色,而程序设定每1/20秒画一次,由此得到飞机被击中后变色的效果。(参见图4-10)。 sboos 会根据玩家飞机的位置发射子弹,根据游戏设置,当玩家在其上方、左方、右方时,sboss 一次发射1发子弹,而玩家飞机在其下方时,sboss 一次发射3发子弹。

sboss与cboss共用3发子弹,因为当sboss出现时,离关尾还远,所以,为了提高效率,采用这种方法。

如果sboos被击落后,使用函数setVisable(false)将bossbullet0、bossbullet1、bossbullet2设置为不见,使用sboss.setImage()函数将sboos 的图片设置为爆炸图片。同时,玩家生命标志playerno加1,sbz赋值为-1,使得sboos无法发射子弹,sbpzbz赋值为1,使得玩家的子弹不与sboos进行碰撞检测。

同时在屏幕中使用drawString()绘制“援军到达”四个字,随着屏幕的运动,爆炸图片逐渐进入屏幕下方,当sboos.getY()>palnepo,通过改变标志位的值使得drawSteing()不在执行,四字消失。

如果玩家被击落后并没有点“返回“,而此时,背景会一直运动到关尾,考虑到其与关尾BOSS共用3发子弹,如sboos不消失,将会出现子弹乱飞的情况。所以,如果判断语句if((sboss.getY()==getHeight()))为真,则表示离地图的终点只有一个屏幕的距离时,sbz赋值为-1、sbpzbz赋值为1(含义上面已经说明)。同时调用sboss.move(0,-3),使sboos快速飞出屏幕,直到判断语句

if(sboss.getY()<-65)为真时,调用下面的函数setVisable(false),使得sboos 不可见。

5.5普通敌人相关属性

普通敌人是指游戏中不断出现的兰色飞机。

首先在程序中首先定义了aik、aip两个Random()类对象,ai和aipp两个整型变量。程序中使用switch(ai)语句判断下一次的飞机出现情况,为了达到不重复出现的效果,使用语句ai=aik.nextInt()%4(同样应该在构造函数中放置此语句和aipp=aip.nextInt()%5,以使每次游戏开始的时候敌人飞机的出现顺序是不固定的),以随机出现0,1,2,3四个整数(代表着飞机的四种出现情况)。情况1:使用aipp=aip.nextInt()%5取得随机数aipp,根据下面三条语句设置飞机的出现位置:j0.setPosition(100-aipp*30,planepoup+24);

j1.setPosition(100,planepoup);

j2.setPosition(100+aipp*30,planepoup-24);;

将getHeight()/8赋给整型变量kkk,每次循环kkk-1,当kkk<=1时飞机转向,当aipp>0时,飞机向左下方运行,使用语句setFrame(0)、move(-3,3)达成向左下方运动的效果。当aipp<0时,向右下方运动,实现方法同上。

情况2:初始位置设置方法同情况1。当kkk〈0时,飞机掉头向上飞,其中setFrame(3),

move(-4,0)。

情况3:初始位置设置方法同情况1。当kkk〈0时,飞机只向左转。设置情况3的原因是在更多的随机位置出现敌机。

情况4:初始位置设置方法同情况1。但其中的飞机j1具有跟踪能力,其实现方法如下:使用2个if语句if(j1.getX()c1.getX())判断J1在c1的左或右侧,并且实时根据判断情况使用setFrame()和move()改变飞机的形态,使用语句

if((j1.getX()c1.getX())&&(j1.getY()

设置整型数组jb[4],对应着4种出现情况的标志位。

如,执行情况1,首先执行判断语句if(jb[0]==1),在此语句中,首先使用setVisable(true)函数将敌人飞机设置为可见的,并根据上次运行的qipp的值设置敌人飞机的初始位置最后,jb[0]赋值为2。

接着执行判断语句if(jb[0]==2),在此语句中,首先使用move()函数使飞机向下运动,同时kkk减1,当kkk<=0时,飞机转向,此时,根据aipp的正负判断飞机向哪边转向。当飞机飞出屏幕时,jb[0]赋值为3。

需要注意的一点是,当取得ai的数值时,一定要写上这条语句:jb[ai]=1;因为当4种情况都出现一便的时候,标志位jb[]里的数值都将变为3,如果不将其重新赋值为1,敌人飞机将只能出现4次。

其他3种情况也大致如此。

普通敌人是否发射子弹由以下语句

if(((j1.getX()<=c1.getX()-18)||((j2.getX()-6)>=c1.getX()))&(jbz==0)),

即c1在j1左侧18象素范围内或j2左侧6象素范围时,j0、j1、j2一起发射子弹,jbz=1,表示在这组子弹消失前敌人不发射子弹。

如果jpb的值为0,则判断语句if(jpb==0)里的move()语句将一直执行下去。之后,还需要对每发子弹于玩家飞机进行碰撞检测,如果碰撞,则将碰撞的这发子弹设置为不可见。

5.6白云的实现原理

为了游戏界面更加美观,程序中设定了精灵数组cloud[i]来表示白云,由于白云应该在所有飞机的上方,即cloud[i]应该最早被append()到LayerManager中,或者使用insert(cloud[],0)在索引数值0处插入Layer,本程序采用了第一种方法,即在gameScreen类的构造函数中按游戏设置的顺序使用lm.append()加入到LayerManager之中。

程序中设定白云数为5。首先设置白云的初始位置,其语句如下:

cloud[0].setPosition(25,planepoup-(65));

cloud[1].setPosition(80,planepoup-(140));

cloud[2].setPosition(112,planepoup-(90));

cloud[3].setPosition(175,planepoup-(200));

cloud[4].setPosition(223,planepoup-(70));

其原理为:将屏幕的X数轴和Y数轴各分成5份,即在X轴的5个范围内每个范围出现一朵白云,Y轴的每个范围内也只能出现一朵。所以的白云的起始位置在每次游戏开始时是固定的。

白云位置设定后,使用move(0,1)使白云移动,由于白云初始位置设定在屏幕的不同区域内,故其移动出屏幕的先后顺序是不同的,使用

if(cloud[].getY()>planepo)判断白云是否飞出屏幕。如果为真则使用

cloud[].setPosition(cloudposition*40,planepoup)设置白云的位置,其中,cloudposition=aicloud.nextInt()%5,aicloud为Random()类对象。乘以40

表示其在X轴出现的范围是多少,cloud[0]、cloud[1]、cloud[2]、cloud[3]、cloud[4]乘以的值分别为40,30、55、15、22。以达成白云的随机出现效果。

5.7关尾BOSS及相关属性

关尾处飞机在屏幕上方横向移动,而背景地图不动,所以使用renderboss()重绘屏幕,其中,paint(g,0,0)表示屏幕绘制点在坐标轴(0,0)处。BOSS生命进度条由以下语句绘制:

g.setColor(255,0,0);

g.fillRect(2,2,60,5);//生命进度条背静红

g.setColor(255,255,255);

g.fillRect(2,2,bosslife,5);//生命进度条前景白

其中bosslife记录着BOSS的生命值,其初始值为0,当玩家每击中一次BOSS,其值加5,,即化出白色进度条,当bosslife==60时,表示过关,除玩家飞机与子弹外的其他Sprite均使用setVisable(false)使其不在显示,同样的pzbz 要赋予1,以消除玩家飞机还能与敌人碰撞的BUG。

如果cboss.getX()<0,则表示其在屏幕左方出界,应改为右飞。同理如果cboss.getX()

>(getWidth()-cboss.getWidth()),则表示其在屏幕右方出界,应改为左飞。

在飞机横向飞行中,使用以下语句判断飞机是否开火:

if(((cboss.getX()<=c1.getX()-10)||(cboss.getX()<=c1.getX()+60))&&(jbs z==0))

当每发一组子弹后,jbsz=1,则飞机无法开火,知道子弹飞出屏幕,jbsz才重新设定为0。而((cboss.getX()<=c1.getX()-10)||(cboss.getX()<=c1.getX()+60)表示当玩家飞机处于BOSS的左右各10个象素的范围内时。BOSS开火。关尾参见图5-10。

5.8本章小结

第四章中按照相应的步骤描述了所有关键类的具体算

法实现,引用了相关函数进行了具体流程的解释,并对原

理稍复杂的函数做了详细的分析。对游戏有关的各运行面也做了展示。

六、详细程序代码与分析

Lzhhdm.java

负责:

mport

import javax.microedition.midlet.MIDletStateChangeExceptio n;

/*

*主程序

*/

import javax.microedition.lcdui.*;

publicclass lzhhdm extends MIDlet implements CommandListener{ public Displaydisplay;

private ImagesplashLogo;

privateboolean isSplash=true;

public Forma;

private Alertalert;

int length;

private MenuScreenmenuscreen;

private gameScreengamescreen;

private Commandok,back;

privatebyte[]byteInputData;

public lzhhdm()

{

}

protectedvoid startApp()throws MIDletStateChangeExceptio n{

display=Display.getDisplay(this);

menuscreen=new MenuScreen(this);

if(isSplash)

{System.gc();

a=null;

a=new Form("黑夜行动");

ok=new Command("ok",Command.OK,1);

a.append(new StringItem(null,"2037年12月12日,一群不明飞行物出现在松田上空,松田空战部队奋起还击,接下来就是进行一场惊心动魄的大战。。。。。。"));

a.addCommand(ok);

a.setCommandListener(this);

display.setCurrent(a);

}

}

protectedvoid menuscreenShow()

{

display.setCurrent(menuscreen);

}

protectedvoid menuscreensecond(){

menuscreen=new MenuScreen(this);

MenuScreen.mainmenu[0]="重新开始";//玩完一遍或牺牲了后在玩一遍菜单第一项改为重新开始

display.setCurrent(menuscreen);

}

protectedvoid pauseApp(){}

protectedvoid destroyApp(boolean arg0)throws MIDletStateC hangeException{

}

protectedvoid helShow()

{System.gc();

a=null;

a=new Form("黑夜行动");

back=new Command("返回",Command.BACK,1);

a.append(new StringItem(null,"操作方式:上2下8左4右6开火5"));

a.append(new StringItem(null,"弹药数:一次最多打三组"));

a.addCommand(ok);

a.setCommandListener(this);

display.setCurrent(a);

}

protectedvoid renwuShow()

{System.gc();

a=null;

a=new Form("黑夜行动");

back=new Command("返回",Command.BACK,1);

a.append(new StringItem(null,"游戏名称:雷霆战绩之黑夜行动"));

a.append(new StringItem(null,"版本号:1.00"));

a.append(new StringItem(null,"制作者:09网络1第六组"));

a.addCommand(ok);

a.setCommandListener(this);

display.setCurrent(a);

}

protectedvoid gameShow()

{try{

System.gc();

gamescreen=null;

gamescreen=new gameScreen(this);

gamescreen.start();

display.setCurrent(gamescreen);

gamescreen.conti=true;

}catch(Exceptionexp)

{

"dfg");

}

}

publicvoid commandAction(Commandarg0,Displayablearg1){ a=null;

System.gc();

this.menuscreenShow();

}

}

MenuScreen.java

负责:

import javax.microedition.lcdui.*;

//MenuScreen类继承CanvasimplementsRunnable,CommandListener 类

extends Canvas implements Runnable,Comm

{

Font lowfont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_P LAIN,Font.SIZE_MEDIUM);

Font highfont=Font.getFont(Font.FACE_MONOSPACE,Font.STY LE_BOLD,Font.SIZE_MEDIUM);

int lowColor=0x000000FF;//定义变量的颜色为黑色

int highColor=0x00FF0000;//定义变量的颜色为黑色

int highBGColor=0x00CCCCCC;//定义变量的颜色为黑色

int width;

boolean co;

int height;

int startHeight;//定义开始游戏时飞机的高度

int spacing=highfont.getHeight()/2;

publicstatic String[]mainmenu={"新游戏","帮助","关于"};

int menuIndex;

Thread menuThread;

private Command ok=new Command("ok",Command.OK,1);

private lzhhdm midlet;

//构造方法

public MenuScreen(lzhhdmmidlet)

{ this.midlet=midlet;

width=getWidth();

height=getHeight();

startHeight=(highfont.getHeight()*mainmenu.length)+((m ainmenu.length-1)*spacing);

startHeight=(height-startHeight)/2;

menuIndex=0;

addCommand(ok);

setCommandListener(this);

menuThread=new Thread(this);

menuThread.start();

co=true;

}

publicvoid run()

{

while(co)

{

repaint();

}

}

//覆盖超类的抽象方法paint

publicvoid paint(Graphicsg)

{

g.setColor(0x00FFFFFF);//设置画笔的颜色为黑色

g.fillRect(0,0,width,height);//绘制填充的图形,将屏幕底色填充成白色

for(int i=0;i

{

if(i==menuIndex)

{

g.setColor(highBGColor);

g.fillRect(0,startHeight+(i*highfont.getHeight())+spac ing,width,highfont.getHeight());

g.setFont(highfont);

g.setColor(highColor);//绘制画笔的颜色为黑色

g.drawString(mainmenu[i],(width-highfont.stringWidth(m ainmenu[i]))/2,startHeight+(i*highfont.getHeight())+spaci ng,20);

}else

{

g.setFont(lowfont);

g.setColor(lowColor);

g.drawString(mainmenu[i],(width-lowfont.stringWidth(ma inmenu[i]))/2,startHeight+(i*highfont.getHeight())+spacin g,20);

}

}

}

//按键事件处理

publicvoid keyPressed(int code)

{

//这是返回到上一个界面

if(getGameAction(code)==Canvas.UP&&menuIndex-1>=0)

{

menuIndex--;

}

//显示下一个界面

elseif(getGameAction(code)==Canvas.DOWN&&menuIndex+1

{

menuIndex++;

}

}

publicvoid commandAction(Commandc,Displayabled)

{

if(c==ok)

推箱子java代码

import java.util.*; import java.io.*; public class Main{ int r;//地图行数 int c;//地图列数 int begx, begy;//箱子开始坐标 int endx, endy;//目标坐标 int begsx, begsy;//人开始坐标 char map[][];//地图 int[] dx ={-1, 1, 0, 0};//人和箱子都有四个方向可移动 int[] dy ={0, 0, 1, -1}; char[] P ={'N', 'S', 'E', 'W'};//表示箱子向某个方向移动 char[] M ={'n', 's', 'e', 'w'};//表示人向某个方向移动 Node f=new Node(0,0,0,0,""); Node g=new Node(0,0,0,0,""); node1 F=new node1(0,0,""); node1 G=new node1(0,0,""); int mark[][];//标志数组,表示地图上某一位置mark[i][j]是否访问过。 public Main(char[][] map,int r,int c,int begx,int begy,int endx,int endy,int begsx,int begsy){ this.map=map; this.r=r; this.c=c; this.begx=begx; this.begy=begy; this.endx=endx; this.endy=endy; this.begsx=begsx; this.begsy=begsy; mark=new int[r][c]; } public boolean ok(int x,int y) { if (x >= 0 && x < r && y >= 0 && y < c) return true; return false; } public boolean SToB(int bx,int by,int ex, int ey) {//人到箱子BFS int[][] Mark1= new int[r][c]; //标志数组,表示地图上某一位置Mark1[i][j]是否访问过。 Queue P = new LinkedList();

推箱子游戏报告书

推箱子游戏设计报告书 一、项目背景 本实训要求对“推箱子游戏”进行分析、设计。 本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。同时,本实训中了解图形界面设计基本技术。 通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。 二、设计目的 本课程的课程设计实际是重在提升学生对程序的理解力和游戏界面的设计能力,进行的一次全面的综合训练,其目的在于加深动手能力以及对游戏设计思想的理解,掌握运用VB 开发应用程序的基本方法及基本技巧。 三、游戏介绍 本游戏设计了关卡设计器对有难度进行设计,同时用方向键↑↓←→控制小人的移动,空格重新开始,回车选择下一关,page up 上一关,page down 下一关,Esc 退回。小人移动来推箱子使箱子到达指定位置,如果箱子全部到达指定位置就表示过关 3.1界面设计 3.1.1界面设计原则: 1用户帮助 2向导 3快捷键 4鼠标与键盘对应 5布局合理化 6显示信息一致性 7界面一致性 8美观与协调性 9合理性 10规范性 11易用性 12一般交互 13数据输入 本游戏是一个简单游戏所以只涉及一些简单的界面设计原则.

3.2用户界面 又称人机界面,实现用户与计算机之间的通信,以控制计算机或进行用户与计算机之间的数据传送的系统部件。 GUI:即图形用户界面,一种可视化的用户界面,它使用图形界面代替正文界面。 本系统坚持图形用户界面(GUI)设计原则,界面直观、对用户透明。用户接触软件后对界面上对应的功能一目了然、不需要多少培训就可以方便地使用本应用系统。

Java五子棋游戏源代码(人机对战)

//Java编程:五子棋游戏源代码 import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.io.PrintStream; import javax.swing.JComponent; import javax.swing.JPanel; /* *main方法创建了ChessFrame类的一个实例对象(cf), *并启动屏幕显示显示该实例对象。 **/ public class FiveChessAppletDemo { public static void main(String args[]){ ChessFrame cf = new ChessFrame(); cf.show(); } } /* *类ChessFrame主要功能是创建五子棋游戏主窗体和菜单**/ class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"20x15","30x20","40x30"}; private String[] strmode={"人机对弈","人人对弈"}; public static boolean iscomputer=true,checkcomputer=true; private int width,height; private ChessModel cm; private MainPanel mp; //构造五子棋游戏的主窗体 public ChessFrame() { this.setTitle("五子棋游戏"); cm=new ChessModel(1); mp=new MainPanel(cm); Container con=this.getContentPane(); con.add(mp,"Center"); this.setResizable(false); this.addWindowListener(new ChessWindowEvent()); MapSize(20,15); JMenuBar mbar = new JMenuBar(); this.setJMenuBar(mbar); JMenu gameMenu = new JMenu("游戏");

这是一个简单的猜拳游戏

这是一个简单的猜拳游戏(剪子包子锤),让你与电脑对决。你出的拳头由你自己决定,电脑则随机出拳,最后判断胜负。 下面的代码会实现一个猜拳游戏,让你与电脑对决。你出的拳头由你自己决定,电脑则随机出拳,最后判断胜负。 代码实现: #include #include #include int main() { char gamer; // 玩家出拳 int computer; // 电脑出拳 int result; // 比赛结果 // 为了避免玩一次游戏就退出程序,可以将代码放在循环中 while (1){ printf("这是一个猜拳的小游戏,请输入你要出的拳头:\n"); printf("A:剪刀\nB:石头\nC:布\nD:不玩了\n"); scanf("%c%*c",&gamer); switch (gamer){ case 65: //A case 97: //a gamer=4; break; case 66: //B case 98: //b gamer=7; break; case 67: //C case 99: //c gamer=10; break; case 68: //D case 100: //d return 0; default: printf("你的选择为%c 选择错误,退出...\n",gamer); getchar(); system("cls"); // 清屏 return 0; break;

} srand((unsigned)time(NULL)); // 随机数种子 computer=rand()%3; // 产生随机数并取余,得到电脑出拳 result=(int)gamer+computer; // gamer 为char 类型,数学运算时要强制转换类型 printf("电脑出了"); switch (computer) { case 0:printf("剪刀\n");break; //4 1 case 1:printf("石头\n");break; //7 2 case 2:printf("布\n");break; //10 3 } printf("你出了"); switch (gamer) { case 4:printf("剪刀\n");break; case 7:printf("石头\n");break; case 10:printf("布\n");break; } if (result==6||result==7||result==11) printf("你赢了!"); else if (result==5||result==9||result==10) printf("电脑赢了!"); else printf("平手"); system("pause>nul&&cls"); // 暂停并清屏 } return 0; } 代码分析 1) 首先,我们需要定义3个变量来储存玩家出的拳头(gamer)、电脑出的拳头(computer)和最后的结果(result),然后给出文字提示,让玩家出拳。 接下来接收玩家输入: scanf("%c%*c",&gamer); 注意:由于每次输入以回车结束,缓冲区中除了玩家输入的字母,还有回车符。回车符要跳过,以免影响下次输入。Scanf() 函数的格式控制字符串个数可以多于参数个数,scanf("%c%*c",&gamer);的作用是从缓冲区多输出一个字符(回车符),却不赋给任何变量。 玩家输入结束,使用switch 语句判断输入内容,65(A)、97(a)、66(B)、98(b)、67(C)、99(c)、68(D)、100(d)为相应字符的ASCII码。 注意:system("cls"); 语句的作用是清屏。System() 函数用来执行dos 命令,这里相当于在dos 里输入cls命令。 2) 玩家出拳结束,电脑开始出拳。

JAVA推箱子游戏

淮海工学院计算机工程学院 课程设计报告 设计名称:面向对象课程设计 选题名称:推箱子的设计与实现 系(院):计算机工程学院 设计时间:2014.3.10~2014.4.12 设计地点:软件实验室、教室

(3)功能模块 本程序包括四个功能模块:class mainFrame,class mainpanel,class Sound,class Readmap, 既主面板类,绘图的面板,播放背景音乐,用输入流读取地图文件。class mainpanel 主要是实现地图的初始化以及每一关地图的重载,class Sound主要是播放背景音乐。Adpressed的功能是响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。 表1 成员变量表 成员变量变量类型名称 开始状态Boolean Start 窗口高度int fHeight 窗口宽度int fWidth 计时器Timer timer 延时int delay 开始时间Date starttime 步数int steps 地图容器MapPanel mapPanel 玩法介绍String instruction 开始状态Boolean Start 表2方法表 方法名功能备注 Puzzle() 创建游戏窗口和设置图标 backaction() 后台操作getmap() 返回地图的方法 StartGame() 开始游戏控制,更新开始菜单 endgame() 结束游戏控制弹出结束窗口 getmap()/ 返回地图的方法调用类spite() menuShowClik() 在游戏中显示完整图片调用类class ShowImage actionPerformed() 动作演示 menuExit() 退出游戏 flush() 清空缓存 游戏过程设计 游戏中过程中,最为主要地方在于对地图矩阵,以及主角状态信息(包括位置、行走状态等)的维护,主角每行走一步,就更新一次地图信息和主角状态信息。另外一个比较重要的地方是游戏状态的保存方面。在该游戏中,使用栈结构保存主角每次行走的

java小游戏源码

连连看java源代码 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class lianliankan implements ActionListener { JFrame mainFrame; //主面板 Container thisContainer; JPanel centerPanel,southPanel,northPanel; //子面板 JButton diamondsButton[][] = new JButton[6][5];//游戏按钮数组 JButton exitButton,resetButton,newlyButton; //退出,重列,重新开始按钮 JLabel fractionLable=new JLabel("0"); //分数标签 JButton firstButton,secondButton; //分别记录两次被选中的按钮 int grid[][] = new int[8][7];//储存游戏按钮位置 static boolean pressInformation=false; //判断是否有按钮被选中 int x0=0,y0=0,x=0,y=0,fristMsg=0,secondMsg=0,validateLV; //游戏按钮的位置坐标int i,j,k,n;//消除方法控制 public void init(){ mainFrame=new JFrame("JKJ连连看"); thisContainer = mainFrame.getContentPane(); thisContainer.setLayout(new BorderLayout()); centerPanel=new JPanel(); southPanel=new JPanel(); northPanel=new JPanel(); thisContainer.add(centerPanel,"Center"); thisContainer.add(southPanel,"South"); thisContainer.add(northPanel,"North"); centerPanel.setLayout(new GridLayout(6,5)); for(int cols = 0;cols < 6;cols++){ for(int rows = 0;rows < 5;rows++ ){ diamondsButton[cols][rows]=new JButton(String.valueOf(grid[cols+1][rows+1])); diamondsButton[cols][rows].addActionListener(this); centerPanel.add(diamondsButton[cols][rows]); } } exitButton=new JButton("退出"); exitButton.addActionListener(this); resetButton=new JButton("重列"); resetButton.addActionListener(this); newlyButton=new JButton("再来一局"); newlyButton.addActionListener(this); southPanel.add(exitButton);

幼儿园中班游戏教案:猜拳游戏

幼儿园中班游戏教案:猜拳游戏 Game teaching plan of kindergarten middle class: guessing fist game

幼儿园中班游戏教案:猜拳游戏 前言:本文档根据题材书写内容要求展开,具有实践指导意义,适用于组织或个人。便于学习和使用,本文档下载后内容可按需编辑修改及打印。 目标: 1.观察游戏卡片上的图案,理解游戏中"石头、剪子、布"相互克制的关系。 2.在翻动、覆盖、叠加卡片的过程中提高判断能力和手 眼协调能力。 准备: 1.自制16宫格游戏底板一块。 2.用KT板自制的并用透明胶包起来的"石头、剪子、布"单面图案卡片各5张,另外增加1张"石头"卡片,一共16 张游戏卡片,所有游戏卡片的背面为白底。 3.每张游戏卡片的大小与游戏底板16宫格的格子大小一致。 玩法:

1.两名幼儿游戏。游戏前,幼儿共同把"石头、剪子、布"游戏卡片打乱,然后将其图案朝下,任意覆盖在16宫格游戏底板上。 2.游戏时,一名幼儿先选择翻开任意一张游戏卡片,另一名幼儿也选择翻开一张游戏卡片,随后,幼儿要快速判断自己所翻的游戏卡片能否克制对方翻开的游戏卡片。如果能够克制,则可以把自己的卡片叠放在对方的卡片上,覆盖住它的图案,比如"石头"可以覆盖"剪子","剪子"可以覆盖"布","布"可以覆盖"石头"。如果两张卡片不能形成互相克制的关系,则保持原有的翻开状态。 3.两名幼儿依次轮流游戏,幼儿每翻开一张卡片,都要观察和判断自己的卡片能否将游戏底板上翻开的任意一张卡片克制住。如果能克制住,则马上进行叠加,即覆盖在那张或那叠卡片上;如果没有能克制住的对象,就让卡片继续保持翻开状态。 4.当游戏底板上的卡片被全部翻完时,游戏双方就用猜拳方法来决定每次谁先行动。每次猜拳获胜者可以选择将游戏底板上任意一组形成相互克制关系的卡片叠加在一起。 5.当游戏底板上没有相互克制的卡片时,游戏结束。

c语言推箱子代码

#include #include void map1(); void map2(); void map3(); void show(); void move(); void main(int argc,char*argv[]) { time_t a,b; time(&a); system("color 1E"); loop1: { system("cls");//刷屏 printf("\n\n\n\n\n\n\t\t\t\t欢迎进入推箱子游戏\n\n\t\t\t\t 请按a b c选择游戏\n\n\t\t\t\t 按 d 键结束"); int t=getch(); if(t=='d') { printf("\n\t\t\t "); } else { if(t=='a') { map1(); goto loop1; } if(t=='b') { map2(); goto loop1; } if(t=='c') { map3(); goto loop1; } else { printf("\n\n\t\t\t\t 请重新输入:"); goto loop1; } }

time(&b); printf("\n\n\n\n\t\t\t\t 游戏总共用时%.3d秒\n\t\t\t ",b-a); getch();//等待读取回车符以结束程序 } void map1() { time_t p,q,o; time(&p); int i=4,j=4,m=6,n=2,t=1,k=3; system("cls");//刷屏 system("color 2E"); int x=1,y=7; char z,a[9][9]= { /*为背景设置初始资料*/ {'#','#','#','#','#','#','#','#','#'}, {'#','#','#', 3, 0 , 0 , 0 , 1 ,'#'}, {'#','#', 0 , 0 , 0 ,'#', 0 ,'#','#'}, {'#', 0 , 0 ,'#', 0 , 0 , 5 , 0 ,'#'}, {'#', 0 , 5 , 5 , 3 , 0 , 0 , 0 ,'#'}, {'#','#', 0 ,'#', 0 , 0 ,'#','#','#'}, {'#','#', 3 , 0 , 0 , 0 ,'#','#','#'}, {'#','#','#','#','#','#','#','#','#'}, {'#','#','#','#','#','#','#','#','#'} }; show(a);//调用输出函数 loop://语句标号 move(a,&x,&y,i,j,m,n,t,k,&z); if(a[i][j]=='!'&&a[m][n]=='!'&&a[t][k]=='!') { system("cls");//刷屏 show(a); printf("\t\t\t\t YOU ARE WIN!\n"); time(&q); printf("\t\t\t\t\t 用时%.3d秒\n",q-p); printf("\t\t\t\t*******回车重新选择*******\n\t\t\t\t"); getch(); } else { time(&o); if(z=='d') { return;

java小游戏源代码

j a v a小游戏源代码 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

Java小游戏 第一个Java文件: import class GameA_B { public static void main(String[] args) { Scanner reader=new Scanner; int area; "Game Start…………Please enter the area:(1-9)" + '\n'+"1,2,3 means easy"+'\n'+"4,5,6 means middle"+'\n'+ "7,8,9 means hard"+'\n'+"Please choose:"); area=(); switch((area-1)/3) { case 0:"You choose easy! ");break; case 1:"You choose middle! ");break; case 2:"You choose hard! ");break; } "Good Luck!"); GameProcess game1=new GameProcess(area); (); } } 第二个Java文件: import class GameProcess { int area,i,arrcount,right,midright,t; int base[]=new int[arrcount],userNum[]=new int[area],sysNum[]=new int[area]; Random random=new Random(); Scanner reader=new Scanner; GameProcess(int a) { area=a; arrcount=10; right=0; midright=0; t=0; base=new int[arrcount]; userNum=new int[area]; sysNum=new int[area]; for(int i=0;i

Java程序设计人机猜拳

Java程序设计实验报告 班级:11060341X 学号:50 姓名:马一桃 实验题目:猜拳小游戏 实验要求: 用java编写一个人机对战的猜拳小游戏。人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况。有简单的操作界面。 实验内容: 1、问题分析过程: 人机猜拳:人可以通过选择出拳,通过键盘输入相应数字来实现。电脑则随机性出拳,由电脑产生随即数来实现。 通过游戏规则判断双方的输赢,显示当局的输赢情况,并记录当局的分数,并各方的输赢情况。游戏结束时显示双方的分数以及输赢情况。 面向的对象有人、电脑以及游戏规则。人、电脑都有实现自己出拳的方法,同时还要有判断各方输赢的方法。 2、主要实现代码:(要求有必要的注释): import java.util.Scanner; //通过import语句引入Scanner类 public class Game{ public static void main(String args[]){ int x=0; //用户的初始分数为0 int y=0; //电脑的初始分数为0 int z=0; //开始时决战次数为0 System.out.println("\n"); System.out.println("猜拳游戏现在开始,准备好了吗?"); System.out.println("===========游戏规则==========="); System.out.println(" 胜利加一分,否则不加分 "); System.out.println(" 当游戏结束时分高者为胜 "); System.out.println("=============================="); Scanner shuzi = new Scanner(System.in); //用户通过键盘输入 System.out.println("是否要开始游戏?"+"\n"+" y/n"); String m = shuzi.next(); while(m.equals("y")) { System.out.println("请选择数字出拳:"); System.out.println("1 石头 2 剪刀 3 布"); int A = shuzi.nextInt(); //利用switch语句,用户实现出拳 switch(A){ case 1:

用java实现推箱子(sokoban)游戏

推箱子游戏 一、功能描述: 可以通过面板上的按钮或是键盘上的pageup,pagedown键选择上下关 可以通过面板上按钮或是键盘上的Backspace键后退,一直后退自己想要的位置,知道游戏开始时的位置。 可以通过面板上的按钮或是键盘上的字母r重新开始当前关卡游戏。 可以在复选框内选择想要玩的关卡。 二、界面及运行截图

三、源代码(三部分) 1、地图类 package box; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader;//读取字符文件类FileReader import java.io.IOException; public class map { int[][] map=new int[20][20]; int manX,manY;

public map(int level){ String filepath="mapc/"+level+".txt"; File file = new File(filepath); FileReader fr = null;//利用FileReader流来读取一个文件中的数据 BufferedReader br = null;//字符读到缓存里 try { fr = new FileReader(file); br = new BufferedReader(fr); for (int i = 0; i < 15; i++){ String line = br.readLine();//以行为单位,一次读一行利用BufferedReader 的readLine,读取分行文本 byte[] point = line.getBytes();//将字符串转换为字节数组 for (int j = 0; j < 15; j++) { map[i][j] = point[j] - 48;// 根据ASCall码表要减掉30H(十进制的48) if (map[i][j] == 5 || map[i][j] == 6 || map[i][j] == 7|| map[i][j] == 8){ manX = i; manY = j; } } } } catch (FileNotFoundException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch (IOException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch(NullPointerException e){ e.printStackTrace();//深层次的输出异常调用的流程 } finally { if (br == null){ try{ br.close(); } catch (IOException e){ e.printStackTrace(); } br = null; } if (fr == null){ try {

推箱子源代码

#include #include #include #include #include using std::cout; using std::endl; #ifndef SOKOBAN_H_ //防止文件重复包含 #define SOKOBAN_H_ #include using std::queue; //每一步的数据类型 struct node { int bx, by; //箱子的坐标 int px, py; //人的坐标 }; //推箱子类 class Sokoban { private: enum {L = 15, H = 7}; char GameMap[H][L]; //地图 int Pex, Pey; //人的位置 int Boxx, Boxy; //箱子的位置 int Succeed, Prove; //是否成功到目的地, 是否可玩性 int dx[4], dy[4]; //方向数组 protected: char Empty; char People; char Box; char Block; char Target; int dir; //记录按键方向 node s, e; public: Sokoban(); //构建函数 ~Sokoban() {} //析构函数,即为inline //地图初始化函数 void Initial(); //箱子路劲验证函数,参数为箱子坐标(bx,by),人坐标(px,py) void Box_Bfs(int bx, int by, int px, int py); //人路劲验证函数,人所到的目的地(ex,ey)

扫雷游戏Java源代码

扫雷游戏Java源代码 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.Timer; public class ScanLei1 extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private Container contentPane; private JButton btn; private JButton[] btns; private JLabel b1; private JLabel b2; private JLabel b3; private Timer timer; private int row=9; private int col=9; private int bon=10; private int[][] a; private int b; private int[] a1; private JPanel p,p1,p2,p3; public ScanLei1(String title){ super(title); contentPane=getContentPane();

推箱子--Java课程设计

《面向对象程序设计》 课程设计报告 题目:经典推箱子趣味游戏设计与实现 院(系):信息科学与工程学院 专业班级:计算机科学与技术1201班 学生姓名:程伟 学号:20121183011 指导教师:吴奕 20 14 年 12 月 29 日至20 15 年 1 月 9 日 华中科技大学武昌分校制

面向对象程序设计课程设计任务书

目录 1需求与总体设计 (1) 1.1需求分析 (1) 1.2总体设计 (2) 2详细设计 (4) 2.1 mainFrame类 (4) 2.2 mainpanel类 (5) 2.3S o u n d类 (7) 2.4 Readmap类 (7) 3 编码实现 (9) 3.1游戏源码 (9) 4系统测试 (42) 总结 (45)

1需求与总体设计 1.1需求分析 1.1.1功能结构图 推箱子游戏的功能结构图如图1.1所示。 在系统中,编写4个Java类:mainFrame,mainpanel,Sound,Readmap;分别对应初始化游戏界面,游戏操作,背景音乐,绘制地图。 图1.1

1.1.2 UML类图 推箱子系统除了上述4个Java类外,还需要Java系统提供的一些重要的类。这些类之间的UML图如图1.2所示。 图1.2 1.2总体设计 1.2.1 mainFrame类 mainFrame类负责创建系统的主窗口。mainFrame类有多种重要类型的对象,这些对象构成了游戏界面的简明与美观,并且通过监听实现方法赋予了这些组件的相应功能。MainFrame类通过调用Readmap类来实现将地图绘制在游戏主界面,通过调用Sound 类来实现对背景音乐的管理,实现音乐开关以及选择上一曲下一曲的操作。 设计中包括了所有你所能直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单,使得玩家能够很直观的见到所有游戏中的功能.界面中有菜单, 包括:"选项""设置音乐""帮助"。按钮包括:"重来""悔一步""第一关""上一关""下一关""最终关""选关""音乐"等。 1.2.2 mainpanel类 Mainpanel类中集成了小人与箱子的移动规则,并且还包含了对键盘操作移动的响应方法。在本游戏系统中,给人的视觉感受应该是能感受都动作的变化,逼真的人物动作会使系统更有效.通过控制人物,箱子,空地,障碍物在数组中的位置的改变来控制移动

推箱子游戏代码

#include #include #include #include #include #include typedef struct winer { int x,y; struct winer *p; }winer; char status [20][20]; char far *printScreen=(char far* )0xB8000000; void putoutChar(int y,int x,char ch,char fc,char bc); void printWall(int x, int y); void printBox(int x, int y); void printBoxDes(int x, int y); void printDestination(int x, int y); void printDestination1(int x,int y,winer **win,winer **pw); void printMan(int x, int y); void init(); winer *initStep1(); winer *initStep2(); winer *initStep3(); winer *initStep4(); void moveBoxSpacetoSpace(int x ,int y, char a); void moveBoxDestoSpace(int x ,int y, char a) ; void moveBoxSpacetoDes(int x, int y, char a); void moveBoxDestoDes(int x, int y, char a); int judge(int x, int y); void move(int x, int y, char a); void reset(int i); void putoutChar(int y,int x,char ch,char fc,char bc) { printScreen[(x*160)+(y<<1)+0]=ch; printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; } void printWall(int x,int y) { putoutChar(y-1,x-1,219,GREEN,BLACK); status[x][y]='w'; } void printBox(int x,int y) { putoutChar(y-1,x-1,10,WHITE,BLACK); status[x][y]='b'; } void printDestination1(int x,int y,winer **win,winer **pw) {

java推箱子游戏源代码(含推箱子的判断)

第一个Java文件: package xiaoA; import java.awt.Color; import java.awt.HeadlessException; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; public class GameFrame extends JFrame { JPanel zhuobu = new JPanel(); //工人 JLabel worker = null; //箱子 JLabel box = null; //目的地 JLabel goal = null; JLabel[] walls = null; public static final int SPEED = 12; //设置图片大小 int imgSize = 48; public void setImgSize(int imgSize){ this.imgSize = imgSize; } public GameFrame(String title) throws HeadlessException { super(title); //构造方法中调用本类的其它方法 this.initContentPane(); this.addKeyListener(new KeyListener() { //键盘按下事件 public void keyPressed(KeyEvent e) { //[2.5] 使工人可以移动 int xSpeed = 0, ySpeed = 0; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT :

Java小游戏俄罗斯方块附完整源代码_毕业设计

**** 届毕业设计Java小游戏俄罗斯方块

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 摘要 在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件,所以并不是人人皆知。直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如家电、汽车等传统行业,也正因为如此,游戏人才的教育、培养远落后于产业的发展。 俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的事件处理实现)。然后程序根据这七种方块堆叠成各种不同的模型。 论文描述了游戏的历史,开发此游戏的环境,游戏开发的意义。遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。 此次设计在Microsoft Windows 7系统下,以Java为开发语言,在eclipse开发平台上进行游戏的设计与实践。从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我在设计中在一个图片框中构造了一些的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个欲览窗体中提前展示形状供用户参考,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,最后就可以得出用户的分数。 关键词:游戏设计,算法,数组,事件

相关主题
文本预览
相关文档 最新文档