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。若是想下載源碼可到個人博客上下載。