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

📄 jmazeapplet.java

📁 一个java迷宫游戏
💻 JAVA
字号:
import javax.swing.JApplet;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
//QQ:276081463
class Global
{  
   public static boolean bGameOver=true;
   public static int      N=100;                 //地图维数N*N
   public static int      MapBuf[][];            //保存地图的缓冲区 
   public static int      MyX=100,MyY=100;       //我方老鼠在迷宫内的位置
   public static int      EnemyX=100,EnymyY=100; //敌方方老鼠在迷宫内的位置
    static int      Left=50,Bottom=50;     //屏幕左边,上边界,以像素为单位
    static int      Width=400,Height=400;  //屏幕的宽度和高度,以像素为单位
    static int      PartialMapX=N-19;        //用于显示的部分地图X坐标
    static int      PartialMapY=N-19;        //用于显示的部分地图Y坐标
    static int      PartialMapCX=22;       //用于显示的部分地图X长度
    static int      PartialMapCY=22;       //用于显示的部分地图Y长度
   static int GridLen=20;
   ///////////////////////////////////////////////////
   //初始化地图缓冲区
   public static void InitMap(int n)     //创建地图缓冲区
   {
   	N=n;
   	MapBuf=new int [n+2][n+2];     //除去两条边界,正好是N*N
   }
   public static void Reset()
   {
    PartialMapX=N-20;
    PartialMapY=N-20;
    MyX=N;
    MyY=N;
    bGameOver=true;
    for(int i=0;i<N+2;i++)
   	 for(int j=0;j<N+2;j++)
   	 	MapBuf[i][j]=0;
   	}
   ///////////////////////////////////////////////////////////
   //将整个迷宫地图挖出来
   public static void CreateMap()
   {        
   	//坐标(0,1)为出口,(N,N)为老鼠起始地址
   	DigMap m1=new DigMap(1,1,1);//标号为1,从坐标(1,1)开始挖
	DigMap m2=new DigMap(2,N,N);//标号为2,从坐标(N,N)开始挖
  	DigMap m3=new DigMap(3,1,N);//标号为3,从坐标(1,N)开始挖
	DigMap m4=new DigMap(4,N,1);//标号为4,从坐标(N,1)开始挖
	boolean bLink=false;       //判断地图是否挖通
	
	 //初始点先挖掉
	m1.DigIt();                
	m2.DigIt();
	MapBuf[0][1]=1;
	//从两边同时挖
	while(!bLink)
	{  
		bLink=m1.ContinuouslyDig();//随机方向,随机步长,返回是否挖通
		if(!bLink)
			bLink=m2.ContinuouslyDig();
	}
	m3.DigIt();
	m4.DigIt();
	bLink=false;
	while(!bLink) bLink=m3.ContinuouslyDig();
	bLink=false;
	while(!bLink) bLink=m4.ContinuouslyDig();
   }
   public static void ShowWholeMap(Graphics G)           //显示整个地图
   {
   	
   }
   public static void ShowPartialMap(Graphics G)    //只显示当前的部分地图
   {
   //	G.clearRect(Left,Bottom,Width+20,Height+20);
		G.setColor( Color.BLACK); 
   	for(int i=0;i<PartialMapCX;i++)
   		for(int j=0;j<PartialMapCY;j++)
   		{  if(MapBuf[PartialMapX+i][PartialMapY+j]==0)
   			G.fillRect(Left+i*GridLen,Bottom+j*GridLen,GridLen,GridLen);
   		}
	G.setColor( Color.BLUE); 
	if(PartialMapX<=0&&PartialMapY<=1)
		G.fillRect(Left+(0-PartialMapX)*GridLen,Bottom+(1-PartialMapY)*GridLen,GridLen,GridLen);
   	
   	G.setColor( Color.RED); 
   	   G.fillRect(Left+(MyX-PartialMapX)*GridLen,Bottom+(MyY-PartialMapY)*GridLen,GridLen,GridLen);
   	   if(bGameOver) G.drawString("Gameover!",200,45);
   	   else          G.drawString("Playing game!",200,45);
   	  G.drawString("按Enter键开始游戏",20,15);
   	 G.drawString("方向键移动红方块",20,30);
   	 G.drawString("出口在左上角",20,45);
   	G.drawString("QQ:276081463",300,45);
   	}
}
class DigMap
{
	int  Tag;    //被挖点的标记
	int  X,Y;    //在地图中的当前位置
	int  VX,VY;  //x,y点的方向为(1,0)向左,(-1,0)向右,(0,1)向下,(0,-1)向上
	int  Step;   //在一个方向上一次可以走动的步数
	/*//////////////////////////////////
	*///构造函数传入3个参数,用于初始化Tag,X,Y
	DigMap(int t,int x,int y)
	{
        Tag=t;
        X=x;
        Y=y;
        VX=1;
        VY=0;
	}
    /*//////////////////////////////////////////////////////////////////
    *///将当前点挖
	void DigIt() 
    {
		Global.MapBuf[X][Y]=Tag;   //将改点做标记,表示被挖过
	}
	
