package Tetris;
import javax.microedition.lcdui.Graphics;
import java.util.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Tetris {
private static final int [][] SHAPE_DATA = {
{0x038, 0x092, 0x038, 0x092},
{0x093, 0x03c, 0x192, 0x078},
{0x096, 0x138, 0x0d2, 0x039},
{0x1b0, 0x1b0, 0x1b0, 0x1b0},
{0x198, 0x05a, 0x198, 0x05a},
{0x0f0, 0x099, 0x0f0, 0x099},
{0x03a, 0x0b2, 0x0b8, 0x09a}
};
public static final int COLOR_DATA [] = {
0x0000ff,// blue
0xff7f50,// coral
0x006400,// darkgreen
0x8b008b,// darkmagenta
0xdc143c,// crimson
0x008b8b,// darkcyan
0xffd700 // gold
};
public static final int COLOR_GRAY = 0xd3d3d3;// light gray
public static final int COLOR_BLACK = 0x000000;// black
public static final int COLOR_BLUE = 0x1E90FF;// blue
public static final int COLOR_WHITE = 0xffffff;
public static final int COLOR_CORAL = 0xff7f50;
public int bx;
public int by;
public int shape;
public int direction;
private int [] cellColor = new int [4];
private int [][] shapeData = new int [3][3];
public Tetris() {
}
public Tetris(Tetris tetrisTemp) {
this.shape = tetrisTemp.shape;
this.direction = tetrisTemp.direction;
this.bx = tetrisTemp.bx;
this.by = tetrisTemp.by;
for (int i = 0; i < 4; i++)
this.cellColor[i] = tetrisTemp.cellColor[i];
this.initShapeData();
}
/*
public boolean moveUp() {
if (by <= 0) {
for (int col = 0; col < 3; col ++)
if (shapeData[-by][col] == 1)
return false;
}
by -= 2;
return true;
}
public boolean moveDown() {
if (by >= (TetrisGameCanvas.ROW - 3)) {
for (int col = 0; col < 3; col ++)
if (shapeData[TetrisGameCanvas.ROW - by - 1][col] == 1)
return false;
}
++ by;
return true;
}
public boolean moveLeft() {
if (bx <= 0) {
for (int row = 0; row < 3; row ++)
if (shapeData[row][-bx] == 1)
return false;
}
-- bx;
return true;
}
public boolean moveRight() {
if (bx >= (TetrisGameCanvas.COL - 3)) {
for (int row = 0; row < 3; row ++)
if (shapeData[row][TetrisGameCanvas.COL - bx - 1] == 1)
return false;
}
++ bx;
return true;
}
*/
public void moveUp() {
-- by;
}
public void moveDown() {
++ by;
}
public void moveLeft() {
-- bx;
}
public void moveRight() {
++ bx;
}
public void rotate() {
direction = (direction + 1) % 4;
initShapeData();
}
/**
* 绘制方块
* @param graphics
*/
public void draw(Graphics graphics) {
int iCellColor = 0;
for (int row = 0; row < 3; row++)
for (int col = 0; col < 3; col++) {
if (shapeData[row][col] == 1)
drawCell(graphics,
cellColor[iCellColor++],
TetrisGameCanvas.BASE_X + (bx + col) * TetrisGameCanvas.CELL_WIDTH,
TetrisGameCanvas.BASE_Y + (by + row) * TetrisGameCanvas.CELL_WIDTH,
false,
true);
}
// 一字形状方块特殊处理
if (shape == 0) {
if (direction == 1 || direction == 3) {// 竖
drawCell(graphics,
cellColor[iCellColor++],
TetrisGameCanvas.BASE_X + (bx + 1) * TetrisGameCanvas.CELL_WIDTH,
TetrisGameCanvas.BASE_Y + (by + 3) * TetrisGameCanvas.CELL_WIDTH,
false,
true);
} else {// 横
drawCell(graphics,
cellColor[iCellColor++],
TetrisGameCanvas.BASE_X + (bx + 3) * TetrisGameCanvas.CELL_WIDTH,
TetrisGameCanvas.BASE_Y + (by + 1) * TetrisGameCanvas.CELL_WIDTH,
false,
true);
}
}
}
/**
* 绘制方块
* @param graphics
*/
public void draw(Graphics graphics, int baseX, int baseY) {
int iCellColor = 0;
for (int row = 0; row < 3; row++)
for (int col = 0; col < 3; col++) {
if (shapeData[row][col] == 1)
drawCell(graphics,
cellColor[iCellColor++],
baseX + col * TetrisGameCanvas.CELL_WIDTH,
baseY + row * TetrisGameCanvas.CELL_WIDTH,
false,
true);
}
// 一字形状方块特殊处理
if (shape == 0) {
if (direction == 1 || direction == 3) { // 竖
drawCell(graphics,
cellColor[iCellColor++],
baseX + TetrisGameCanvas.CELL_WIDTH,
baseY + 3 * TetrisGameCanvas.CELL_WIDTH,
false,
true);
}
else { // 横
drawCell(graphics,
cellColor[iCellColor++],
baseX + 3 * TetrisGameCanvas.CELL_WIDTH,
baseY + TetrisGameCanvas.CELL_WIDTH,
false,
true);
}
}
}
/**
* 绘制每个格子
* @param graphics
* @param color
* @param x
* @param y
*/
public static void drawCell(Graphics graphics, int[] color,
int x, int y, boolean erase, boolean fix) {
if (erase) {
graphics.setColor(COLOR_BLACK);
graphics.fillRect(x, y,
TetrisGameCanvas.CELL_WIDTH,
TetrisGameCanvas.CELL_WIDTH);
}
else {
graphics.setColor(color[0], color[1], color[2]);
graphics.fillRect(x + 1, y + 1,
TetrisGameCanvas.CELL_WIDTH - 1,
TetrisGameCanvas.CELL_WIDTH - 1);
graphics.setColor(COLOR_GRAY);
graphics.drawLine(x, y, x + TetrisGameCanvas.CELL_WIDTH, y);
graphics.drawLine(x, y, x, y + TetrisGameCanvas.CELL_WIDTH);
graphics.setColor(COLOR_BLACK);
// graphics.setColor(COLOR_GRAY);
graphics.drawLine(x, y + TetrisGameCanvas.CELL_WIDTH,
x + TetrisGameCanvas.CELL_WIDTH,
y + TetrisGameCanvas.CELL_WIDTH);
graphics.drawLine(x + TetrisGameCanvas.CELL_WIDTH, y,
x + TetrisGameCanvas.CELL_WIDTH,
y + TetrisGameCanvas.CELL_WIDTH);
}
if (fix == false) {
graphics.setColor(COLOR_WHITE);
graphics.drawLine(x - 1, y - 1, x + TetrisGameCanvas.CELL_WIDTH + 1,
y + 1);
graphics.drawLine(x - 1, y - 1, x + 1,
y + TetrisGameCanvas.CELL_WIDTH + 1);
graphics.drawLine(x - 1, y + TetrisGameCanvas.CELL_WIDTH - 1,
x + TetrisGameCanvas.CELL_WIDTH + 1,
y + TetrisGameCanvas.CELL_WIDTH + 1);
graphics.drawLine(x + TetrisGameCanvas.CELL_WIDTH - 1, y - 1,
x + TetrisGameCanvas.CELL_WIDTH + 1,
y + TetrisGameCanvas.CELL_WIDTH + 1);
}
}
public static void drawCell(Graphics graphics, int color, int x, int y,
boolean erase, boolean fix) {
if (erase) {
graphics.setColor(COLOR_BLACK);
graphics.fillRect(x, y,
TetrisGameCanvas.CELL_WIDTH,
TetrisGameCanvas.CELL_WIDTH);
} else {
graphics.setColor(color);
graphics.fillRect(x + 1, y + 1,
TetrisGameCanvas.CELL_WIDTH - 1,
TetrisGameCanvas.CELL_WIDTH - 1);
graphics.setColor(COLOR_GRAY);
graphics.drawLine(x, y, x + TetrisGameCanvas.CELL_WIDTH, y);
graphics.drawLine(x, y, x, y + TetrisGameCanvas.CELL_WIDTH);
// graphics.setColor(COLOR_BLACK);
// graphics.setColor(COLOR_GRAY);
graphics.drawLine(x, y + TetrisGameCanvas.CELL_WIDTH,
x + TetrisGameCanvas.CELL_WIDTH, y + TetrisGameCanvas.CELL_WIDTH);
graphics.drawLine(x + TetrisGameCanvas.CELL_WIDTH, y,
x + TetrisGameCanvas.CELL_WIDTH, y + TetrisGameCanvas.CELL_WIDTH);
if (fix == false) {
graphics.setColor(COLOR_WHITE);
graphics.drawLine(x - 1, y - 1, x + TetrisGameCanvas.CELL_WIDTH, y - 1);
graphics.drawLine(x - 1, y - 1, x - 1, y + TetrisGameCanvas.CELL_WIDTH);
graphics.drawLine(x - 1, y + TetrisGameCanvas.CELL_WIDTH - 1,
x + TetrisGameCanvas.CELL_WIDTH, y + TetrisGameCanvas.CELL_WIDTH - 1);
graphics.drawLine(x + TetrisGameCanvas.CELL_WIDTH - 1, y - 1,
x + TetrisGameCanvas.CELL_WIDTH - 1, y + TetrisGameCanvas.CELL_WIDTH);
}
}
}
private void initShapeData() {
int tempShapeData = SHAPE_DATA[shape][direction];
shapeData[0][0] = (tempShapeData & 0x100) >> 8;
shapeData[0][1] = (tempShapeData & 0x80) >> 7;
shapeData[0][2] = (tempShapeData & 0x40) >> 6;
shapeData[1][0] = (tempShapeData & 0x20) >> 5;
shapeData[1][1] = (tempShapeData & 0x10) >> 4;
shapeData[1][2] = (tempShapeData & 0x8) >> 3;
shapeData[2][0] = (tempShapeData & 0x4) >> 2;
shapeData[2][1] = (tempShapeData & 0x2) >> 1;
shapeData[2][2] = (tempShapeData & 0x1) >> 0;
}
public static Random random = new Random(new Date().getTime());
/**
* 生成随机的不小于0的整数
* @return 返回生成的随机数
*/
public static int getRandom() {
int iReturn = random.nextInt() >>> 1;// 随机生成不小于0的整数
return iReturn;
}
/**
* 生成新形状的相应数据
*/
public void newShape() {
// 随机形状
shape = getRandom() % 7;
// 形状随机方向
direction = getRandom() % 4;
// 形状中每个格子的颜色随机生成
for (int i = 0; i < 4; i++) {
cellColor[i] = COLOR_DATA[getRandom() % 6];
}
initShapeData();
setInitXY();
}
public void setShape(Tetris tetrisTemp) {
this.shape = tetrisTemp.shape;
this.direction = tetrisTemp.direction;
this.bx = tetrisTemp.bx;
this.by = tetrisTemp.by;
for (int i = 0; i < 4; i++)
this.cellColor[i] = tetrisTemp.cellColor[i];
this.initShapeData();
}
/*
public int setX(int tempX) {
bx = tempX;
return bx;
}
public int getX() {
return bx;
}
public int setY(int tempY) {
by = tempY;
return by;
}
public int getY() {
return by;
}
*/
public boolean getShapeData(int row, int col) {
if (shapeData[row][col] == 1)
return true;
else
return false;
}
public int getCellColor(int index) {
return cellColor[index];
}
private void setInitXY() {
bx = TetrisGameCanvas.COL/2 - 1;
by = 0;
// for (int row = 0; row < 3; row ++)
// for (int col = 0; col < 3; col ++) {
// if (shapeData[row][col] == 1) {
// by = -row;
// break;
// }
// }
}
/*
public int getShape() {
return shape;
}
public int getDirection() {
return direction;
}
*/
}