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

📄 minecanvas.java

📁 用手机写的扫雷的小程序
💻 JAVA
字号:
package mineMIDlet;

import java.util.Random;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
/**
 * 手机扫雷小游戏
 * @author AnthonyWei 20090306
 *
 */
public class mineCanvas extends Canvas  implements Runnable{
	private final int ISMINE = -1;
	private final int ISEMPTY = 0;
	
	private final int ISOPEN = 0;
	private final int NOTOPEN = 1;
	
	private int width;				//屏幕的宽
	private int height; 			//屏幕的高
	private int line = 2;			//线宽,线高
	private int mineNum = 10;		//雷的个数
	private int totalNum = 10; 		//雷区总数 比如 10 * 10
	private long startTime;  		//计时开始时间
	private long endTime;			//计时结束时间
	private int startX;				//开始画图的X坐标
	private int startY;				//开始画图的Y坐标
	private int margin = 2;			//内框的间隔
	private int length = 15;			//每个方框的宽和高
	private mineEntity[] mine;
	
	private boolean b = true;		//闪耀
	private int c_x = 0;			//当前序号
	private int c_y = 0;			//当前序号
	
	private boolean isGameStart = false;
	private boolean isGameOver = false;		//判断游戏失败结束
	private boolean isSuccessed = false;	//判断游戏成功结束
	
	public mineCanvas() {
		this.init();
		
		new Thread(this).start();
	}
	
