⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycanvas.java

📁 我写的手机版俄罗斯方块游戏! 里面就两个类! 有很详细的注释! 参考文献: 精通java手机游戏与应用程序设计 陈立伟 张克非 黎秀红/编者
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
//移植时,须根据不同的手机调整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 + -