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

📄 mdraw.java

📁 这个是一个扫雷游戏,用来显示Java的按扭等效果
💻 JAVA
字号:
/*程序:MDraw.java
 *说明:扫雷游戏绘图运算。
 *      图片加载、图片贴图、次显示页转换、画面更新等
 */

import java.awt.*;
import javax.swing.*;



class MDraw{
	
//游戏数据
int GRIDX;  //地图x轴格数
int GRIDY;  //地图y轴格数
int MINES;  //地雷数
Container c;//容器


//次显示区
Image offI;
Graphics offG;

//图片数组
Image[] imgSmile;
Image[] imgMap;
Image[] imgCount;

//所有图片宽与长
int SMILE_WIDTH;
int SMILE_HEIGHT;
int MAP_WIDTH;
int MAP_HEIGHT;
int COUNT_WIDTH;
int COUNT_HEIGHT;

//各区域坐标
int STATE_X;//游戏状态区
int STATE_Y;
int COUNT_X;//时间计数
int COUNT_Y;
int MCOUNT_X;//地雷计数
int MCOUNT_Y;
int MAP_X;//地雷区
int MAP_Y;	
int SMILE_X;//笑脸
int SMILE_Y;
	
public MDraw(int gridx,   //地图x轴格数
			 int gridy,   //地图y轴格数
			 int mines,   //地雷数
			 Container c){//容器

	//资料初始
	this.GRIDX=gridx;
	this.GRIDY=gridy;
	this.MINES=mines;
	this.c=c;
	
	
	//建立次画面
	offI=c.createImage(c.getWidth(),c.getHeight());
	offG=offI.getGraphics();		
	
	//读入所有图片
	imgSmile=new Image[5]; //游戏状态图(笑脸)
	for(int i=0;i<=4;i++)
		imgSmile[i]=(new ImageIcon("pic/smile/s"+i+".gif")).getImage();	
				
	imgCount=new Image[10];//计数(LED字型)
	for(int i=0;i<=9;i++)
		imgCount[i]=(new ImageIcon("pic/count/"+i+".gif")).getImage();	
		
	imgMap=new Image[15];  //地图上(数字、地雷)
	for(int i=0;i<=14;i++)
		imgMap[i]=(new ImageIcon("pic/map/m"+i+".gif")).getImage();
	
	//纪录图片宽与长
	SMILE_WIDTH=imgSmile[0].getWidth(null);//游戏状态图
	SMILE_HEIGHT=imgSmile[0].getHeight(null);
	COUNT_WIDTH=imgCount[0].getWidth(null);//计数图
	COUNT_HEIGHT=imgCount[0].getHeight(null);		
	MAP_WIDTH=imgMap[0].getWidth(null);//地图状态图
	MAP_HEIGHT=imgMap[0].getHeight(null);
	
	//所有区域坐标
	MAP_X=MAP_WIDTH;//地雷区
	MAP_Y=MAP_HEIGHT*5;
	DrawMapFrame(MAP_X-3,MAP_Y-3,
                  GRIDX*MAP_WIDTH+6,GRIDY*MAP_HEIGHT+6,
                  3,false);
		
	STATE_X=MAP_WIDTH;//游戏状态区
	STATE_Y=MAP_HEIGHT;
	DrawMapFrame(STATE_X-3,STATE_Y-3,
                  GRIDX*MAP_WIDTH+6,MAP_HEIGHT*3+6,
                  3,false);		

	MCOUNT_X=STATE_X+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;//地雷数
	MCOUNT_Y=STATE_Y+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;
	DrawMapFrame(MCOUNT_X-2,MCOUNT_Y-2,
                  COUNT_WIDTH*3+4,COUNT_HEIGHT+4,
                  2,false);				

	COUNT_X=(STATE_X-3)+
               (GRIDX*MAP_WIDTH+6)-MAP_WIDTH-COUNT_WIDTH*3;//秒数
	COUNT_Y=MCOUNT_Y;
	DrawMapFrame(COUNT_X-2,COUNT_Y-2,
                  COUNT_WIDTH*3+4,COUNT_HEIGHT+4,2,false);			

	SMILE_X=(STATE_X-3)+(GRIDX*MAP_WIDTH+6-SMILE_WIDTH)/2;//笑脸
	SMILE_Y=STATE_Y+(MAP_HEIGHT*3-SMILE_HEIGHT)/2;
			
	
	//画出立体框
	DrawMapFrame(0,0,(GRIDX+2)*MAP_WIDTH,(GRIDY+6)*MAP_HEIGHT,
                  4,true);			
	
	//mapInit();//地图初始化
	showCount(MCOUNT_X,MCOUNT_Y,MINES);//显示地雷数
	showCount(COUNT_X,COUNT_Y,0);//显示秒数
	showSmile(0);//显示笑脸
	
}

//显示地图图标
public void showMap(int x,int y,int mode){
	if(x>=0 && x<GRIDX &&//防止超出数组
	   y>=0 && y<GRIDY){		
		offG.drawImage(imgMap[mode],
					   MAP_X+x*MAP_WIDTH,
					   MAP_Y+y*MAP_HEIGHT,
					   null);
	}
}

//显示笑脸
public void showSmile(int i){
	if(i>=0 && i<=4)
		offG.drawImage(imgSmile[i],SMILE_X,SMILE_Y,null);
	update();
}

//显示计数数字
public void showCount(int x,int y,int count){
	if(count>=0){
		offG.drawImage(imgCount[(count%1000)/100],x,y,null);
		offG.drawImage(imgCount[(count%100)/10],x+COUNT_WIDTH,y,null);
		offG.drawImage(imgCount[(count%10)],x+COUNT_WIDTH*2,y,null);
		update();//更新画面
	}
}

   //画出砖块组动作区地图外框	
public void DrawMapFrame(int x,int y,int wid,int hig,int side,boolean raised){
	
	//定义多边形坐标
	int xx[][]={{x,x+wid,x+wid-side,x+side},//上
		    	{x+wid-side,x+wid,x+wid,x+wid-side},//右
				{x+side,x+wid-side,x+wid,x},//下
				{x,x+side,x+side,x}};//左

	int yy[][]={{y,y,y+side,y+side},//上
		    	{y+side,y,y+hig,y+hig-side},//右
				{y+hig-side,y+hig-side,y+hig,y+hig},//下
				{y,y+side,y+hig-side,y+hig}};//左		

			
	//画出多边形
	for(int i=0;i<=3;i++){
		if(raised){//设定框为凸起
			switch(i){//不同边设定不同颜色
				case 0:
					offG.setColor(new Color(250,250,250));
					break;
				case 1:
					offG.setColor(new Color(120,120,120));
					break;
				case 2:
					offG.setColor(new Color(100,100,100));
					break;
				case 3:
					offG.setColor(new Color(240,240,240));
					break;
			}
		}else{//设定框为凹陷
			switch(i){//不同边设定不同颜色
				case 0:
					offG.setColor(new Color(100,100,100));
					break;
				case 1:
					offG.setColor(new Color(240,240,240));
					break;
				case 2:
					offG.setColor(new Color(250,250,250));
					break;
				case 3:
					offG.setColor(new Color(120,120,120));					
					break;
			}
		}
		offG.fillPolygon(xx[i],yy[i],4);				
	}
	update();//更新画面
}	

public void update(){
	c.getGraphics().drawImage(offI,0,0,null);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -