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

📄 mycanvas.java

📁 我写的手机版俄罗斯方块游戏! 里面就两个类! 有很详细的注释! 参考文献: 精通java手机游戏与应用程序设计 陈立伟 张克非 黎秀红/编者
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

	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 + -