     /*////////////////////////////////////////////////////////////////
     *///在当前方向上走一步
    void Walk()  
    {   
    	X+=VX;
    	Y+=VY; 		
    } 
    
    /*/////////////////////////////////////////////////////////////////
    *///(x,y)点在(vx,vy)方向上的下一点是否被挖
    boolean IsNextDigged(int x,int y,int vx,int vy)
    { 
    	
    	return Global.MapBuf[x+vx][y+vy]==Tag;//改点的下一坐标是否为同一标记
    }
    
    /*//////////////////////////////////////////////////////////////////
    *///检测是否撞墙,如果撞墙,则将方向取反 
    void HitWall() 
    {
    	if(X+VX<1||X+VX>Global.N) VX=(-1)*VX;
    	if(Y+VY<1||Y+VY>Global.N) VY=(-1)*VY;
    }
    
     //////////////////////////////////////////////////////////////////////
     ///检测当前的下一点 是否可以被挖,如果他在当前方向上的周围3个点都没被挖,则返回true  
    boolean CanNextBeDigged()
    {  
       int x=X+VX,y=Y+VY;             //下一点的坐标
       int vx=VY,vy=VX;               //与原方向转弯的两个方向
       if(IsNextDigged(x,y,VX,VY))    return false;//前一点是否被挖
       if(IsNextDigged(x,y,vx,vy))    return false;//左一点是否被挖
       if(IsNextDigged(x,y,-vx,-vy))  return false;//右一点是否被挖
       return true;//周围都没被挖
    }
    
    /*/////////////////////////////////////////////////////////////////
    ////如果下一个点没有被挖,而又不可挖,
    *///则必须跳到下一个点的周围三个点的之一
    void Jump()  
    {
    	Walk();
    	int vx=VY,vy=VX;//与原方向转弯的两个方向
        if(IsNextDigged(X,Y,VX,VY))  
        	{
        	Walk();   //前一点被挖,走过去
        	}
        else if(IsNextDigged(X,Y,vx,vy))  
        {
           	X+=vx;    //左一点被挖,走过去
        	Y+=vy;   
        }
        else if(IsNextDigged(X,Y,-vx,-vy)) 
        {
           	X-=vx;
        	Y-=vy;   //右一点被挖,走过去
        }
    }
    
    /*/////////////////////////////////////////////////////////////////
    *///检测是否已经连接上了,即当前点的周围存有被另一种标记挖过的点
    boolean IsLinked()
    {
    	boolean r=false;
       	int vx=VY,vy=VX;//与原方向转弯的两个方向
       	
       	//如果改点既不是自身标记又不是原有标记,则该点被别的挖过
    	if(Global.MapBuf[X+VX][Y+VY]!=Tag&&Global.MapBuf[X+VX][Y+VY]!=0) r=true;    //前一个点是否被别的挖
    	else if(Global.MapBuf[X+vx][Y+vy]!=Tag&&Global.MapBuf[X+vx][Y+vy]!=0) r=true;//左一个点是否被别的挖
    	else if(Global.MapBuf[X-vx][Y-vy]!=Tag&&Global.MapBuf[X-vx][Y-vy]!=0) r=true;//右一个点是否被别的挖
    	return r; 
    }
    
    /*/////////////////////////////////////////////////////////////
    ////产生随机方向
    *///(-1,0)向左,(1,0)向右,(0,-1)向上,(0,1)向下
    void RandomVxy()
    {
    	int vx=VY;
    	int vy=VX;
    	int k=(int)(Math.random()*80);
    	//将随机数平均分成4个空间,产生4个方向
    	if(0<=k && k<10)         {VX=(-1)*VX; VY=(-1)*VY;} //向左
    	else if(10<=k&&k<20)    {/*VX=();  VY=0;*/} //向右
    	else if(20<=k&&k<50)    {VX=vx;  VY=vy;}//向上
    	else if(50<=k&&k<=80)   {VX=-vx;  VY=-vy;} //
    	
    }
    
    /*///////////////////////////////////////////////////////////
    *///产生随机步长,在一个方向上一次可以走动的步数
    void RandomStep()
    {
    	Step=1+(int)(Math.random()*3);
    }
    
