📄 mycanvas.java
字号:
//移植时,须根据不同的手机调整ROW_NUM,WIDTH.
import java.util.Random;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
class myCanvas extends GameCanvas implements Runnable
{
private int[][]s1=new int[][]{ {1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}},
s2 = new int[][]{ {1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},
s3 = new int[][]{ {1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}},
s4 = new int[][]{ {1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},
t1 = new int[][]{ {0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},
t2 = new int[][]{ {1,0,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},
t3 = new int[][]{{1,1,1,0},{0,1,0,0},{0,0,0,0},{0,0,0,0}},
t4 = new int[][]{{0,1,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},
c1 = new int[][]{ {1,1,1,0},{1,0,0,0},{0,0,0,0},{0,0,0,0}},
c2 = new int[][]{ {1,1,0,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},
c3 = new int[][]{ {0,0,1,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},
c4 = new int[][]{ {1,0,0,0},{1,0,0,0},{1,1,0,0},{0,0,0,0}},
r1 = new int[][]{ {1,1,1,0},{0,0,1,0},{0,0,0,0},{0,0,0,0}},
r2 = new int[][]{ {0,1,0,0},{0,1,0,0},{1,1,0,0},{0,0,0,0}},
r3 = new int[][]{ {1,0,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},
r4 = new int[][]{ {1,1,0,0},{1,0,0,0},{1,0,0,0},{0,0,0,0}},
l1 = new int[][]{ {1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
l2 = new int[][]{ {0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},
l3 = new int[][]{ {1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
l4 = new int[][]{ {0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},
z1 = new int[][]{ {0,1,1,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},
z2 = new int[][]{ {1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},
z3 = new int[][]{ {0,1,1,0},{1,1,0,0},{0,0,0,0,},{0,0,0,0}},
z4 = new int[][]{ {1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},
f = new int[][]{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}};
private int[][][] cells= new int[][][]{s1,s2,s3,s4,t1,t2,t3,t4,
c1,c2,c3,c4,r1,r2,r3,r4,l1,l2,l3,l4,z1,z2,z3,z4,f,f,f,f,};
private static int gameRank;//for computer!
private String[] gameRankText=new String[4];//only for display!
private int sleepTime;
private static int newRandIndex;//新的随机下标!
private static int oldRandIndex;//老的随机下标!
private static int copyOldRandIndex;
private int counter;//计数器!计算getPane()函数的调用次数;
private Thread t;
private static final int ROW_NUM = 12; //画布上方格的列数。
private static int LINE_NUM ;//画布上方格的行数,根据屏幕的大小来定
private static final int WIDTH = 13;//方格的大小
private static final int X = 0;//画版的x坐标
private static final int Y = 0;//画版的y坐标
//用来存储新产生的方格的信息。(该方格信息用做提示下一个即将出现的方格,)
private int[][] newPane=new int[4][4];
//当前运动方格的“逻辑”坐标,每个pane 有四个小方格!“逻辑”坐标(从(0,0)开始!
//如:paneCoordinatep[2][0]=13,paneCoordinagep[2][1]=4,
//则第三个小方格的实际坐标为(13*WIDTH+X,4*WIDTH+Y)
//产生新的方格后,将方格的"0,1"信息转换成“逻辑”坐标信息转存在paneCoordinate中,便于画图
private int[][] dynamicPaneCoordinate=new int[4][2];
private int newPaneColor;
private int dynamicPaneColor;
//保存整个画布上需要画的静态方格的信息,值为方格的颜色!当grid[i][j]!=-1-1-1时,(因为颜色也可能为000,
//因此这里用-12-1表示)表示“逻辑”坐标(i,j)上要画上一个方格,颜色为grid[i][j]!
//这样grid[i][j]这一个信息值即可用来判断“逻辑”坐标(i,j)上是否要画,同时又是颜色值!节省内存!
private int[][] grid ;
private boolean pause = false;//是否暂停游戏
private int totalScore; //得分
private int maxScore;//最高分
private String scoreText ;
private String maxScoreText;
int color[];
private Graphics pen;
myCanvas()
{
super(false);
LINE_NUM=this.getHeight()/WIDTH;
grid =new int [LINE_NUM][ROW_NUM];
color=new int[12];
color[0]=0xFFFF00;
color[1]=0x3333FF;
color[2]=0x33ff33;
color[3]=0xff66ff;
color[4]=0xffcc00;
color[5]=0x996600;
color[6]=0xccff00;
color[7]=0xff00cc;
color[8]=0xFF0033;
color[9]=0xFF3333;
color[10]=0x006699;
color[11]=0x666633;
gameRank=0;
sleepTime=400;
gameRankText[0]="简单";
gameRankText[1]="中等";
gameRankText[2]="难";
gameRankText[3]="特难";
scoreText = "得分:";
maxScoreText = "最高分:";
counter=0;
totalScore=0;
maxScore=0;
pen = this.getGraphics();
clearGrid();
getPane();
conversion();
getPane();//提示方格!
drawGrid();
t = new Thread(this);
t.start();
}
protected void start()
{
pause = false;
t.start();
}
protected void pause()
{
pause = true;
}
void bubbleSort(int[] a,int n)
{
int m=0;
for(int i=n;i>=2;i--)
for(int j=0;j<i-1;j++)
{
if(a[j]>a[j+1])
{
//System.out.println(" bubbleSort() : " + j);
m=a[j];
a[j]=a[j+1];
a[j+1]=m;
}
}
}
// 产生新的方格!
private void getPane()
{
counter++;
oldRandIndex=newRandIndex;
copyOldRandIndex=oldRandIndex;
Random random = new Random();
newRandIndex = random.nextInt(27);
//System.out.println(" getPane() : " + newRandIndex);
newPane=cells [newRandIndex];//产生新的方格
//产生随机的颜色!
int colorIndex = random.nextInt(11);
newPaneColor=color[colorIndex];
if(counter==1)//专用于游戏产生的第一个方快的变形
{
oldRandIndex=newRandIndex;
copyOldRandIndex=oldRandIndex;
}
}
//将当前新的动态方格信息转存在paneCoordinate中!,并将颜色转存到dynamicPaneColor
private void conversion()
{
int k=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(newPane[i][j]==1)
{
//System.out.println(" conversion() : " + k);
dynamicPaneCoordinate[k][0]=ROW_NUM/2+j;
dynamicPaneCoordinate[k][1]=i;
k++;
}
}
}
dynamicPaneColor=newPaneColor;
}
private void clearGrid()
{
int i, j;
for (i = 0; i < LINE_NUM ; i++)
for (j = 0; j < ROW_NUM ; j++)
{
grid[i][j]=-1;
}
}
//是否可以向下移动;
private boolean moveDownAble()
{
for(int i=0;i<4;i++)
{
int lineNumber=dynamicPaneCoordinate[i][1]+1;//下一个要移动到的行号=y逻辑坐标+1
int rowNumber=dynamicPaneCoordinate[i][0];
//到了最底下,已不能再运动!如果没有这一句,当lineNumber>=LINE_NUM时,会下标越界
if( lineNumber>=LINE_NUM)
{
return false;
}
//System.out.println(" moveDownAble() : " + lineNumber+"+"+rowNumber);
if( grid[lineNumber][rowNumber]!=-1 )
{
return false;
}
}
return true;
}
// 是否可以向左边移动;
private boolean moveLeftAble()
{
for(int i=0;i<4;i++)
{
int lineNumber=dynamicPaneCoordinate[i][1];
int rowNumber=dynamicPaneCoordinate[i][0]-1;
if( rowNumber<=-1)
{
return false;
}
// System.out.println(" moveLeftAble() : " + lineNumber+"+"+rowNumber);
if(grid[lineNumber][rowNumber]!=-1)
{
return false;
}
}
return true;
}
// 是否可以向右边移动;
private boolean moveRightAble()
{
for(int i=0;i<4;i++)
{
int lineNumber=dynamicPaneCoordinate[i][1];
int rowNumber=dynamicPaneCoordinate[i][0]+1;
if( rowNumber>=ROW_NUM)
{
return false;
}
// System.out.println(" moveRightAble() : " + lineNumber+"+"+rowNumber);
if(grid[lineNumber][rowNumber]!=-1)
{
return false;
}
}
return true;
}
//清除没有空白的一行方块 ,并把上方的方块下移
private void clearLine()
{
int i=0,j=0,num=0;
//暂时保存dynamicPane的y坐标,因为在这里不能改变dynamicPane的数据
int tempY[]=new int[4];
for(i=0;i<4;i++)
{
tempY[i]=dynamicPaneCoordinate[i][1];
}
bubbleSort(tempY,4);//按升序排序
//当不能往下移动时,判断可不可以清行,最多可以清4行!
for( i=0;i<4;i++)
{
int lineNumber=tempY[i];
for( j=0;j<ROW_NUM;j++)
{
//System.out.println(" clearLine()1 : " + lineNumber+"+"+j);
if(grid[lineNumber][j]==-1)
{
break;
}
}
if(j==ROW_NUM)//可以清行!
{
num++;
for(int m=lineNumber;m>=1;m--)
{
int k;
for( k=0;k<ROW_NUM;k++)
{
if(grid[m-1][k]!=-1)
break;
}
if(k!=ROW_NUM)
{
for(int n=0;n<ROW_NUM;n++)
{
grid[m][n]=grid[m-1][n];
}
}
else
{
for(int n=0;n<ROW_NUM;n++)
{
grid[m][n]=grid[m-1][n];
}
break;
}
}
}
}
switch(num)
{
case 0: break;
case 1: totalScore+=1;break;
case 2: totalScore+=3;break;
case 3: totalScore+=6;break;
case 4: totalScore+=10;break;
}
String s=Integer.toString(totalScore);
scoreText="得分:";
scoreText+=s;
drawGrid();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -