1樓
大 中
小 發表於 2007-1-19 00:39
一個簡單的遊戲源代碼
實現一個簡單的翻牌遊戲,每次最多翻開兩個數字,如果數字相同則消失,否則兩個數字不顯示,可以繼續遊戲。
遊戲規則如下:
1、遊戲資料使用兩個一維數組存儲:
u map存儲邏輯資料
u displayMap存儲繪製的資料,-1代表已經翻開,0代表未翻開,大於0代表已經翻開。
2、繪製規則:
u 在螢幕中心繪製圖形
u 每個單元格寬度和高度都是20,每個單元格之間間隔4
3、遊戲結束判別規則:
u 單元格全部消失或者只有一個單元格剩餘
實現代碼如下:引用:package simplegame;
import java.util.Random;
import javax.microedition.lcdui.*;
/**
* 翻圖遊戲
* 遊戲資料分別存儲在兩個數組,
* 1、數組map存放實際的地圖資料,每行顯示的資料長度為關卡數字+1
* 2、已經翻開的地圖資料存儲在displayMap數組中,-1代表已經翻開,0代表未翻開,大於0代表已經翻開
* @author 陳躍峰
* @version 1.0
*/
public class SimpleGameCanvas extends Canvas implements Runnable {
/**地圖資料,地圖資料的長度是(level + 1) * (level + 1)*/
private int[] map;
/**顯示的資料,0代表未顯示,-1代表消失,大於0代表翻開的資料*/
private int[] displayMap;
/**關卡*/
private int level = 1;
/**已經翻開的數字數量*/
int num = 0;
/**選擇框序號,編號規則為從左到右,從上到下*/
int index = 0;
/**第一個被翻開的方塊*/
int firstIndex = 0;
/**第二個被翻開的方塊*/
int secondIndex = 0;
/**螢幕寬度*/
private int width;
/**螢幕高度*/
private int height;
/**每個單元格寬度*/
private final int TILE_WIDTH = 20;
/**每個單元格高度*/
private final int TILE_HEIGHT = 20;
/**每個單元格之間的間隔*/
private final int INNER_WIDTH = 4;
/**
* 預設構造方法
*/
public SimpleGameCanvas() {
//初始化資料
width = this.getWidth();
height = this.getHeight();
init(level);
//啟動執行緒
new Thread(this).start();
}
protected void paint(Graphics g) {
//清屏
g.setColor(0xffffff);
g.fillRect(0、0、width、height);
g.setColor(0);
//繪製數字
drawNumber(g);
//繪製關卡數字
g.drawString("第" + level + "關"、this.getWidth() / 2、15,
Graphics.BASELINE | Graphics.HCENTER);
}
private void drawNumber(Graphics g) {
//螢幕中心點坐標
int xCenter = width / 2;
int yCenter = height / 2;
//左上坐標
int x = xCenter -
((level + 1) * TILE_WIDTH + ((level + 1) - 1) * INNER_WIDTH) /
2;
int y = yCenter -
((level + 1) * TILE_HEIGHT + ((level + 1) - 1) * INNER_WIDTH) /
2;
//循環繪製
for (int i = 0; i < displayMap.length; i++) {
//繪製邊框和數字
g.setColor(0);
if (displayMap >= 0) {
g.fillRect(x + (i % (level + 1)) * (TILE_WIDTH + INNER_WIDTH),
y + (i / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH),
TILE_WIDTH,
TILE_HEIGHT);
//繪製內部的數字
if (displayMap > 0) {
g.setColor(0xffffff);
g.drawString(String.valueOf(displayMap)、
x +
(i % (level + 1)) * (TILE_WIDTH + INNER_WIDTH) +
7、
y +
(i / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH) +
2、
Graphics.TOP | Graphics.LEFT
);
}
}
}
//繪製選擇框
g.setColor(0xff0000);
g.drawRect(x + index % (level + 1) * (TILE_WIDTH + INNER_WIDTH) - 1,
y + (index / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH) - 1,
TILE_WIDTH + 1,
TILE_HEIGHT + 1);
}
/**
* 根據關卡初始化地圖資料
* @param level 等級
*/
private void init(int level) {
//初始化地圖資料大小
map = new int[(level + 1) * (level + 1)];
//初始化地圖資料
for (int i = 0; i < map.length; i++) {
map = i % (map.length / 2) + 1;
}
//隨機打亂地圖資料
Random ran = new Random();
int index = 0;
int temp;
for (int i = 0; i < map.length; i++) {
index = Math.abs(ran.nextInt() % map.length);
//交換資料
temp = map;
map = map[index];
map[index] = temp;
}
//初始化顯示地圖資料大小
displayMap = new int[(level + 1) * (level + 1)];
}
public void keyPressed(int keyCode) {
int action = this.getGameAction(keyCode);
switch (action) {
case UP:
if (index - level - 1 >= 0) {
index = index - level - 1;
}
break;
case DOWN:
if (index + level + 1 <= (level + 1) * (level + 1) - 1) {
index = index + level + 1;
}
break;
case LEFT:
if (index > 0) {
index--;
}
break;
case RIGHT:
if (index < (level + 1) * (level + 1) - 1) {
index++;
}
break;
case FIRE: //確定
if (num < 2 && displayMap[index] >= 0) { //翻開的數量小於2
num++; //翻開的數量增加1
//記錄索引值
if (num == 1) {
firstIndex = index;
} else if (num == 2 && index != firstIndex) {
secondIndex = index;
}
//顯示該數字
displayMap[index] = map[index];
}
}
repaint();
}
/**
* 是否升級
* 剩餘1個或者是全部消失則升級
* @return true代表升級
*/
private boolean isLevelUp() {
int n = 0; //存儲沒有翻開的方塊數量
for (int i = 0; i < displayMap.length; i++) {
if (displayMap != -1) {
n++;
}
}
if (n > 1) {
return false;
} else {
return true;
}
}
public void run() {
try {
while (true) {
//暫停
Thread.sleep(100);
//邏輯處理
//處理邏輯
if (num == 2) {
try {
Thread.sleep(500);
} catch (Exception e) {}
if (map[firstIndex] == map[secondIndex]) { //內容相同
displayMap[firstIndex] = -1;
displayMap[secondIndex] = -1;
} else {
displayMap[firstIndex] = 0;
displayMap[secondIndex] = 0;
}
num = 0;
}
//升級
if (isLevelUp()) {
level++; //等級+1
init(level); //初始化地圖資料
num = 0; //翻開的數量歸零
index = 0; //預設選擇第一個方塊
}
//重新繪製
repaint();
}
} catch (Exception e) {}
}
}
|