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

📄 jmazeapplet.java

📁 一个很简单的java 迷宫的程序
💻 JAVA
字号:
import javax.swing.JApplet;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.*;
//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);
               /* Button btn=new Button("建立迷宫");
 		btn.addActionListener(
 			new ActionListener()
 			{
 				public void actionPerformed(ActionEvent e)
 				{     Global.Reset();
                     Global.bGameOver=false;
                    Global.CreateMap();}});
            Panel p=new Panel();
 			p.add(btn);
 			setLayout(new BorderLayout());
 			add(p,"South"); */       
                    
                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 + -