j2me 实现的扫雷游戏

一、 利用j2me实现windows自带的扫雷游戏。实现过程主要用的知识点:

   1、MIDlet实现入口,控制屏幕和命令的控制。

  2、数组,侦听接口,线程,简单的算法。

  

二、 具体的实现过程:

   入口类的实现:

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class gameStart extends MIDlet implements CommandListener {
	public static gameStart midlet;
	public myCanvas mc;
	private Command exitCommand = new Command("Exit", Command.EXIT, 0);

	public gameStart() {
		gameStart.midlet = this;
	}

	public void startApp() {
		gameStart.midlet.startGame();
		
	}

	public void pauseApp() {

	}

	public void destroyApp(boolean f) {

	}

	public void startGame() {
		mc = null;
		mc = new myCanvas();
		Display.getDisplay(this).setCurrent(mc);
		mc.addCommand(exitCommand);
		mc.setCommandListener(this);
	}

	public void exitGame() {
		destroyApp(false);
		notifyDestroyed();
	}

	public void commandAction(Command cmd, Displayable arg1) {
		if (cmd == exitCommand) {
			destroyApp(false);
			notifyDestroyed();
		}
	}
}
其中实现游戏的开始,结束和侦听用户命令。
还可以实现MIDlet三个状态的转化(暂停、结束、开启)。
 