	public void run() {
		while(true)
		{
			repaint();
			
			if(this.isGameSuccessed()) {
				this.isSuccessed = true;
			}
			
			if(this.isGameOver) {
				this.openAll();
			}
			
			//闪耀
			b = !b;
			
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	protected void paint(Graphics g) {
		/**
		 * 
		 * 清屏
		 * 
		 */
		g.setColor(0xffffff);
        g.fillRect(0, 0, width, height);
        if(!this.isSuccessed) {
			/**
			 * 
			 * 画边框
			 * 
			 */
			g.setColor(0);
			g.fillRect(startX, startY, line, (totalNum * (line + margin + length)) + margin);
			g.fillRect(startX, startY, (totalNum * (line + margin + length)) + margin, line);
			g.fillRect(startX + (totalNum * (line + margin + length)) + margin , startY, line, (totalNum * (line + margin + length)) + margin);
			g.fillRect(startX, startY + (totalNum * (line + margin + length)) + margin, (totalNum * (line + margin + length)) + 2 * margin, line);
			
			/**
			 * 
			 * 画雷区
			 * 
			 */
			g.setColor(0);
	
			for(int i = 0; i < totalNum; i++)
			{
				for(int j = 0; j < totalNum; j++)
				{
					if(mine[i * totalNum + j].status == NOTOPEN) {
						if(c_x == j && c_y == i)
						{
							if(b) {
								g.fillRect(mine[i * totalNum + j].x, 
										mine[i * totalNum + j].y, 
										length, 
										length);
							}
						}
						else
						{
							g.fillRect(mine[i * totalNum + j].x, 
										mine[i * totalNum + j].y, 
										length, 
										length);
						}
					}
					else
					{
						if(mine[i * totalNum + j].value != ISMINE){
							if(mine[i * totalNum + j].value != ISEMPTY)
							{
								if(c_x == j && c_y == i)
								{
									if(b) {
										g.drawString(String.valueOf(mine[i * totalNum + j].value),
												mine[i * totalNum + j].x, 
												mine[i * totalNum + j].y, 
												Graphics.TOP | Graphics.LEFT);
									}
								}
								else
								{
									g.drawString(String.valueOf(mine[i * totalNum + j].value),
												mine[i * totalNum + j].x, 
												mine[i * totalNum + j].y, 
												Graphics.TOP | Graphics.LEFT);
								}
							}
							else
							{
								if(c_x == j && c_y == i)
								{
									if(b) {
										g.drawString(String.valueOf(mine[i * totalNum + j].value),
												mine[i * totalNum + j].x, 
												mine[i * totalNum + j].y, 
												Graphics.TOP | Graphics.LEFT);
									}
								}
								else
								{
									g.drawString(String.valueOf(mine[i * totalNum + j].value),
												mine[i * totalNum + j].x, 
												mine[i * totalNum + j].y, 
												Graphics.TOP | Graphics.LEFT);
								}
							}
						}
						else
						{
							g.drawString("*",
									mine[i * totalNum + j].x, 
									mine[i * totalNum + j].y, 
									Graphics.TOP | Graphics.LEFT);
						}
					}
				}
			}
		}
        else
        {
        	g.setColor(0);
        	long time = (endTime - startTime) / 1000;
        	String text = "太棒了,时间" + String.valueOf(time);
        	g.drawString(text,
					startX, 
					startY, 
					Graphics.TOP | Graphics.LEFT);
        }
	}
	
	private void init() {
		
		width = this.getWidth();
		height = this.getHeight();
		
		startX = (width - totalNum * length - (totalNum + 1) * (line + margin)) / 2;
		startY = (height - totalNum * length - (totalNum + 1) * (line + margin)) / 2;
		
		c_x = totalNum / 2 - 1;
		c_y = totalNum / 2 - 1;
		
		/**
		 * 
		 * 生成地雷
		 * 
		 */
		Random  r 	  = new Random();
		int 	index = 0;
		mine = new mineEntity[totalNum * totalNum];
		for(int t = 0; t < totalNum * totalNum; t ++)
		{
			mine[t] = new mineEntity();
		}
		
		while(index < mineNum)
		{			
			int x = r.nextInt(totalNum) ;
			int y = r.nextInt(totalNum) ;
			if(mine[x * totalNum + y].value != ISMINE)
			{
				mine[x * totalNum + y].value = ISMINE;	
				index ++;
			}
		}
		/**
		 * 
		 * 
		 * 生成雷区
		 * 
		 * 
		 */
		for(int i = 0; i < totalNum; i++)			//y坐标
		{
			for(int j = 0; j < totalNum; j++)		//x坐标
			{
				mine[i * totalNum + j].x = startX + j * (line + length + margin) + margin + line;
				mine[i * totalNum + j].y = startY + i * (line + length + margin) + margin + line;
				if(mine[i * totalNum + j].value != ISMINE)
					mine[i * totalNum + j].value = this.getValue(j, i);		//传入坐标
				mine[i * totalNum + j].status = NOTOPEN;
			}
		}
	}
	
	private int getValue(int x, int y) {	//获得自己的Value

		int num = 0;
		
		int i;
		int j;
		int k;
		int s;
		
		i = x - 1 <= 0 ? 0 : x - 1;
		j = y - 1 <= 0 ? 0 : y - 1;
		k = x + 1 >= totalNum ? totalNum - 1 : x + 1;
		s = y + 1 >= totalNum ? totalNum - 1: y + 1;
		
		
		for(int x1 = i; x1 <= k; x1 ++ )
		{
			for(int y1 = j; y1 <= s; y1 ++)
			{
				if(mine[x1 + totalNum * y1].value == ISMINE){
					num ++;
				}
			}
		}

		return num;
	}
	
	public void keyPressed(int keyCode){
        int action = this.getGameAction(keyCode);

        switch(action){
        case UP:
        	c_y = c_y - 1 <= 0 ? totalNum : c_y - 1;
            break;
        case DOWN:
        	c_y = c_y + 1 >= totalNum ? 0 : c_y + 1;
            break;
        case LEFT:
        	c_x = c_x - 1 <= 0 ? totalNum : c_x - 1;
            break;
        case RIGHT:
        	c_x = c_x + 1 >= totalNum ? 0 : c_x + 1;
        	break;
        case FIRE:
        	if(!this.isGameStart) {
        		startTime = System.currentTimeMillis();
        		this.isGameStart = true;
        	}
        	this.open(c_x, c_y);
            break;
        }
    }
	
	private void open(int x, int y) {
		if(mine[y * totalNum + x].value == ISMINE){
			mine[y * totalNum + x].status = ISOPEN;
			isGameOver = true;
		}
		else if(mine[y * totalNum + x].value != ISEMPTY) {
			mine[y * totalNum + x].status = ISOPEN;
		}else {
			mine[y * totalNum + x].status = ISOPEN;
			
			int i;
			int j;
			int k;
			int s;
			
			i = x - 1 <= 0 ? 0 : x - 1;
			j = y - 1 <= 0 ? 0 : y - 1;
			k = x + 1 >= totalNum ? totalNum - 1 : x + 1;
			s = y + 1 >= totalNum ? totalNum - 1: y + 1;
			for(int x1 = i; x1 <= k; x1 ++ )
			{
				for(int y1 = j; y1 <= s; y1 ++)
				{
					mine[x1 + totalNum * y1].status = ISOPEN;
				}
			}
		}
	}
	
	private boolean isGameSuccessed() {
		int num = 0;
		for(int i = 0; i < totalNum * totalNum; i++) {
			if(mine[i].status == ISOPEN) {
				num  ++;
			}
		}
		
		if(num + mineNum == totalNum * totalNum) {
			if(!this.isSuccessed)
				endTime = System.currentTimeMillis();
			return true;
		}
		else
		{
			return false;
		}
	}
	
	private void openAll() {
		for(int i = 0; i < totalNum * totalNum; i++) {
				mine[i].status = ISOPEN ;
		}
	}
}

⌨️ 快捷键说明

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