程序 等等我给你找 一个俄罗斯方块的游戏 j2me的 不过和j2me没啥实质关系......................................................................
block.java/*
* Created on 2004-7-6
*
*/import java.util.Random;import javax.microedition.lcdui.Graphics;
/**
* @author ShiL_Genius
*
*/
public class Block {
//Block[S][x][y]
//第一个 [] 表示block的不同重翻转的状态
//第二个[] 表示block的行 第三个[]表示列
private static boolean LeftL[][][]={ //0
{
{true,false,false},
{true,false,false},
{true,true,false}
},
{
{false,false,true},
{true,true,true},
{false,false,false}
},
{
{false,true,true},
{false,false,true},
{false,false,true}
},
{
{true,true,true},
{true,false,false},
{false,false,false}
}
};
private static boolean RightL[][][]={ //1
{
{false,false,true},
{false,false,true},
{false,true,true}
},
{
{true,false,false},
{true,true,true},
{false,false,false}
},
{
{true,true,false},
{true,false,false},
{true,false,false}
},
{
{true,true,true},
{false,false,true},
{false,false,false}
}
};
private static boolean Shan[][][]={ //2
{
{false,true,false},
{true,true,true},
{false,false,false}
},
{
{true,false,false},
{true,true,false},
{true,false,false}
},
{
{true,true,true},
{false,true,false},
{false,false,false}
},
{
{false,false,true},
{false,true,true},
{false,false,true}
}
};
private static boolean LeftZ[][][]={ //3
{
{false,true,true},
{true,true,false},
{false,false,false}
},
{
{true,false,false},
{true,true,false},
{false,true,false}
}
};
private static boolean RightZ[][][]={ //4
{
{true,true,false},
{false,true,true},
{false,false,false}
},
{
{false,true,false},
{true,true,false},
{true,false,false}
}
};
private static boolean I[][][]={ //5
{
{false,false,false},
{true,true,true},
{false,false,false}
},
{
{false,true,false},
{false,true,false},
{false,true,false}
}
};
private static boolean Square[][][]={ //6
{
{true,true,false},
{true,true,false},
{false,false,false}
}
};
public boolean B[][][][]={LeftL,RightL,Shan,LeftZ,RightZ,I,Square};
private java.util.Random random;
public int curShape; //现在的block的形状
public int nextShape; //下一个block的形状
public int curState; //现在block的状态
public int B_X; //block的x
public int B_Y; //block的y
public Block(){
B_X=MyCanvas.G_W/2;
B_Y=0;
random=new Random();
curShape=nextShape();
nextShape=nextShape();
}
//block向下移动一个单位
public synchronized void down(){
B_Y+=MyCanvas.BRICK_WIDTH/3;
}
//向右
public synchronized void right(){
B_X+=MyCanvas.BRICK_WIDTH;
}
//向左
public synchronized void left(){
B_X-=MyCanvas.BRICK_WIDTH;
}
//前一个block落下 设置下一个block状态
public synchronized void setNewShape(){
curShape=nextShape;
nextShape=nextShape();
B_X=MyCanvas.G_W/2;
B_Y=0;
}
//random 产生下一个block形状的代号
private int nextShape(){
return Math.abs(random.nextInt()) % 7;
}
//循环状态
public synchronized void changeStatus(){
if(curState+1==B[curShape].length){
curState=0;
}else{
curState++;
}
}
/*
public int[][] getCurBlock(){
}
public int[][][] getNextBlock(){
return B[nextShape];
}
*/
public int getX(){
return B_X;
}
public int getY(){
return B_Y;
}
//画每个 block的 基本brick
private synchronized void drawBrick(Graphics g,int x,int y){
g.fillRect(B_X+x*MyCanvas.BRICK_WIDTH,B_Y+y*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
}
//通过 从GameCanvas传来的的Graphics 在缓冲画布上画画
public synchronized void drawBlock(Graphics g){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(B[curShape][curState][i][j]){
g.fillRect(B_X+j*MyCanvas.BRICK_WIDTH,B_Y+i*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
}
}
}
}}
block.java/*
* Created on 2004-7-6
*
*/import java.util.Random;import javax.microedition.lcdui.Graphics;
/**
* @author ShiL_Genius
*
*/
public class Block {
//Block[S][x][y]
//第一个 [] 表示block的不同重翻转的状态
//第二个[] 表示block的行 第三个[]表示列
private static boolean LeftL[][][]={ //0
{
{true,false,false},
{true,false,false},
{true,true,false}
},
{
{false,false,true},
{true,true,true},
{false,false,false}
},
{
{false,true,true},
{false,false,true},
{false,false,true}
},
{
{true,true,true},
{true,false,false},
{false,false,false}
}
};
private static boolean RightL[][][]={ //1
{
{false,false,true},
{false,false,true},
{false,true,true}
},
{
{true,false,false},
{true,true,true},
{false,false,false}
},
{
{true,true,false},
{true,false,false},
{true,false,false}
},
{
{true,true,true},
{false,false,true},
{false,false,false}
}
};
private static boolean Shan[][][]={ //2
{
{false,true,false},
{true,true,true},
{false,false,false}
},
{
{true,false,false},
{true,true,false},
{true,false,false}
},
{
{true,true,true},
{false,true,false},
{false,false,false}
},
{
{false,false,true},
{false,true,true},
{false,false,true}
}
};
private static boolean LeftZ[][][]={ //3
{
{false,true,true},
{true,true,false},
{false,false,false}
},
{
{true,false,false},
{true,true,false},
{false,true,false}
}
};
private static boolean RightZ[][][]={ //4
{
{true,true,false},
{false,true,true},
{false,false,false}
},
{
{false,true,false},
{true,true,false},
{true,false,false}
}
};
private static boolean I[][][]={ //5
{
{false,false,false},
{true,true,true},
{false,false,false}
},
{
{false,true,false},
{false,true,false},
{false,true,false}
}
};
private static boolean Square[][][]={ //6
{
{true,true,false},
{true,true,false},
{false,false,false}
}
};
public boolean B[][][][]={LeftL,RightL,Shan,LeftZ,RightZ,I,Square};
private java.util.Random random;
public int curShape; //现在的block的形状
public int nextShape; //下一个block的形状
public int curState; //现在block的状态
public int B_X; //block的x
public int B_Y; //block的y
public Block(){
B_X=MyCanvas.G_W/2;
B_Y=0;
random=new Random();
curShape=nextShape();
nextShape=nextShape();
}
//block向下移动一个单位
public synchronized void down(){
B_Y+=MyCanvas.BRICK_WIDTH/3;
}
//向右
public synchronized void right(){
B_X+=MyCanvas.BRICK_WIDTH;
}
//向左
public synchronized void left(){
B_X-=MyCanvas.BRICK_WIDTH;
}
//前一个block落下 设置下一个block状态
public synchronized void setNewShape(){
curShape=nextShape;
nextShape=nextShape();
B_X=MyCanvas.G_W/2;
B_Y=0;
}
//random 产生下一个block形状的代号
private int nextShape(){
return Math.abs(random.nextInt()) % 7;
}
//循环状态
public synchronized void changeStatus(){
if(curState+1==B[curShape].length){
curState=0;
}else{
curState++;
}
}
/*
public int[][] getCurBlock(){
}
public int[][][] getNextBlock(){
return B[nextShape];
}
*/
public int getX(){
return B_X;
}
public int getY(){
return B_Y;
}
//画每个 block的 基本brick
private synchronized void drawBrick(Graphics g,int x,int y){
g.fillRect(B_X+x*MyCanvas.BRICK_WIDTH,B_Y+y*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
}
//通过 从GameCanvas传来的的Graphics 在缓冲画布上画画
public synchronized void drawBlock(Graphics g){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(B[curShape][curState][i][j]){
g.fillRect(B_X+j*MyCanvas.BRICK_WIDTH,B_Y+i*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
}
}
}
}}
matrix.javaimport javax.microedition.lcdui.Graphics;/*
* Created on 2004-7-7
*
*//**
* @author ShiL_Genius
*
* 思想: 把整个屏幕看成是一个2维数组
*/
public class Matrix {
private boolean matrix[][]; //二维数组的screen
private boolean rowEx[]; //数组表示 行里是否有 block 有为true
private int M_Row; //总体行数
private int M_Col; //总体列数
private int wallX; //我想在画布的 1/4处画 一条竖线 左面显示
// 下一个要落下的block的形状和 积分 右边是游戏区
private int startX; //游戏区的开始 x坐标
private int del_1; //若一行满了要消除 最多能删3行 block数据结构决定
private int del_2; //从第一个开始使用 纪录消除的行号
private int del_3; //-1代表没有
private int lala; //积分
private Block block;
private int B_X;
private int B_Y;
public Matrix(int row,int col){ //从MyCanvas得到计算过的 行和列
M_Row=row;
M_Col=col;
// System.out.println("row: "+row+" col: "+col);
wallX=row/4;
// System.out.println("wallX: "+wallX);
startX=wallX+MyCanvas.BRICK_WIDTH;
// System.out.println("statrX: "+startX);
del_1=-1;
del_2=-1;
del_3=-1;
lala=0;
matrix =new boolean[row][col];
rowEx =new boolean[row];
block=new Block();
// B_X=block.B_X/MyCanvas.BRICK_WIDTH;
// B_Y=block.B_Y/MyCanvas.BRICK_WIDTH;
//清空
for(int i=0;i<row;i++){
for(int j=0;j<col;j++)
matrix[i][j]=false;
rowEx[i]=false;
}
//设置左边1/4的那条竖线
for(int i=0;i<row;i++){
matrix[i][wallX]=true;
matrix[i][M_Col-1]=true;
}
//set bottom line
for(int j=0;j<col;j++){
matrix[M_Row-1][j]=true;
matrix[M_Row-2][j]=true;
}
rowEx[M_Row-2]=true;
rowEx[M_Row-1]=true;
}
public synchronized void drawMatrix(Graphics g){
//set color I don't know what is it exactaly
g.setColor(126,0,56);
//画1/4的竖线
for(int i=0;i<M_Row;i++){
g.fillRect(wallX*MyCanvas.BRICK_WIDTH,i*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
//画右边的竖线
g.fillRect((M_Col-1)*MyCanvas.BRICK_WIDTH,i*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
}
//画整个游戏区
for(int i=M_Row-1;i>0;i--){
if(rowEx[i]){ //如果这一列存在block
for(int j=0;j<M_Col;j++){
if(matrix[i][j]){
drawBrick(g,i,j);
}
}
}
}
}
//具体画砖块
private synchronized void drawBrick(Graphics g,int i,int j){
g.fillRect(j*MyCanvas.BRICK_WIDTH,i*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
}
//如果block落下 不动后 设置行列的状态
public synchronized void setElement(int i,int j){
matrix[i][j]=true;
rowEx[i]=true;
}
//得到这个点的状态
public boolean getElement(int i,int j){
return matrix[i][j];
}
//落下每一个块后 监测有没有要消去的行
private synchronized void detectDel(){
int count=0;
for(int i=M_Row-2;i>0&&del_3==-1;i--){ //从倒数第二行开始检测
if(rowEx[i]){
count=0;
for(int j=0;j<M_Col;j++){
if(matrix[i][j]){
count++;
}
}
System.out.println(M_Col-wallX-2+" "+count);
if(count==M_Col-wallX-2){ //这一行所有元素已满
if(del_1!=-1){
del_1=i;
}else
if(del_2!=-1){
del_2=i;
}else{
del_3=i;
}
}
}
}
}
//落定一个块要调用的函数
public synchronized void OOO(){
down();
toDead();
detectDel();
refrush();
}
//删除满的那一行
private synchronized void refrush(){
//form up to down
if(del_3!=-1){
upDel(del_3);
del_3=-1;
lala+=2;
}
if(del_2!=-1){
upDel(del_2);
del_2=-1;
lala+=2;
}
if(del_1!=-1){
upDel(del_1);
del_1=-1;
lala++;
}
}
//拷贝删掉的上面所有的部分
private synchronized void upDel(int del){
int k=del-1;
for(;k>0;k--){
if(rowEx[k]){
for(int j=0;j<M_Col-1;j++){
matrix[del][j]=matrix[k][j];
}
}else break;
}
for(int j=0;j<M_Col-1;j++){
matrix[k][j]=false;
}
}
private synchronized void fillMatrix(){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(block.B[block.curShape][block.curState][i][j]){
// this.setElement(block.getY()/MyCanvas.BRICK_WIDTH-2+i,block.getX()/MyCanvas.BRICK_WIDTH-2+j);
// this.setElement(block.getY()/MyCanvas.BRICK_WIDTH+i,block.getX()/MyCanvas.BRICK_WIDTH+j);
this.setElement(B_Y+i,B_X+j);
rowEx[B_Y+i]=true;
}
}
}
}
private synchronized void updateBlock(){
B_X=block.B_X/MyCanvas.BRICK_WIDTH;
B_Y=block.B_Y/MyCanvas.BRICK_WIDTH;
}
// 碰撞检测 left
private synchronized boolean crashLeft(){
try{
synchronized(block){
if(B_X-1<wallX){
return true;
}else
if(block.B[block.curShape][block.curState][0][0]&&matrix[B_Y][B_X-1]){
return true;
}else if(block.B[block.curShape][block.curState][1][0]&&matrix[B_Y][B_X-1]){
return true;
}else if(block.B[block.curShape][block.curState][2][0]&&matrix[B_Y][B_X-1]){
return true;
}else if(block.B[block.curShape][block.curState][0][1]&&matrix[B_Y][B_X]){
return true;
}else if(block.B[block.curShape][block.curState][1][1]&&matrix[B_Y][B_X]){
return true;
}else if(block.B[block.curShape][block.curState][2][1]&&matrix[B_Y][B_X]){
return true;
}
}
}catch(Exception e){
System.out.println("lalala");
}
return false;
}
private synchronized boolean singleCrashLeft(){
try{
synchronized(block){
if(B_X-1<wallX){
return true;
}
if(block.B[block.curShape][block.curState][0][0]&&matrix[B_Y][B_X]){
return true;
}
if(block.B[block.curShape][block.curState][1][0]&&matrix[B_Y][B_X]){
return true;
}
if(block.B[block.curShape][block.curState][2][0]&&matrix[B_Y][B_X]){
return true;
}
}
}catch(Exception e){
System.out.println("lalala");
}
return false;
}
public void left(){
if(!crashLeft()){
block.left();
}
}
private synchronized boolean crashRight(){
try{
synchronized(block){
if(B_X+2+1>M_Col-1){
return true;
}else if(block.B[block.curShape][block.curState][0][2]&&matrix[B_Y][B_X+2+1]){
return true;
}else if(block.B[block.curShape][block.curState][1][2]&&matrix[B_Y][B_X+2+1]){
return true;
}else if(block.B[block.curShape][block.curState][2][2]&&matrix[B_Y][B_X+2+1]){
return true;
}else if(block.B[block.curShape][block.curState][0][1]&&matrix[B_Y][B_X+2]){
return true;
}else if(block.B[block.curShape][block.curState][1][1]&&matrix[B_Y][B_X+2]){
return true;
}else if(block.B[block.curShape][block.curState][2][1]&&matrix[B_Y][B_X+2]){
return true;
}
}
}catch(Exception e){
System.out.println("lalala");
}
return false;
}
private synchronized boolean singleCrashRight(){
try{
synchronized(block){
if(B_X+2>M_Col-1){
return true;
}else if(block.B[block.curShape][block.curState][0][2]&&matrix[B_Y][B_X+2]){
return true;
}else if(block.B[block.curShape][block.curState][1][2]&&matrix[B_Y][B_X+2]){
return true;
}else if(block.B[block.curShape][block.curState][2][2]&&matrix[B_Y][B_X+2]){
return true;
}
}
}catch(Exception e){
System.out.println("lalala");
}
return false;
}
public void right(){
if(!crashRight()){
block.right();
}
}
public void changeStatus(){
block.changeStatus();
try{
if(singleCrashLeft()){
block.right();
}else if(singleCrashRight()){
block.left();
}else if(crashDown()){
block.B_Y--;
}
}catch(Exception e){
System.out.println("FUCK I am in change");
}
}
private void toDead(){
System.out.println("B_X: "+B_X+" "+"B_Y: "+B_Y);
}
private synchronized boolean crashDown(){
synchronized(block){
if(B_Y+3>M_Row-1){
return true;
}
try{
if(block.B[block.curShape][block.curState][2][0]&&matrix[B_Y+3][B_X]){
return true;
}
else
if(block.B[block.curShape][block.curState][2][1]&&matrix[B_Y+3][B_X+1]){
return true;
}
else
if(block.B[block.curShape][block.curState][2][2]&&matrix[B_Y+3][B_X+2]){
return true;
}
else
//
if(block.B[block.curShape][block.curState][1][0]&&matrix[B_Y+2][B_X]){
return true;
}
else
if(block.B[block.curShape][block.curState][1][1]&&matrix[B_Y+2][B_X+1]){
return true;
}
else
if(block.B[block.curShape][block.curState][1][2]&&matrix[B_Y+2][B_X+2]){
return true;
}
else
//
if(block.B[block.curShape][block.curState][0][0]&&matrix[B_Y+1][B_X]){
return true;
}
else
if(block.B[block.curShape][block.curState][0][1]&&matrix[B_Y+1][B_X+1]){
return true;
}
else
if(block.B[block.curShape][block.curState][0][2]&&matrix[B_Y+1][B_X+2]){
return true;
}
}catch(Exception e){
System.out.println("I here guys! :) catch me :)");
}
}
return false;
}
public void down(){
if(!crashDown())
block.down();
else{
this.fillMatrix();
block.setNewShape();
}
updateBlock();
// System.out.println(M_Row);
// if(B_Y>=M_Row-4){
// block.setNewShape();
// }
}
public void drawBlock(Graphics g){
block.drawBlock(g);
}
/*
public void drawBlock(Graphics g){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(block.B[block.curShape][block.curState][i][j]){
g.fillRect(B_X+j*MyCanvas.BRICK_WIDTH,B_Y+i*MyCanvas.BRICK_WIDTH,
MyCanvas.BRICK_WIDTH,MyCanvas.BRICK_WIDTH);
}
}
}
}
*/
}