J2ME版贪吃蛇游戏
推荐 原创
©著作权归作者所有:来自51CTO博客作者风一样的少年的原创作品,如需转载,请与作者联系,否则将追究法律责任
J2ME贪吃蛇项目说明与分析:
游戏说明:
* 运行环境:手机移动平台,经过实验多种型号手机都可以运行。当然前提下是手机要支持JAVA功能才行。
* 本游戏支持RMS持久化数据库存,可以保存游戏计分,关数,速度。
* 用户可以自行设置游戏速度,游戏关数。
* 想在手机上运行,可以通过多种方式,将文件传送到手机中,当然最普通的方式就是通过USB连接将数据传送到手机上。由于我把项目的所有源代码都发布了,传送时只需要将项目文件当中.jar和.jad传进去。有的手机,可能不需要那个.jad的文件,这两个文件在项目当中的dist目录下。不需要将其他的文件发送到手机上去。
游戏分析:
首先分析此游戏,贪吃游戏一般都有一些食物对象,那么首先我们先来看一下抽象食物对象的类。
Guttler.java:
/*
* 此类是游戏场景上需要的
* 对象
*/
package GuttlerGame;
import javax.microedition.lcdui.Graphics;
public class Guttler
{
public int x,y; //确定对象的坐标位置的属性
private static int w=5,h=5; //确定对象的大小属性
/*
* 此构造方法构造一个具有
* 坐标位置的对象
*/
public Guttler(int x,int y)
{
this.x=x;
this.y=y;
}
/*
* 在游戏场景上画此对象的方法
*/
public void paint(Graphics g)
{
g.setColor(255, 255, 255);
g.fillRect(x, y, w, h);
g.setColor(10,10,30);
g.drawRect(x, y, w, h);
}
/*
* 获取此对象的一个Rectangle对象
*/
public Rectangle getRect()
{
return new Rectangle(x,y,w,h);
}
}
上面是抽象了一个在屏幕上的食物对象,在这个对象中要利用此对象的的x,y坐标和w,h宽高大小获得一个方框对象,由于J2ME sdk没有提供Rectangle矩形这个对象类,所以我就自己抽象了一个Rectangle矩形对象,此对象主要是为了碰撞检测时候用的,下面我们来看一下这个类的内容:
Rectangle.java:
/*
* 此类是一个Rectangle类对象
* 是为实现物体之间的相交,碰撞检测
* 的类
*/
package GuttlerGame;
public class Rectangle
{
public int x,y,w,h; //此对象的坐标位置和高宽属性
/*
* 构造方法构造一个具坐标位置和高宽属性的对象
*/
public Rectangle(int x,int y,int w,int h)
{
this.x=x;
this.y=y;
this.w=w;
this.h=h;
}
/*
* Rectangle与Rectangle对象重合的方法
*/
public boolean superposition(Rectangle rec)
{
if(this.x==rec.x&&this.y==rec.y)
{
return true;
}
return false;
}
/*
* Rectangle与Rectangle对象相交的方法
*/
public boolean intersect(Rectangle rec)
{
if(this.x>=rec.x&&this.y>=rec.y&&this.x<=rec.x+rec.w&&this.y<=rec.y+rec.h)
{
return true;
}
return false;
}
}
当然有了这些东西当然不行,因为一个手机程序的入口点对象必须继承MIDLet这个类,所以我们必须创建一个主类,继承MIDLet这个类,然后重写MIDLet类当中的方法,就相当于系统上的程序的main方法一样,每个程序都必须有一个main方法,而手机应用程序则不是main方法,但是手机应用程序也必须有一个入口方法,这与main方法是一样的。在这里我的主类代码就不必全部列出,只是列出一个MIDLet的特性地方,全部代码可以下载源代码。
下面是一个手机应用程序继承MIDLet必须重写的方法
/*
* 开始运行此类的方法
*/
public void startApp()
{
}
/*
* 暂停,中止的方法
*/
public void pauseApp()
{
}
/*
* 撤销此类的方法
*/
public void destroyApp(boolean unconditional)
{
}
关于界面的问题在这里就不进行列述,在这里还有一点手机数据存储的技术代码如下:
由于游戏当中有一个数据需要持久性的保存起来,供下一次程序运行加载,由于J2ME对文件不是很好,只能读取文件数据,不能写入数据,这时J2ME就提供了RMS技术类似于数据库的一个技术,实现代码如下:
首先得创建一张数据表,只有手机没有这张表的时候才会执行这段代码,也所以只有第一次运行的时候才会创建该表和初始化该表字段。
try {
rs = RecordStore.openRecordStore("GameDatabase", true);
if(rs.getNumRecords()==0){
String s1=Integer.toString(num);
rs.addRecord(s1.getBytes(), 0, s1.length());
s1=Integer.toString(fraction);
rs.addRecord(s1.getBytes(), 0, s1.length());
s1=Integer.toString(speed);
rs.addRecord(s1.getBytes(), 0, s1.length());
}
} catch (Exception ex) {
ex.printStackTrace();
}
创建之后,这时每一次运行时就只读取数据表当中的内容
try {
num = Integer.parseInt(new String(rs.getRecord(1)));
fraction = Integer.parseInt(new String(rs.getRecord(2)));
speed = Integer.parseInt(new String(rs.getRecord(3)));
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
而当程序关闭的时候,必须将程序现在的数据更新到数据库当中,这样下次运行才看见数据改变过了,而实现了数据的存取结果,实现如下:
/*
* 执行按钮操作的方法
*/
public void commandAction(Command c, Displayable s)
{
if(c==exitCommand)
{
String s2=Integer.toString(num);
byte[] b1=s2.getBytes();
try {
rs.setRecord(1, b1, 0, s2.length()); //更新数据内容
s2=Integer.toString(fraction);
b1=s2.getBytes();
rs.setRecord(2, b1, 0, s2.length());
s2=Integer.toString(speed);
b1=s2.getBytes();
rs.setRecord(3, b1, 0, s2.length());
rs.closeRecordStore();
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
this.notifyDestroyed();
}
这样就实现了数据持久化的目的。
因为写了两个版本一个是有障碍物对象的版本,一个是没有障碍物对象的版本,下面我来看一下关于抽象障碍物对象类的内容如下:
Bar.java:
package GuttlerGame;
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/*
* 此类是一个表现游戏
* 障碍物的类
*/
public class Bar
{
private Image img_bar=null; //一个障碍物的图像对象
private int img_x,img_y; //障碍物的图像对象的x,y坐标
private String url; //障碍物图像的路径
/*
* 在游戏中构造一个障碍物对象
*/
public Bar(int x,int y,String s)
{
this.img_x=x;
this.img_y=y;
this.url=s;
try {
img_bar = Image.createImage(url);
} catch (IOException ex) {
ex.printStackTrace();
}
}
/*
* 在游戏画布上画出此障碍物对象
*/
public void paint(Graphics g)
{
g.drawImage(img_bar, img_x, img_y, Graphics.LEFT|Graphics.TOP);
}
/*
* 获取此障碍物的一个Rectangle对象为
* 碰撞检测时所用的一个对象
*/
public Rectangle getRect()
{
return new Rectangle(img_x+5,img_y+5,img_bar.getWidth()-5,img_bar.getHeight()-5);
}
}
这个类主要是实现在屏幕上加一些障碍物对象,如果碰到障碍物就Game Over.
下面看一下运行情况:
这个是程序一开始的运行状态图片:
下面再来看一下Menu按钮打操作界面:
下面是游戏说明的界面:
下面定义游戏关数的界面:
下面定义游戏速度的界面:
下面没有障碍物版本的游戏运行界面
下面是有障碍版本的游戏运行界面
贪吃蛇游戏说明和分析就到这了,希望大家看完后,能够给我一些见意!这样也能促进我进步,同时也让自己进步了,何乐而不为呢!希望我们大家共同进步!如果有见意可以用QQ方式跟我交流一下!QQ:565345652。如果想下载源码可到我的博客上下载。
上一篇:JAVA网络版斗地主游戏
下一篇:JAVA版连连看算法研究
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
HTML+CSS+JS纯手写贪吃蛇
纯手写的简单贪吃蛇小游戏
贪吃蛇 html贪吃蛇 js贪吃蛇 纯手写贪吃蛇 简单贪吃蛇 -
使用J2ME技术开发《贪吃蛇》游戏
《贪吃
j2me 游戏 数据结构 存储 程序开发 -
贪吃蛇游戏
无标题文档
html Math css