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

📄 miningcanvas.java

📁 J2ME版本扫雷游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.io.IOException;
import java.util.Random;
import java.util.Vector;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import com.nokia.mid.ui.FullCanvas;

public class MiningCanvas extends FullCanvas implements Runnable {
	MiningMIDlet miningMIDlet;

	int gamestate;

	static final int GAMESTATE_SPLASH = 0;

	static final int GAMESTATE_MENU = 1;

	static final int GAMESTATE_GAMEING = 2;

	static final int GAMESTATE_HELP = 3;

	static final int GAMESTATE_SETTING = 4;

	static final int GAMESTATE_ABOUT = 5;

	static final int GAMESTATE_GAMEMENU = 6;

	static final int GAMESTATE_COUNT = 7;

	Thread thread;


	int splashDelayTime;

	static final Font lowFont  = Font.getFont (Font.FACE_MONOSPACE, Font.STYLE_PLAIN, Font.SIZE_SMALL);  
	static final Font highFont = Font.getFont (Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_MEDIUM);  
	    //两种字体,分别是未选中和选中状态的字体
	static final int lowColor  = 0x000000FF;//未选中状态的颜色
	static final int highColor = 0x00FF0000;//选中状态的颜色
	static final int highBGColor = 0x00CCCCCC;//选中状态的背景颜色
	static final int MAIN_NEW_GAME = 0;
	static final int MAIN_SETTINGS = 1;
	static final int MAIN_HELP = 2;
	static final int MAIN_ABOUT = 3;
	static final int MAIN_EXIT = 4;
	static final int MAIN_MENU_ITEM_COUNT = 5;
	static String[] mainMenu = new String[MAIN_MENU_ITEM_COUNT];
	static int canvasW;//屏幕宽
	static int canvasH;//屏幕高
	static int startHeight;//菜单列表的起始高度
	static int spacing;//菜单项间宽度
	static int menuIdx;//当前选中的菜单项

	final String[] strGamehelp =new String[10];

	int empty;
	static final int miningMapGrid=16;//雷区为16格x16格
	static final int bombNum=52;//共有52颗雷
	int miningMapLength,miningGridLength;//整个雷区的边长,每一个雷位格子的边长
	int miningMapX,miningMapY;//雷区的左上角坐标
	int selectedX,selectedY;//选择框的坐标,是在雷区里的坐标(1-16)
	int player1Found,player2Found;//两个玩家的分值,即已经找到的雷数
	int paintX,paintY;//要画出的区域的左上角坐标,是在雷区里的坐标(1-16)
	int bombLeft;//剩下未扫出的雷数
	static final int Player1X=10,Player1Y=30;//信息框中画出玩家一分数的坐标位置,相对于信息框左上角
	static final int Player2X=10,Player2Y=90;//信息框中画出玩家二分数的坐标位置,相对于信息框左上角
	static final int bombnowX=8,bombnowY=52;//信息框中画出剩余雷数的坐标位置,相对于信息框左上角
	static final int bombMapW=10,bombMapH=12;//屏幕上能绘出的雷位的数量
	Bomb[][] bombs;
	boolean isPlayer1;//当前是否轮到玩家一扫雷
	Alert winAlert;//显示输赢信息的Alert对象
	String winString;//比出输赢后要输出的信息
	boolean sbWon;//是否得出输赢
	static final Font font  = Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_SMALL);
	    //消息框中使用的字体
	Image infoImg,splashImage;
	Image unFoundGroundImg;
	Image foundGroundImg;
	Image player1BombImg,player2BombImg,player1TurnImg,player2TurnImg;
	Image bomb1Img,bomb2Img,bomb3Img,bomb4Img,bomb5Img,bomb6Img,bomb7Img,bomb8Img; 
	    //所有要用到的图片

	static final int GAME_RETURN = 0;
	static final int GAME_RESTART = 1;
	static final int GAME_HELP = 2;
	static final int GAME_MENU = 3;
	static final int GAME_EXIT = 4;
	static final int GAME_MENU_ITEM_COUNT = 5;
	static String[] gameMenu = new String[GAME_MENU_ITEM_COUNT];
	static int gamemenuIdx;


	public MiningCanvas(MiningMIDlet miningMIDlet) {
		super();
		this.miningMIDlet = miningMIDlet;
		gamestate = 0;// 游戏加载时默认界面为启动界面
		splashDelayTime = 3000;
		try {
			splashImage = Image.createImage("/occo.png");
		} catch (IOException e) {
		}
		thread = new Thread(this);
		thread.start();
	    menuIdx = 0;
	    canvasW=getWidth();canvasH=getHeight();
	    spacing = highFont.getHeight()/2;
	    startHeight = (canvasH-(lowFont.getHeight()*mainMenu.length)-(mainMenu.length-1)*spacing)/2;
	    mainMenu[0] = "New Game";
	    mainMenu[1] = "Settings";
	    mainMenu[2] = "Help";
	    mainMenu[3] = "About";
	    mainMenu[4] = "Exit";
	    
	    strGamehelp[0]="此游戏为双人对战游戏";
	    strGamehelp[1]=",和经典的扫雷不同,这";
	    strGamehelp[2]="个游戏中,我们要挖出";
	    strGamehelp[3]="雷,挖错雷则交换玩家.";
	    strGamehelp[4]="一共有52颗雷,256个格";
	    strGamehelp[5]="子,最先挖到27颗雷者";
	    strGamehelp[6]="获胜.1.上,下,左,右分";
	    strGamehelp[7]="别为数字键2,8,4,6,挖";
	    strGamehelp[8]="雷为5;2.屏幕外框的颜";
	    strGamehelp[9]="色为当前下玩家;";

	    try{//实例化游戏中需要的Image对象
	        unFoundGroundImg=Image.createImage("/unfoundGroundbig.png");
	        foundGroundImg=Image.createImage("/foundGroundbig.png");
	        player1BombImg=Image.createImage("/player1bombbig.png");
	        player2BombImg=Image.createImage("/player2bombbig.png");
	        bomb1Img=Image.createImage("/bomb1big.png");
	        bomb2Img=Image.createImage("/bomb2big.png");
	        bomb3Img=Image.createImage("/bomb3big.png");
	        bomb4Img=Image.createImage("/bomb4big.png");
	        bomb5Img=Image.createImage("/bomb5big.png");
	        bomb6Img=Image.createImage("/bomb6big.png");
	        infoImg=Image.createImage("/info.png");
	        splashImage=Image.createImage("/occo.png");
	        player1TurnImg=Image.createImage("/player1turn.png");
	        player2TurnImg=Image.createImage("/player2turn.png");
	    }catch(IOException e){}
	    isPlayer1=true;//初始化玩家先后顺序
	    miningGridLength=14;//初始化每一个雷位的边长
	    miningMapLength=14*12;//整个扫雷棋盘的边长
	    miningMapX=(canvasW-miningMapLength)/2;//屏幕上棋盘左上角的X坐标
	    miningMapY=(canvasH-miningMapLength)/2;//屏幕上棋盘左上角的Y坐标
	    selectedX=selectedY=miningMapGrid/2;//初始化选择框的坐标为
	    player1Found=player2Found=0;//初始化两个玩家的得分
	    paintX=paintY=3;//初始化整个雷区一开始在屏幕上显示的范围
	    sbWon=false;//初始化没有玩家获胜
	    bombLeft=bombNum;//初始化剩余雷数为总雷数
	    bombs=new Bomb[miningMapGrid+2][miningMapGrid+2];
	    bombInit();//初始化雷区 

	    gamemenuIdx=0;
	    gameMenu[0] = "RETURN";
	    gameMenu[1] = "RESTART";
	    gameMenu[2] = "HELP";
	    gameMenu[3] = "MENU";
	    gameMenu[4] = "EXIT";

	}
	
	private void paintGameMenuScreen(Graphics g){
	    for(int i=0;i<gameMenu.length;i++){
	        if(i==gamemenuIdx){
	            g.setColor(highBGColor);
	            g.fillRect(0,startHeight+i*(lowFont.getHeight()+spacing)
	                    -(highFont.getHeight()-lowFont.getHeight())/2,
	                    canvasW,highFont.getHeight());
	            g.setFont(highFont);
	            g.setColor(highColor);
	            g.drawString(gameMenu[i],(canvasW-highFont.stringWidth(gameMenu[i]))/2,
	                    startHeight+i*(lowFont.getHeight()+spacing)-(highFont.getHeight()
	                    -lowFont.getHeight())/2,Graphics.TOP|Graphics.LEFT);
	        } else {
	            g.setFont(lowFont);
	            g.setColor(lowColor);
	            g.drawString(gameMenu[i],(canvasW-lowFont.stringWidth(gameMenu[i]))/2,
	                    startHeight+i*(lowFont.getHeight()+spacing),Graphics.TOP|Graphics.LEFT);
	        } 
	    }
	}

	
	private void paintGameScreen(Graphics g){
	    paintPlayer(g,isPlayer1);
	    paintMiningMap(g);
	    paintInfo(g);
	    paintSelected(g);
	}
	protected void paintInfo(Graphics g){
	    g.drawImage(infoImg,miningMapX+bombMapW*miningGridLength+1,
	                miningMapY,Graphics.TOP|Graphics.LEFT);
	    g.setFont(font);
	    g.setColor(0x00FFFFFF);
	    g.drawString(String.valueOf(bombLeft),miningMapX+bombMapW*miningGridLength+bombnowX,
	                miningMapY+bombnowY,Graphics.TOP|Graphics.LEFT);
	    g.drawString(String.valueOf(player1Found),miningMapX+bombMapW*miningGridLength+Player1X,
	                miningMapY+Player1Y,Graphics.TOP|Graphics.LEFT);
	    g.drawString(String.valueOf(player2Found),miningMapX+bombMapW*miningGridLength+Player2X,
	                miningMapY+Player2Y,Graphics.TOP|Graphics.LEFT);
	    //这个方法中接下来的代码是用来在信息框中画出小地图,也就是屏幕上显示的地雷区域在整个雷区 中的位置
	    g.setColor(0x00777777);
	    g.fillRect(miningMapX+bombMapW*miningGridLength+1,miningMapY+8*miningGridLength+1,
	                2*miningGridLength-2,2*miningGridLength-1);
	    g.setColor(0x00000000);
	    g.drawRect(miningMapX+bombMapW*miningGridLength+1,miningMapY+8*miningGridLength+1,
	                2*miningGridLength-2,2*miningGridLength-1);
	    g.setColor(0x00BBBBBB);
	    g.fillRect(miningMapX+bombMapW*miningGridLength+4+2*(paintX-1),
	                miningMapY+8*miningGridLength+4+2*(paintY-1),12,17);
	    g.setColor(0x00FFFFFF);
	    g.drawRect(miningMapX+bombMapW*miningGridLength+4+2*(paintX-1),
	                miningMapY+8*miningGridLength+4+2*(paintY-1),12,17);
	}
	
	protected void paintPlayer(Graphics g,boolean isPlayer1){
	    if(isPlayer1)//在棋盘外围画出玩家颜色的外框
	        g.setColor(0x000000FF);
	    else
	        g.setColor(0x00FF0000);
	    for(int i=1;i<=5;i++){
	        g.drawRect(miningMapX-i,miningMapY-i,miningMapLength+2*i,miningMapLength+2*i);
	    }
	    if(isPlayer1)//在信息框中画出代表玩家的旗帜
	        g.drawImage(player1TurnImg,miningMapX+(bombMapW+1)*miningGridLength+1,
	                miningMapY+11*miningGridLength,Graphics.HCENTER|Graphics.VCENTER);
	    else
	        g.drawImage(player2TurnImg,miningMapX+(bombMapW+1)*miningGridLength+1,
	                miningMapY+11*miningGridLength,Graphics.HCENTER|Graphics.VCENTER);
	}
	public void paintMiningMap(Graphics g){
	    for(int i=0;i<bombMapH;i++){
	        for(int j=0;j<bombMapW;j++){//根据每个Bomb对象中的变量值画出不同的图片
	            if(!bombs[i+paintY+1][j+paintX+1].hasFound){
	                g.drawImage(unFoundGroundImg,miningMapX+j*miningGridLength,
	                        miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	            }
	            else {
	                if(!bombs[i+paintY+1][j+paintX+1].isBomb){
	                    switch(bombs[i+paintY+1][j+paintX+1].bombaround){
	                        case 0:
	                            g.drawImage(foundGroundImg,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                            break;
	                        case 1:
	                            g.drawImage(bomb1Img,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                            break;
	                        case 2:
	                            g.drawImage(bomb2Img,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                            break;
	                        case 3:
	                            g.drawImage(bomb3Img,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                            break;
	                        case 4:
	                            g.drawImage(bomb4Img,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                            break;
	                        case 5:
	                            g.drawImage(bomb5Img,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                            break;
	                        case 6:
	                            g.drawImage(bomb6Img,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                            break;
	                        default:
	                            g.drawImage(foundGroundImg,miningMapX+j*miningGridLength,
	                                miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                        break;
	                    }
	                }
	                else {
	                    if(bombs[i+paintY+1][j+paintX+1].isPlayer1){
	                        g.drawImage(player1BombImg,miningMapX+j*miningGridLength,
	                            miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
	                    }
	                    else{
	                        g.drawImage(player2BombImg,miningMapX+j*miningGridLength,
	                            miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);

⌨️ 快捷键说明

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