实现类:
import javax.microedition.lcdui.*;
import java.util.*;
public class myCanvas extends Canvas{
    public Image offScreen;
    public Graphics offg;
    public int map[][]=new int[8][8];
    public Random r1;
    public Image imCricle,imMine;//pic
    public int px,py;
    public int mineNumber=10;//¡Á¨¹¨¤¡Á¨ºy
    public boolean gameOver=false;//¨®??¡¤¨º?¡¤??¨¢¨º?
    public boolean gameWin=false;//¨®??¡¤¨º?¡¤?¨º¡è¨¤?
    public myCanvas()
    { offScreen=Image.createImage(149,180);
      offg=offScreen.getGraphics();
      try{
      imCricle=Image.createImage("/cricle.png");
      imMine=Image.createImage("/mine.png");
      }catch(Exception e){}
      r1=new Random();
      initMap();//3?¨º??¡¥¨¤¡Á??
    	
    }
    public void initMap()
    {
    	for(int n=0;n<mineNumber;n++)
    	{int tmp=Math.abs(r1.nextInt()%64);
    	 int row=tmp/8;//DD
    	 int col=tmp%8;//¨¢D
    	 if(map[row][col]!=20)
    	 { map[row][col]=20;//??¦Ì¨²rowDD¦Ì¨²col¨¢D¨¦¨¨3¨¦¨¤¡Á
    	 	}
    	 else
    	 {n--;}
    	}
    }
    public void drawMap()
    {offg.setColor(0xFFFFFF);
     offg.fillRect(0,0,176,208);
     offg.setColor(0);
     for(int i=0;i<8;i++)
     { for(int j=0;j<8;j++)	
       {offg.drawRect(j*20,i*20,20,20);
       	//¨¨?1?¡¤-?a?¨°??¨º??a¦Ì??¨¹?¡ì¦Ì?¨¤¡Á¨ºy
        if(map[i][j]!=20&&map[i][j]!=0&&map[i][j]!=10)
        {
         offg.drawString(" "+map[i][j],j*20,i*20,0);	
        }
        else if(map[i][j]==10)
        {
         offg.drawString("  0",j*20,i*20,0);	
        }
       }
     }
    
    }
    public void drawCricle()
    {
      offg.drawImage(imCricle,px,py,0);	
    }
    public void drawOver()//????¨®??¡¤?¨¢¨º?
    { offg.setColor(0xFFFFFF);
      offg.fillRect(0,0,176,208);
      offg.setColor(0);
      offg.drawString("Game Over",30,30,0);
      for(int i=0;i<8;i++)
      {
        for(int j=0;j<8;j++)
        {if(map[i][j]==20)
         {offg.drawImage(imMine,j*20,i*20,0);}
         else
         {offg.drawRect(j*20,i*20,20,20);}
        }
      }
    }
    public void drawWin()//????¨®??¡¤¨º¡è¨¤?
    {
    	offg.setColor(0xFFFFFF);
        offg.fillRect(0,0,176,208);
        offg.setColor(0);
        offg.drawString("you Win",30,30,0);
    }
	public void paint(Graphics g)
	{drawMap();//????¨¤¡Á?? 
	 drawCricle();//???????¨°
	 if(gameOver){drawOver();}
	 if(gameWin){drawWin();}
	 offg.drawString("new game            exit",0,170,0);
	 g.drawImage(offScreen,0,0,0);
	}
	public void checkWin()
	{  int count=0;//????¡¤-?a¦Ì?¨ºy¨¢?
		for(int i=0;i<8;i++)
		{
		 for(int j=0;j<8;j++)
		 {
		   	if(map[i][j]>0)
		   	{ count++;
		   		}
		 }
		}
		if(count+this.mineNumber==64)
		{ this.gameWin=true;
			}
	
	}
	//map[r2][c2]?¨¹?¡ì¦Ì?¨¤¡Á¨ºy
	public int checkNum(int r2,int c2)
	{int num=0;
	 //¡Á¨®¨¦?
	 if(r2-1>=0&&c2-1>=0)//?D??¨º?¡¤?¨®D¡Á¨®¨¦?
	 {
	  if(map[r2-1][c2-1]==20){num++;}
	 }
	 //¨¦?
	 if(r2-1>=0)
	 {
	  if(map[r2-1][c2]==20)num++;
	 }
	 //¨®¨°¨¦?
	 if(r2-1>=0&&c2+1<=7)
	 {
	   if(map[r2-1][c2+1]==20)num++;	
	 }
	 //¡Á¨®
	 if(c2-1>=0)
	 {
	  if(map[r2][c2-1]==20)num++;	
	 }
	 //¨®¨°
	 if(c2+1<=7)
	 {
	  if(map[r2][c2+1]==20)num++;	
	 }
	 //¡Á¨®??
	 if(r2+1<=7&&c2-1>=0)
	 { if(map[r2+1][c2-1]==20)num++;
	 	}
	 //??
	 if(r2+1<=7)
	 {
	 	if(map[r2+1][c2]==20)num++;
	 }
	 //¨®¨°??
	 if(r2+1<=7&&c2+1<=7)
	 {
	 	if(map[r2+1][c2+1]==20)num++;
	 }
	 return num;//?a¦Ì??¨¹?¡ì¦Ì?¨¤¡Á¨ºy
	}
	public void check(int row,int col)
	{
		if(map[row][col]==20)
		{gameOver=true;}
		else
		{//?D?¡§?a¦Ì??¨¹?¡ì¦Ì?¨¤¡Á¨ºy
		 int k=this.checkNum(row,col);
		 if(k>0)//?a¦Ì??¨¹?¡ì¨®D¨¤¨¤
		 { map[row][col]=k;//??¨º??a¦Ì??¨¹?¡ì¦Ì?¨¤¡Á¨ºy
		 	}
		 else//?a¦Ì??¨¹?¡ì??¨®D¨¤¡Á
		 { map[row][col]=10;//¡¤-?a?a¨°?¦Ì?
		   //?¨²?D???a¦Ì??¨¹?¡ì¦Ì??¨¦??
		   //¡Á¨®¨¦?
		     if(row-1>=0&&col-1>=0)
		     { if(map[row-1][col-1]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row-1,col-1);
		       }
		     }
		   //¨¦?
		     if(row-1>=0)
		     { if(map[row-1][col]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row-1,col);
		       }
		     }
		   //¨®¨°¨¦?
		     if(row-1>=0&&col+1<=7)
		     { if(map[row-1][col+1]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row-1,col+1);
		       }
		     }
		   //¡Á¨®
		     if(col-1>=0)
		     { if(map[row][col-1]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row,col-1);
		       }
		     }
		   //¨®¨°
		     if(col+1<=7)
		     { if(map[row][col+1]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row,col+1);
		       }
		     }
		   //¡Á¨®??
		     if(row+1<=7&&col-1>=0)
		     { if(map[row+1][col-1]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row+1,col-1);
		       }
		     }
		   //??
		     if(row+1<=7)
		     { if(map[row+1][col]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row+1,col);
		       }
		     }
		   //¨®¨°??
		     if(row+1<=7&&col+1<=7)
		     { if(map[row+1][col+1]<10){//?D??¨º?¡¤?¡À?¡¤-?a
		     	check(row+1,col+1);
		       }
		     }
		 }
		}
		
	}
	public void keyPressed(int n)
	{if(n==-6)
	 {gameStart.midlet.startGame();}
	 if(n==-7)
	 {gameStart.midlet.exitGame();}
	 int k=this.getGameAction(n);
	 switch(k)
	 {
	  case Canvas.UP:
	  	    if(py>=20)  py-=20;
             break;
	  case Canvas.DOWN:
	  	    if(py<=20*6){py+=20;}
	  	    break;
	  case Canvas.LEFT:
	  	    if(px>=20) px-=20;
	  	    break;
	  case Canvas.RIGHT:
	        if(px<=20*6)px+=20;
	        break;
	  case Canvas.FIRE:
	  	   int seleRow=py/20;//¦Ì¡À?¡ã???¨°¦Ì??¨´?¨²DD
	       int seleCol=px/20;//¦Ì¡À?¡ã???¨°¦Ì??¨´?¨²¨¢D
	       check(seleRow,seleCol);//¨®??¡¤¡¤-?a¦Ì?¨¤¡Á¦Ì??¨¬2a
           //?¨¬2a1y1?
	  	 checkWin();
	 }
	 this.repaint();
	 this.serviceRepaints();
	}
}

 

在这个类中主要实现了屏幕的绘画,实现其具体的算法,针对每种情况作出相应的处理。

三、编译 运行 通过 之后打包 形成jar文件

  我已经把jar放到了服务器上,手机可以直接访问http://218.206.74.4:10010/wapdemo/down.jsp下载安装。

转载于:https://www.cnblogs.com/marcus/archive/2009/07/25/1530875.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值