📄 jmazeapplet.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 + -