📄 mycanvas.java
字号:
private boolean gameOver()
{
int minYcoordinate=dynamicPaneCoordinate[0][1];
for(int i=1;i<4;i++)
{
if(minYcoordinate>dynamicPaneCoordinate[i][1])
{
minYcoordinate=dynamicPaneCoordinate[i][1];
}
}
if(minYcoordinate==0)
{
return true;
}
return false;
}
//画方格
public void drawBrick(int px, int py,int color)
{
pen.setColor(0x00c0c0c0);
pen.drawRect(px, py, WIDTH, WIDTH);
pen.setColor(color);
pen.fillRect(px + 1, py + 1, WIDTH - 1,WIDTH - 1);
}
//画整个游戏界面
protected void drawGrid()
{
int temp= this.getHeight()-LINE_NUM*WIDTH;//多余的不能画一个完整的方格的部分
//画背景色
pen.setColor(0x000000);
pen.fillRect(0, 0, this.getWidth(), this.getHeight());
//画大边框
pen.setColor(0x0FF00FF);
pen.drawRect(X,temp,ROW_NUM*WIDTH,this.getHeight()-temp-1);
pen.setColor(0x00c0c0c0);
pen.fillRect(0, 0,this.getWidth(),temp);
pen.setColor(0x00FFFF00);
//绘制得分信息:
pen.drawString(scoreText, X + ROW_NUM*WIDTH + 5, LINE_NUM*WIDTH/2,Graphics.TOP | Graphics.LEFT);
//画难易提示:
pen.drawString("等级:"+gameRankText[gameRank%4],X + ROW_NUM*WIDTH + 5, LINE_NUM*WIDTH/4,Graphics.TOP | Graphics.LEFT);
//画最高记录:
pen.drawString(maxScoreText,X + ROW_NUM*WIDTH + 5, LINE_NUM*WIDTH/4*3,Graphics.TOP | Graphics.LEFT);
//画静态的方格
int i, j;
for (i = 0; i < LINE_NUM; i++)
{
for (j = 0; j < ROW_NUM; j++)
{
if (grid[i][j] != -1)
{
drawBrick(X + j * WIDTH, Y + i * WIDTH+temp,grid[i][j]);
}
}
}
//画动态的方格
for(i=0;i<4;i++)
{
drawBrick(X+dynamicPaneCoordinate[i][0]*WIDTH,Y+dynamicPaneCoordinate[i][1]*WIDTH+temp,dynamicPaneColor);
}
// 画提示方格
int k=0;
int hintCoordinate[][]=new int[4][2];
for( i=0;i<4;i++)
{
for( j=0;j<4;j++)
{
if(newPane[i][j]==1)
{
hintCoordinate[k][0]=X+ ROW_NUM*WIDTH+5+j*WIDTH;
hintCoordinate[k][1]=Y+temp+10+i*WIDTH;
k++;
}
}
}
for(i=0;i<4;i++)
{
drawBrick(hintCoordinate[i][0],hintCoordinate[i][1],newPaneColor);
}
flushGraphics();
}
protected void keyPressed(int keyCode)
{
//如果游戏暂停,结束,或释放 则按键无效
if((pause==true)|| (gameOver()==true))
{
return;
}
//while(releaseKey==false)
//{
int keyState = getKeyStates();
//System.out.println(" keyPressed() : " + keyState);
//判断上下左右键是否被按下
if (keyState==UP_PRESSED)
{
int [][]tempPane=new int[4][4];
int temp=oldRandIndex/4;//属于哪一类方块(0 to 6)
//System.out.println(" keyPressed1() : " + temp);
//不能将copyOldRandIndex换成oldRandIndex,否则oldRandIndex会增加,导致temp变大,可能越界
int nowIndex=temp*4+(++copyOldRandIndex)%4;
//System.out.println(" keyPressed2() : " + nowIndex);
tempPane=cells[nowIndex];
int minXcoordinate=dynamicPaneCoordinate[0][0];
int minYcoordinate=dynamicPaneCoordinate[0][1];
for(int i=1;i<4;i++)
{
if(minXcoordinate>dynamicPaneCoordinate[i][0])
{
minXcoordinate=dynamicPaneCoordinate[i][0];
}
if(minYcoordinate>dynamicPaneCoordinate[i][1])
{
minYcoordinate=dynamicPaneCoordinate[i][1];
}
}
int tempIndex[][]=new int [4][2];
for(int m=0;m<4;m++)
{
tempIndex[m][0]=dynamicPaneCoordinate[m][0];
tempIndex[m][1]=dynamicPaneCoordinate[m][1];
}
// 以没变型前的方块的最小坐标(minXcoordinate,minYcoordinate)为基准更新tempIndex!
int k=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(tempPane[i][j]==1)
{
tempIndex[k][0]=minXcoordinate+j;
tempIndex[k][1]=minYcoordinate+i;
k++;
}
}
}
int maxYcoordinate=tempIndex[0][1];
int maxXcoordinate=tempIndex[0][0];
for(int i=1;i<4;i++)
{
if(maxYcoordinate<tempIndex[i][1])
{
maxYcoordinate=tempIndex[i][1];
}
if(maxXcoordinate<tempIndex[i][0])
{
maxXcoordinate=tempIndex[i][0];
}
}
//只有当变形后方块tempIndex的最大y坐标<LINE_NUM,最大x坐标<ROW_NUM,
//并且grid[tempIndex[i][0]tempIndex[i][1]]==0(i从0到3)
//才更新paneCoordinate,也就是说这时候才实现真正的变形
if(maxYcoordinate<LINE_NUM && maxXcoordinate<ROW_NUM)
{
boolean flag=false;
for(int i=0;i<4;i++)
{
if(grid[tempIndex[i][1]][tempIndex[i][0]]!=-1)
{
flag=true;
}
}
if(flag==false)
{
for(int m=0;m<4;m++)
{
dynamicPaneCoordinate[m][0]=tempIndex[m][0];
dynamicPaneCoordinate[m][1]=tempIndex[m][1];
}
}
}
drawGrid();
}
if (keyState == DOWN_PRESSED)
{
while(true)
{
if(moveDownAble())
{
for(int i=0;i<4;i++)
{
dynamicPaneCoordinate[i][1]++;
}
}
else
{
break;
}
}
drawGrid();
}
if (keyState == LEFT_PRESSED)
{
if(moveLeftAble())
{
for(int i=0;i<4;i++)
{
dynamicPaneCoordinate[i][0]--;
}
}
drawGrid();
}
if (keyState == RIGHT_PRESSED)
{
if(moveRightAble())
{
for(int i=0;i<4;i++)
{
dynamicPaneCoordinate[i][0]++;
}
}
drawGrid();
}
if(keyState==FIRE_PRESSED)
{
gameRank++;
if(gameRank%4==0)
{
sleepTime=400;
}
else
{
sleepTime-=100;
}
}
}
public void run()
{
while (true)
{
if(pause==false)
{
if(moveDownAble())
{
for(int i=0;i<4;i++)
{
dynamicPaneCoordinate[i][1]++;//更新动态方格的逻辑坐标
}
drawGrid();
}
else
{
//更新grid的数据,即将动态的方格变成静态的方格
for(int i=0;i<4;i++)
{
//System.out.println("run() : " + dynamicPaneCoordinate[i][1]+"+"+dynamicPaneCoordinate[i][0]);
grid[dynamicPaneCoordinate[i][1]][dynamicPaneCoordinate[i][0]]=dynamicPaneColor;
}
drawGrid();
if(gameOver())
{//System.out.println("run gameOver() : " );
if(maxScore<totalScore)
{
maxScore=totalScore ;
}
totalScore=0;
clearGrid();
String s=Integer.toString(maxScore);
maxScoreText="最高分:";
maxScoreText+=s;
//清屏
pen.setColor(0x000000);
pen.fillRect(0, 0, this.getWidth(), this.getHeight());
Font f=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD|Font.STYLE_ITALIC,Font.SIZE_LARGE);
pen.setFont(f);
pen.setColor(newPaneColor);
pen.drawString("正在加载新游戏…………", 10 ,Y+LINE_NUM*WIDTH /2,Graphics.TOP | Graphics.LEFT);
flushGraphics();
pen.setFont(Font.getDefaultFont());
try
{
Thread.sleep(3000);
}
catch (InterruptedException ie)
{
}
}
clearLine();
conversion();
getPane();//重新生成动态的方格
}
}
try
{
Thread.sleep(sleepTime);
}
catch (InterruptedException ie)
{
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -