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

📄 miningcanvas.java

📁 J2ME版本扫雷游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	                    }
	                }
	            }
	        }
	    }
	}
	public void paintSelected(Graphics g){
	    g.setColor(0x00FF0000);//画出选择框,注意其与总雷区和能在屏幕上显示出的区域间的关系
	    g.drawRoundRect(miningMapX+(selectedX-paintX)*miningGridLength-1,
	                miningMapY+(selectedY-paintY)*miningGridLength-1,
	                miningGridLength+1,miningGridLength+1,2,2);
	}

	
	private void paintHelpScreen(Graphics g){
	    g.setColor(0x00FFFFFF);
	    g.fillRect(0,0,canvasW,canvasH);
	    g.setFont(lowFont);
	    g.setColor(0x00000000);
	    for(int i=0;i<strGamehelp.length;i++){
	        g.drawString(strGamehelp[i],5,5+(lowFont.getHeight()+3)*i,Graphics.TOP|Graphics.LEFT);
	    }
	}

	
	
	private void paintMenuScreen(Graphics g){
	    for(int i=0;i < mainMenu.length;i++){
	        if(i==menuIdx){
	            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(mainMenu[i],(canvasW-highFont.stringWidth(mainMenu[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(mainMenu[i],(canvasW - lowFont.stringWidth(mainMenu[i])) / 2,
	                startHeight + i*(lowFont.getHeight() + spacing),Graphics.TOP|Graphics.LEFT);
	        } 
	    }
	}


	private void paintSplashScreen(Graphics g) {
		g.setColor(0x00000000);
		g.drawImage(splashImage, getWidth() / 2, getHeight() / 2 - 5,
				Graphics.HCENTER | Graphics.VCENTER);
	}

	public void run() {
		try {
			Thread.sleep(splashDelayTime);
		} catch (InterruptedException e) {
		}
		gamestate = GAMESTATE_MENU;// 在启动动画停留3秒后,改变游戏状态变量值,跳转到主菜单状态
		repaint();
	}

	protected void paint(Graphics g) {
		g.setColor(0x00FFFFFF);
		g.fillRect(0, 0, canvasW, canvasH);
		switch (gamestate) {
		case GAMESTATE_SPLASH:
			paintSplashScreen(g);// 绘制游戏启动界面
			break;
		case GAMESTATE_MENU:
			paintMenuScreen(g);// 绘制游戏主菜单
			break;
		case GAMESTATE_HELP:
			paintHelpScreen(g);// 绘制帮助界面
			break;
		case GAMESTATE_GAMEING:
			paintGameScreen(g);// 绘制游戏界面
			break;
		case GAMESTATE_GAMEMENU:
			paintGameMenuScreen(g);// 绘制游戏时菜单界面
			break;
		default:
			paintMenuScreen(g);// 绘制游戏主菜单
			break;
		}
	}
	
	public void gameInit(){
	    sbWon=false;
	    bombInit();
	    player1Found=0;player2Found=0;
	    selectedX=miningMapGrid/4;selectedY=miningMapGrid/4;
	    bombLeft=bombNum;
	    System.gc();//手动进行垃圾回收
	}
	public void bombInit(){
	    int bombindex=0;
	    int x=0,y=0;
	    Random random=new Random();
	    for(int i=0;i<miningMapGrid+2;i++){
	        for(int j=0;j<miningMapGrid+2;j++){
	            bombs[i][j]=new Bomb();
	        }
	    }
	    while(bombindex<bombNum){
	        x=Math.abs(random.nextInt()%16+1);
	        y=Math.abs(random.nextInt()%16+1);
	        if(!bombs[x][y].isBomb && x<=16 && x>=1 && y<=16 && y>=1){
	            try{
	                bombs[x][y].isBomb=true;
	                bombindex++;
	                bombs[x-1][y].bombaround++;
	                bombs[x-1][y-1].bombaround++;
	                bombs[x][y-1].bombaround++;
	                bombs[x+1][y-1].bombaround++;
	                bombs[x+1][y].bombaround++;
	                bombs[x+1][y+1].bombaround++;
	                bombs[x][y+1].bombaround++;
	                bombs[x-1][y+1].bombaround++;
	            }catch(ArrayIndexOutOfBoundsException e){}
	        }
	    }
	}
	public void bombOut(int x,int y){
	    if(bombs[x][y].hasFound==false && x>=1 && y>=1 && 
	            x<=MiningCanvas.miningMapGrid && y<=MiningCanvas.miningMapGrid){
	        bombs[x][y].hasFound=true;
	        if(bombs[x][y].bombaround==0){
	            this.bombOut(x-1,y);
	            this.bombOut(x-1,y-1);
	            this.bombOut(x,y-1);
	            this.bombOut(x+1,y-1);
	            this.bombOut(x+1,y);
	            this.bombOut(x+1,y+1);
	            this.bombOut(x,y+1);
	            this.bombOut(x-1,y+1);
	        }
	    }
	}
	public void checkWin(){
	    if(player1Found>26){
	        winString="Player1 has won!";
	        sbWon=true;
	    }
	    if(player2Found>26){
	        winString="Player2 has won!";
	        sbWon=true;
	    }
	    if(sbWon){
	        winAlert=new Alert("",winString+"\nPlayer1 "+player1Found
	                    +" : "+player2Found+" player2",null,AlertType.INFO);
	        gameInit();
	        winAlert.setTimeout(Alert.FOREVER);
	        MiningMIDlet.display.setCurrent(winAlert);
	    }
	}


	protected synchronized void keyPressed(int keyCode) {
		int action = getGameAction(keyCode);
		switch (gamestate) {
		
		case GAMESTATE_MENU:
		{
		    if (getGameAction(keyCode) == FullCanvas.UP && menuIdx - 1 >= 0) {
		        menuIdx--;
		    }
		    else if (getGameAction(keyCode) == FullCanvas.DOWN && menuIdx + 1 < mainMenu.length) {
		        menuIdx++;
		    }
		    else if (getGameAction(keyCode) == FullCanvas.FIRE) {
		        switch(menuIdx) {//选中后,按照选项值改变游戏状态值,跳转到相应的状态
		            case MAIN_NEW_GAME:
		                gamestate=GAMESTATE_GAMEING;
		                break;
		            case MAIN_SETTINGS:
		                gamestate=GAMESTATE_SETTING;
		                break;
		            case MAIN_HELP: 
		                gamestate=GAMESTATE_HELP;
		                break;
		            case MAIN_ABOUT:
		                gamestate=GAMESTATE_ABOUT;
		                break;
		            case MAIN_EXIT:
		                miningMIDlet.destroyApp(false);
		                break;
		            }
		        }
		        break;
		    }
		
		case GAMESTATE_HELP://如果游戏现在的状态为帮助状态,那个不管玩家按哪个键都会跳转到主菜单状态
		    gamestate=GAMESTATE_MENU;
		    break;
		    
		case GAMESTATE_GAMEING:
		{
		    if(keyCode==FullCanvas.KEY_SOFTKEY1){
		        gamestate=GAMESTATE_GAMEMENU;
		    }
		    else if (action == FullCanvas.LEFT ) {
		        selectedX=(--selectedX+miningMapGrid)%(miningMapGrid);
		    }
		    else if (action == FullCanvas.RIGHT) {
		        selectedX=(++selectedX)%(miningMapGrid);
		    }
		    else if (action == FullCanvas.UP) {
		        selectedY=(--selectedY+miningMapGrid)%(miningMapGrid);
		    }
		    else if (action == FullCanvas.DOWN) {
		        selectedY=(++selectedY)%(miningMapGrid);
		    }
		    else if (action == FullCanvas.FIRE) {
		        if(!bombs[selectedY+1][selectedX+1].hasFound){
		            if(bombs[selectedY+1][selectedX+1].isBomb){
		                bombs[selectedY+1][selectedX+1].hasFound=true;
		                bombs[selectedY+1][selectedX+1].isPlayer1=this.isPlayer1;
		                if(isPlayer1)
		                    player1Found++;
		                else
		                    player2Found++;
		                bombLeft--;
		                checkWin();//每次有玩家挖到了雷就监测其是否胜出
		            }
		            else{
		                bombOut(selectedY+1,selectedX+1);
		                //如果此雷位及周围都无雷,打开所有与其相连的相同情况的雷位及此区域周边一圈雷位
		                isPlayer1=!isPlayer1;
		            }
		        }
		    }
		    //以下几行代码是调整显示在屏幕上的区域的坐标,以免选择框跑出屏幕范围
		    if((selectedX-paintX)<0)
		        paintX=selectedX;
		    else if((selectedX-paintX)>=bombMapW)
		        paintX=selectedX-bombMapW+1;
		    if((selectedY-paintY)<0)
		        paintY=selectedY;
		    else if((selectedY-paintY)>=bombMapH)
		        paintY=selectedY-bombMapH+1;
		    break;
		}
		
		case GAMESTATE_GAMEMENU:
		{
		    if (getGameAction(keyCode) == FullCanvas.UP && gamemenuIdx - 1 >= 0) {
		        gamemenuIdx--;
		    }
		    else if (getGameAction(keyCode) == FullCanvas.DOWN && gamemenuIdx + 1 < gameMenu.length) {
		        gamemenuIdx++;
		    }
		    else if (getGameAction(keyCode) == FullCanvas.FIRE) {
		        switch(gamemenuIdx) {
		            case GAME_RETURN:
		                gamestate=GAMESTATE_GAMEING;
		                break;
		            case GAME_RESTART:
		                gameInit();
		                gamestate=GAMESTATE_GAMEING;
		                break;
		            case GAME_HELP:
		                gamestate=GAMESTATE_HELP;
		                break;
		            case GAME_MENU:
		                gamestate=GAMESTATE_MENU;
		                break;
		            case GAME_EXIT:
		                miningMIDlet.destroyApp(false);
		                break;
		        }
		    }
		    break;
		}
		
		default:
	        gamestate=GAMESTATE_MENU;

		    
		}
		repaint();
		}
	}

⌨️ 快捷键说明

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