    /*/////////////////////////////////////////////////////////
     * 在当前方向上连续走Step步,
    *///如果挖通,返回true,反之,false;
   boolean ContinuouslyDig()
    {
   	    RandomVxy();
   	    RandomStep();
    	int i=0;
    	while(i<Step)
    	{
         HitWall();  //首先检测是否撞墙,如果撞墙方向取反
         
         //对于下一点的三种策略:1走过 2走过去挖掉 3跳过去
        if(IsNextDigged(X,Y,VX,VY))//检测下一点是否被挖
        {
             Walk();//已经被挖,走过去
        }
        else if(CanNextBeDigged())//没有被挖,是否可以挖
        {
        	Walk();//可以挖,走过去,
        	DigIt();//挖掉
        	if(IsLinked())
        	return true;//如果挖通,跳出循环,并返回
        }
        else 
        {    //不可以挖,跳过去
        	 Jump();
        }
         i++;
    	}
    	 return false;
     }
}
class Mouse
{
	   
   /*//////////////////////////////////////////////////////////
   *///检测是否撞墙
	static boolean IsHitWall(int vx,int vy)
	{ 	
	   return Global.MapBuf[Global.MyX+vx][Global.MyY+vy]==0;
	}
   /*//////////////////////////////////////////////////////////
   *///老鼠向前走一步
	static void Walk(int vx,int vy)
   {
        if(vx!=0)
        {
        	Global.MyX+=vx;
            if(vx==-1)
            {
            	if(Global.PartialMapX+Global.PartialMapCX/2>Global.MyX && Global.PartialMapX-1>=0)
            		Global.PartialMapX+=vx;	
            } 
            else 
            {
            	if(Global.PartialMapX+Global.PartialMapCX/2<Global.MyX && Global.PartialMapX<= Global.N+1-Global.PartialMapCX)
            		Global.PartialMapX+=vx;	
            }
        }
        else
        {
        	Global.MyY+=vy;   
            if(vy==-1)
            {
            	if(Global.PartialMapY+Global.PartialMapCY/2>Global.MyY && Global.PartialMapY-1>=0)
            		Global.PartialMapY+=vy;	
            } 
            else 
            {
            	if(Global.PartialMapY+Global.PartialMapCY/2<Global.MyY && Global.PartialMapY<= Global.N+1-Global.PartialMapCY)
            		Global.PartialMapY+=vy;	
            } 
        }
   }

   /*//////////////////////////////////////////////////////////
   *///检测是否已经走出迷宫
	static boolean IsSuccess()
   {
     return (Global.MyX<=0);
   }
}
public class JMazeApplet extends JApplet implements KeyListener  
{
	public void init()
	{
		Global.InitMap(48);
		addKeyListener(this);
	}
	 public void start(){Global.Reset();}
	 public void paint(Graphics g)
	 {
	 	super.paint(g);
	 	//if(!Global.bGameOver)
	   Global.ShowPartialMap(g);
	 }
	 public void keyPressed(KeyEvent evt)
	    {
	 	int vx=1,vy=0;
	    	int key=evt.getKeyCode();
	                 switch(key)
					 {
					   case KeyEvent.VK_ENTER://按 ENTER键 开始游戏
					   	 Global.Reset();
					   	 Global.bGameOver=false;
					     Global.CreateMap();
	                    	   break;
	                       case KeyEvent.VK_KP_LEFT:  //向左
	                       case KeyEvent.VK_LEFT:
	                       	     vx=-1;vy=0;
	                             break;
	                        case KeyEvent.VK_KP_RIGHT:
	                        case KeyEvent.VK_RIGHT:   //向右
	                        	 vx=1;vy=0;
	                             break;             
	                        case KeyEvent.VK_KP_UP:   //向上
	                        case KeyEvent.VK_UP:
	                        	 vx=0;vy=-1;
	                              break;
	                        case KeyEvent.VK_KP_DOWN:
	                        case KeyEvent.VK_DOWN:    //向下
	                        	  vx=0;vy=1;
	                              break;  
	                              
	                 }
               	     if(!Mouse.IsHitWall(vx,vy)&&!Global.bGameOver)
               	     {
               	       Mouse.Walk(vx,vy);
               	       if(Mouse.IsSuccess())
               	 	   Global.bGameOver=true;
               	     }
	                 repaint();
	   
	    }
	    public void keyTyped(KeyEvent evt){}
	    public void keyReleased(KeyEvent evt){}
}

⌨️ 快捷键说明

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