📄 maze.java
字号:
case 'L':drawoffScreen.drawImage(character,sprite.LcX/size,sprite.LcY/size,
(sprite.LcX+sprite.SizeW)/size,(sprite.LcY+sprite.SizeH)/size,sx,sprite.SizeH*3,
sx+sprite.SizeW,sprite.SizeH*4,this);break;
case 'R':drawoffScreen.drawImage(character,sprite.LcX/size,sprite.LcY/size,
(sprite.LcX+sprite.SizeW)/size,(sprite.LcY+sprite.SizeH)/size,sx,sprite.SizeH,
sx+sprite.SizeW,sprite.SizeH*2,this);break;
}
repaint();
//让角色看起来在走动
sx+=sprite.SizeW;
if(sx>sprite.SizeW*2){
sx=0;
}
try{
Thread.sleep(200);//每隔200毫秒重绘一次
}catch(InterruptedException e){}
}
}
else {
start.UpdateStatus();
try{
Thread.sleep(200);
}catch(InterruptedException e){}
repaint();
}
}
}
//参数为角色的坐标
public boolean moveCharacter(int x,int y){
if((y*floorW/size)<(int)(getToolkit().getScreenSize().width/2)/size&&
(direction=='R'||direction=='L'))return true;
if((x*floorW/size)<(int)(getToolkit().getScreenSize().height/2)/size&&
(direction=='U'||direction=='D'))return true;
return false;
}
//绘制地图和障碍物
public void paintMap(int x,int y){
//绘制地板
for(int i=1;i<=gridX-2;i++){
for(int j=1;j<=gridY-2;j++){
if((j+x)>0&&(i+y)>0)
drawoffScreen.drawImage(floor,(j+x)*floorW/size,(i+y)*floorW/size,floorW/size,floorW/size,this);
}
}
//绘制障碍物(数组值为1表示绘制萝卜数组值为2表示绘制香菇)
for(int i=1;i<=gridX-2;i++){
for(int j=1;j<=gridY-2;j++){
if(array[i][j]==1&&(j+x)>0&&(i+y)>0)//绘制萝卜
drawoffScreen.drawImage(block1,(j+x)*floorW/size,(i+y)*floorW/size,floorW/size,floorW/size,this);
else if(array[i][j]==2&&(j+x)>0&&(i+y)>0)//绘制香菇
drawoffScreen.drawImage(block2,(j+x)*floorW/size,(i+y)*floorW/size,floorW/size,floorW/size,this);
}
}
}
public void paintString(String string,Graphics g){
g.setFont(new Font("f1",Font.BOLD,72));
FontMetrics fm=g.getFontMetrics();
int ascent=fm.getAscent();
int descent=fm.getDescent();
int stringWidth=fm.stringWidth(string);
int stringX=((int)(getToolkit().getScreenSize().width)-stringWidth)/2;
int stringY=((int)(getToolkit().getScreenSize().height)-(ascent+descent))/2+ascent;
g.drawString(string,stringX,stringY);
}
//初始化游戏
public void initializeGame(){
outX=gridX-3;//从倒数第三行倒数第三列开始递归
outY=gridY-3;
for(int i=0;i<gridX;i++){
for(int j=0;j<gridY;j++){
//迷宫的外围数值,因为数组是每次都减2,为了防止越界才多设置的
if(j==0||i==gridX-1||i==0||j==gridY-1)array[i][j]=0;
else array[i][j]=(int)(Math.random()*2+1);//迷宫内部数值1,2表示还没设定的障碍物
}
}
array[2][1]=4;//设置出口入口
array[gridX-3][gridY-2]=4;
newarray(outX,outY);//产生迷宫数组
X=Y=0;//从开始绘制地图
t.allTime+=20;
t.usedTime=t.allTime;//时间重制
isPass=false;//指定游戏的状态为没过关
repaint();
}
public void keyTyped(KeyEvent e){}
public void keyPressed(KeyEvent e){
key=e.getKeyCode();
if(key==KeyEvent.VK_RIGHT){
direction='R';//改变角色绘图方向
canMove=sprite.moveRight(isMoveCharacter=moveCharacter(sprite.indexI,sprite.indexJ));//让角色按方向移动
if(canMove&&!isMoveCharacter)X--;
System.out.println(sprite.indexI+","+sprite.indexJ);//用于测试
}
else if(key==KeyEvent.VK_LEFT){
direction='L';
canMove=sprite.moveLeft(isMoveCharacter=moveCharacter(sprite.indexI,sprite.indexJ));
if(canMove&&!isMoveCharacter)X++;
}
else if(key==KeyEvent.VK_UP){
direction='U';
canMove=sprite.moveUp(isMoveCharacter=moveCharacter(sprite.indexI,sprite.indexJ));
if(canMove&&!isMoveCharacter)Y++;
}
else if(key==KeyEvent.VK_DOWN){
direction='D';
canMove=sprite.moveDown(isMoveCharacter=moveCharacter(sprite.indexI,sprite.indexJ));
if(canMove&&!isMoveCharacter)Y--;
}
else if(key==KeyEvent.VK_ENTER){
isStart=true;
}
}
public void keyReleased(KeyEvent e){}
//滚轮事件
public void mouseWheelMoved(MouseWheelEvent e){
switch(e.getWheelRotation()){
case -1:size--;
break;
case 1:size++;
break;
}
if(size<=0)size=1;
repaint();
}
//鼠标事件
public void mouseClicked(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseReleased(MouseEvent e){
if(MOUSE_PRESSED_START==0&&MOUSE_POSITION==0&&!gameStart){
gameStart=true;
initializeGame();
t.start();//当创建好迷宫之后,测试时间的线程就随之开始记时
}
currentImage=b1;//弹起按钮
}
public void mousePressed(MouseEvent e){
if(MOUSE_POSITION==0){
currentImage=b2;//如果鼠标按下位置在按钮处就陷下按钮
}
}
public void mouseMoved(MouseEvent e){
//了解鼠标移动的位置
if(e.getX()<=bw&&e.getY()<=bh){
MOUSE_POSITION=0;
}
else MOUSE_POSITION=1;
}
public void mouseDragged(MouseEvent e){
//了解鼠标拖动的位置
if(e.getX()<=bw&&e.getY()<=bh){
MOUSE_POSITION=0;
}
else MOUSE_POSITION=1;
//如果在按钮处按下鼠标,而在其他地方拖动鼠标,则弹起按钮
if(MOUSE_PRESSED_START==0){
if(MOUSE_POSITION==0){
currentImage=b2;
}
else currentImage=b1;
}
}
}
//用于测试时间
class time extends Thread{
static int allTime=0;//存放此关游戏总的时间
int usedTime=allTime;
//开始设置为-1就不可能因为巧合,在下面的if语句中出现相等了
int currentSecond=-1;
Label l_time;//用于显示时间
GregorianCalendar d;
Maze maze;
public time(Maze m){
maze=m;
l_time=new Label("剩余时间: 0 秒");
}
public void run(){
while(true){
//必须在循环中,要不它就只打印一个
//不知道是不是因为new一个就只能get一次
d=new GregorianCalendar();
if(currentSecond!=d.get(Calendar.SECOND)){
currentSecond=d.get(Calendar.SECOND);
if(!maze.isPass)usedTime--;
if(usedTime==0){maze.isDead=true;maze.repaint();}
if(usedTime<=0)usedTime=0;
l_time.setText("剩余时间: "+usedTime+" 秒");
}
}
}
}
//**************************************************************************//
class StartScreen{
int screenWidth,screenHeight,floorW;
int sx,sy,characterW,characterH,characterX,characterY,speed;
Image character,radish,mushroom,floor;
Maze game;
public StartScreen(Maze game,Image block1,Image block2,
Image character,Image floor,int floorW,
int characterW,int characterH){
this.game=game;
screenWidth=16*floorW;
screenHeight=11*floorW;
radish=block1;
mushroom=block2;
this.floor=floor;
this.character=character;
this.floorW=floorW;
this.characterW=characterW;
this.characterH=characterH;
characterX=screenWidth-180;
characterY=screenHeight-108;
sx=0;
sy=3*characterH;
speed=-18;
}
public void paintScreen(Graphics g){
//绘制地板
for(int i=0;i<11;i++){
for(int j=0;j<16;j++){
g.drawImage(floor,j*floorW,i*floorW,game);
}
}
//绘制角色
g.drawImage(character,characterX,characterY,
characterX+characterW,characterY+characterH,
sx,sy,sx+characterW,sy+characterH,game);
g.setFont(new Font("f1",Font.BOLD,72));
g.setColor(Color.pink);
FontMetrics fm=g.getFontMetrics();
int stringWidth=fm.stringWidth("迷宫岛");
int stringX=(int)((screenWidth-stringWidth)/2);
int stringY=72;
g.drawString("迷宫岛",stringX,stringY);
}
public void UpdateStatus(){
if(characterX<72||characterX>screenWidth-180){
speed=-speed;
if(sy==3*characterH){
sy=characterH;
}
else sy=3*characterH;
}
characterX+=speed;
sx+=characterW;
if(sx>=3*characterW){
sx=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -