?? ketrismap.java.bak
字號:
import javax.microedition.lcdui.*;
import java.io.IOException;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import java.io.InputStream;
/**
* 游戲地圖,地圖高16個小磚塊,寬16小磚塊,但是游戲容器高16,寬12(包括左右2堵墻)
* 所以容器的內直徑為10
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author: an unknown Japanese,Jagie
* @version 1.0
*/
public class KetrisMap {
//地圖數據
protected int mapdata[][];
protected boolean mapBlockExist[]; //長度為16的boolean數組,如果mapBlockExist[i]=true,則第i+1行有磚塊
private int score; //分數
public static final Font SCOREFONT = Font.getFont(Font.FACE_SYSTEM,
Font.STYLE_PLAIN,
Font.SIZE_LARGE);
public static Player player;
static {
try {
InputStream is =
KetrisMap.class.getResourceAsStream("/chimes.wav");
player = Manager.createPlayer(is, "audio/x-wav");
}
catch (IOException ioe) {
ioe.printStackTrace();
}
catch (MediaException me) {
me.printStackTrace();
}
}
public KetrisMap() {
mapdata = new int[16][12];
mapBlockExist = new boolean[16];
}
public void init() {
//清除計分
score = 0;
//先把全部元素清0
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 12; j++) {
mapdata[i][j] = 0;
}
mapBlockExist[i] = false;
}
//設置2堵墻
for (int i = 0; i < 16; i++) {
mapdata[i][0] = 8;
mapdata[i][11] = 8;
}
//設置容器底
for (int i = 0; i < 12; i++) {
mapdata[15][i] = 8;
}
mapBlockExist[15] = true;
}
/**
* 獲取地圖某行某列的數據
* @param x int 行號
* @param y int 列號
* @return int 地圖數據,非0表示有磚塊
*/
public int get(int x, int y) {
int data = mapdata[y][x];
return data;
}
/* 設置地圖數據 */
public void set(int x, int y, int val) {
if (x >= 0 && y >= 0) {
mapdata[y][x] = val;
mapBlockExist[y] = true;
}
}
/**
* 該方法其實只負責非運動磚塊
* @param g Graphics
*/
public void paint(Graphics g) {
//清屏
KetrisCanvas.clear(g);
g.setColor(0x000000);
g.fillRect(0, 0, getWidth(), getHeight());
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 12; j++) {
if (mapdata[i][j] == 8) {
KetrisBlock.drawBrick(KetrisCanvas.GAMEAREA_X +
j * KetrisCanvas.BRICK_WIDTH,
KetrisCanvas.GAMEAREA_Y +
i * KetrisCanvas.BRICK_WIDTH, g, 7);
}
}
}
}
public boolean check(Graphics g, int row) {
boolean deleteFlag = false;
//最多可以連消4行
int tmpRowNo;
if (row + 4 >= 15) {
tmpRowNo = 15;
}
else {
tmpRowNo = row + 4;
}
for (int y = row; y < tmpRowNo; y++) {
boolean flag = true;
for (int x = 1; x < 11; x++) {
if (mapdata[y][x] == 0) { /* 空白區 */
flag = false;
}
}
/* 需要消行 */
if (flag) {
mapBlockExist[y] = false;
for (int x = 1; x < 11; x++) {
mapdata[y][x] = 0;
}
deleteRow(g, y);
deleteFlag = true;
//加分
score += 10;
paintScore(g);
//發聲
try {
if (player != null) {
player.start();
}
}
catch (MediaException me) {
System.out.println("sound not availible");
}
}
}
return deleteFlag;
}
//刪除行,只是簡單的把該行置黑
protected void deleteRow(Graphics g, int y) {
g.setColor(KetrisCanvas.BACKGROUD);
g.fillRect(KetrisCanvas.GAMEAREA_X + KetrisCanvas.BRICK_WIDTH,
KetrisCanvas.GAMEAREA_Y + y * KetrisCanvas.BRICK_WIDTH,
10 * KetrisCanvas.BRICK_WIDTH, KetrisCanvas.BRICK_WIDTH);
}
/* 該方法在有消去行為后調用 */
public void repaintMap(Graphics g) {
//從容啟底開始
for (int i = 14; i > 0; i--) {
int tmp;
//有磚塊的行才移動
if (mapBlockExist[i]) {
//只有下一行為空白行才進行移動
if (!mapBlockExist[i + 1]) {
tmp = i + 1;
if (!mapBlockExist[i + 2]) {
tmp = i + 2;
if (!mapBlockExist[i + 3]) {
tmp = i + 3;
}
}
deleteRow(g, i);
//行復制
for (int j = 1; j < 11; j++) {
mapdata[tmp][j] = mapdata[i][j];
mapdata[i][j] = 0;
}
mapBlockExist[i] = false;
mapBlockExist[tmp] = true;
drawBlock(g, tmp);
}
}
}
}
public void drawBlock(Graphics g, int y) {
for (int x = 1; x < 11; x++) {
if (mapdata[y][x] != 0) {
KetrisBlock.drawBrick(KetrisCanvas.GAMEAREA_X +
x * KetrisCanvas.BRICK_WIDTH,
KetrisCanvas.GAMEAREA_Y +
y * KetrisCanvas.BRICK_WIDTH, g,
mapdata[y][x] - 1);
}
}
}
private void paintScore(Graphics g) {
//清除記分牌
g.setColor(KetrisCanvas.BACKGROUD);
g.fillRect(KetrisCanvas.GAMEAREA_X + 12 * KetrisCanvas.BRICK_WIDTH,
KetrisCanvas.GAMEAREA_Y + 6 * KetrisCanvas.BRICK_WIDTH,
KetrisCanvas.BRICK_WIDTH * 4, KetrisCanvas.BRICK_WIDTH * 4);
//計分
g.setColor(0, 255, 0);
g.setFont(SCOREFONT);
g.drawString("" + score,
KetrisCanvas.GAMEAREA_X + 14 * KetrisCanvas.BRICK_WIDTH,
KetrisCanvas.GAMEAREA_Y + 8 * KetrisCanvas.BRICK_WIDTH,
g.BASELINE | g.HCENTER);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -