迷宫.docx

上传人:b****7 文档编号:25463831 上传时间:2023-06-09 格式:DOCX 页数:34 大小:21.08KB
下载 相关 举报
迷宫.docx_第1页
第1页 / 共34页
迷宫.docx_第2页
第2页 / 共34页
迷宫.docx_第3页
第3页 / 共34页
迷宫.docx_第4页
第4页 / 共34页
迷宫.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

迷宫.docx

《迷宫.docx》由会员分享,可在线阅读,更多相关《迷宫.docx(34页珍藏版)》请在冰豆网上搜索。

迷宫.docx

迷宫

迷宫

一、

程序:

自动产生迷宫

//范例文件:

AutoMaze.java

importjava.applet.*;

importjava.awt.*;

importjava.awt.event.*;

publicclassAutoMazeextendsApplet

{

intGridX=15,GridY=15;//迷宫格数

intSi,Sj,Ei,Ej;//入口与出口

int[][]maze=newint[30][30];//迷宫数组

intenter=20,width=20;//迷宫入口位置与每格的大小

Buttonbtn;

Panelp;

Imagewall1,wall2;

MediaTrackerMT;

publicvoidinit()

{

//取得外墙图片

MT=newMediaTracker(this);

wall1=getImage(getDocumentBase(),"Images/wall1.gif");

wall2=getImage(getDocumentBase(),"Images/wall2.gif");

MT.addImage(wall1,0);

MT.addImage(wall2,0);

try

{

showStatus("图像加载中(LoadingImages)...");

MT.waitForAll();

}

catch(InterruptedExceptionE){}//没有进行异常处理

btn=newButton("建立迷宫");

//按下按钮自动产生迷宫数组并绘制迷宫

btn.addActionListener(

newActionListener(){

publicvoidactionPerformed(ActionEvente)

{

inti,j;

Si=1;Sj=1;Ei=GridY;Ej=GridX;//设定出入口

for(i=0;i<=GridY+1;i++){

for(j=0;j<=GridX+1;j++){

if(i==0||j==0||

i==GridY+1||j==GridX+1)

maze[i][j]=15;//设定外墙

else

maze[i][j]=3;//初始迷宫内部

}

}

genmaze(Ei,Ej);//产生迷宫

maze[Ei][Ej]=maze[Ei][Ej]&0xd;//拆掉入口右墙

repaint();

}

}

);

p=newPanel();

p.add(btn);

setLayout(newBorderLayout());//设定版面配置

add(p,"South");

}

//递归产生迷宫数组

publicvoidgenmaze(inti,intj)

{

intn;

maze[i][j]|=0x4;//标示此格已设定

while(maze[i][j+1]==3||maze[i+1][j]==3||

maze[i][j-1]==3||maze[i-1][j]==3)//如果不是外墙

{

n=(int)(4*Math.random()+1);//决定下一个位置

if(n==1&&maze[i][j+1]==3){//向右走

maze[i][j]&=0xd;//拆掉右墙

genmaze(i,j+1);//递归继续走访下一个位置

}

elseif(n==2&&maze[i-1][j]==3){//向下走

maze[i][j]&=0xe;//拆掉上墙

genmaze(i-1,j);//递归继续走访下一个位置

}

elseif(n==3&&maze[i][j-1]==3){//向左走

maze[i][j-1]&=0xd;//拆掉右墙

genmaze(i,j-1);//递归继续走访下一个位置

}

elseif(n==4&&maze[i+1][j]==3){//向上走

maze[i+1][j]&=0xe;//拆掉上墙

genmaze(i+1,j);//递归继续走访下一个位置

}

}

}

//绘制迷宫

publicvoidpaint(Graphicsg)

{

intx,y,i,j;

//清除屏幕

g.clearRect(0,0,(GridX+3)*width,(GridY+6)*width);

//绘制上外墙

g.drawImage(wall1,enter,enter,(GridX+1)*width,2*width,0,0,100,100,this);

//绘制左外墙

g.drawImage(wall2,0,2*width,width,(GridY+1)*width+5,0,0,100,100,this);

//绘制下外墙

g.drawImage(wall1,enter,(GridY+1)*width,(GridX+1)*width,(GridY+2)*width,0,0,100,100,this);

//绘制右外墙

g.drawImage(wall2,GridX*width,width,(GridX+1)*width,GridY*width,0,0,100,100,this);

//画迷宫内部

for(i=1;i<=GridY;i++){

for(j=1;j<=GridX;j++){

x=(j-1)*width+enter;

y=(i-1)*width+enter;

//画上墙

if((maze[i][j]&1)==1)

g.drawImage(wall1,x-width/5,y,x+width,y+width,0,0,100,100,this);

//画右墙

if((maze[i][j]&2)==2)

g.drawImage(wall2,x,y,x+width,y+width,0,0,100,100,this);

}

}

}

}

 

二、地图拼接技巧

/程序:

斜角地图拼接

//范例文件:

Map45.java

importjava.awt.*;

importjava.applet.*;

importjava.awt.event.*;

publicclassMap45extendsApplet

{

intAppletWidth,AppletHeight,floorW,floorH,key;

Imagefloor,OffScreen;

GraphicsdrawOffScreen;

MediaTrackerMT;

publicvoidinit()

{

setBackground(Color.white);//设定背景颜色

AppletWidth=getSize().width;//取得Applet的高度

AppletHeight=getSize().height;//取得Applet的宽度

//取得图像

MT=newMediaTracker(this);

floor=getImage(getDocumentBase(),"Images/floor.gif");

MT.addImage(floor,0);

try

{

showStatus("图像加载中(LoadingImages)...");

MT.waitForAll();

}

catch(InterruptedExceptionE){}//没有进行异常处理

//建立次画面

OffScreen=createImage(AppletWidth,AppletHeight);

drawOffScreen=OffScreen.getGraphics();

floorW=floor.getWidth(this);

floorH=floor.getHeight(this);

}

publicvoidpaint(Graphicsg)

{

intX,Y;

//绘制地板,内循环每次绘制两排

for(inti=0;i<=16;i++)

for(intj=0;j<=10;j++)

{

X=j*floorW;

Y=i*floorH;

drawOffScreen.drawImage(floor,X,Y,X+floorW,Y+floorH,0,0,floorW,floorH,this);

X+=floorW/2;

Y+=floorH/2;

drawOffScreen.drawImage(floor,X,Y,X+floorW,Y+floorH,0,0,floorW,floorH,this);

}

//将次画面贴到主画面中

g.drawImage(OffScreen,0,0,this);

}

}

 

三、

//程序:

立体坐标定位

//范例文件:

Map45Rotate.java

importjava.awt.*;

importjava.applet.*;

importjava.awt.event.*;

publicclassMap45RotateextendsApplet

{

intAppletWidth,AppletHeight,floorW,floorH,key;

Imagefloor,OffScreen;

GraphicsdrawOffScreen;

MediaTrackerMT;

publicvoidinit()

{

setBackground(Color.white);//设定背景颜色

AppletWidth=getSize().width;//取得Applet的高度

AppletHeight=getSize().height;//取得Applet的宽度

//取得图像

MT=newMediaTracker(this);

floor=getImage(getDocumentBase(),"Images/floor.gif");

MT.addImage(floor,0);

try

{

showStatus("图像加载中(LoadingImages)...");

MT.waitForAll();

}

catch(InterruptedExceptionE){}//没有进行异常处理

//建立次画面

OffScreen=createImage(AppletWidth,AppletHeight);

drawOffScreen=OffScreen.getGraphics();

floorW=floor.getWidth(this);

floorH=floor.getHeight(this);

}

publicvoidpaint(Graphicsg)

{

intX,Y;

//绘制地板

for(inti=1;i<=15;i++)

for(intj=1;j<=15;j++)

{

X=rotateX(j,i);//X坐标转换

Y=rotateY(j,i);//Y坐标转换

drawOffScreen.drawImage(floor,X,Y,X+floorW,

Y+floorH,0,0,floorW,floorH,this);

}

//将次画面贴到主画面中

g.drawImage(OffScreen,0,0,this);

}

//X坐标转换

privateintrotateX(intj,inti)

{

intx;

//根据图片大小先算出原来坐标

x=(j-i)*floorW+450;

//进行坐标转换

x=(int)(x*Math.cos(60*Math.PI/180));

//返回坐标值

returnx;

}

//Y坐标转换

privateintrotateY(intj,inti)

{

intx,y;

//根据图片大小先算出原来坐标

x=j*floorW+150;

y=-i*floorH;

//进行坐标转换

y=(int)-(y*Math.cos(-15*Math.PI/180)+

x*Math.sin(60*Math.PI/180)*Math.sin(-15*Math.PI/180));

y=y-i*floorH/2;

//返回坐标值

returny;

}

}

四、

//程序:

平面迷宫制作

//范例文件:

Maze1.java

importjava.awt.*;

importjava.applet.*;

importjava.awt.event.*;

publicclassMaze1extendsAppletimplementsKeyListener,Runnable

{

intImageWidth,ImageHeight,ImageX,ImageY,

AppletWidth,AppletHeight,floorW,key;

intsx;//角色贴图来源位置

chardirection='R';//角色贴图方向判断

Imagecharacter,floor,block1,block2,OffScreen;

ThreadnewThread;

GraphicsdrawOffScreen;

MediaTrackerMT;

Sprites;//角色状态对象

//迷宫数组

int[][]maze={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{0,0,0,0,0,1,0,0,2,0,0,1,1,0,0,0,2,2},

{2,0,1,0,1,0,0,0,2,0,1,0,0,1,1,0,2,2},

{2,0,0,0,0,1,1,1,2,0,1,0,1,1,0,0,2,2},

{2,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2},

{2,1,0,1,0,1,1,0,1,1,0,0,1,0,2,0,2,2},

{2,1,0,0,0,0,1,0,0,2,0,0,0,0,2,2,2,2},

{2,1,0,0,2,0,1,1,1,2,0,1,0,0,2,1,1,2},

{2,1,1,1,1,0,0,0,1,2,0,0,0,0,1,1,0,2},

{2,0,0,0,0,0,0,0,1,0,0,1,1,0,2,1,0,2},

{2,0,2,0,1,0,0,0,1,0,1,0,0,0,2,1,0,2},

{2,1,2,0,0,0,1,1,1,0,1,0,1,1,2,1,0,2},

{2,0,0,0,2,0,0,0,1,1,0,0,0,0,0,0,0,0},

{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

publicvoidinit()

{

addKeyListener(this);//注册事件处理函数

setBackground(Color.white);//设定背景颜色

AppletWidth=getSize().width;//取得Applet的高度

AppletHeight=getSize().height;//取得Applet的宽度

sx=0;

//取得图像

MT=newMediaTracker(this);

character=getImage(getDocumentBase(),"Images/character.gif");

floor=getImage(getDocumentBase(),"Images/floor.jpg");

block1=getImage(getDocumentBase(),"Images/block1.gif");

block2=getImage(getDocumentBase(),"Images/block2.gif");

MT.addImage(character,0);

MT.addImage(floor,0);

MT.addImage(block1,0);

MT.addImage(block2,0);

try

{

showStatus("图像加载中(LoadingImages)...");

MT.waitForAll();

}

catch(InterruptedExceptionE){}//没有进行异常处理

//建立次画面

OffScreen=createImage(AppletWidth,AppletHeight);

drawOffScreen=OffScreen.getGraphics();

floorW=floor.getWidth(this);

ImageWidth=character.getWidth(this)/3;//单元格图像的高度

ImageHeight=character.getHeight(this)/4;//单元格图像的宽度

ImageX=floorW;//图像的X坐标

ImageY=floorW/3;//图像的Y坐标

//初始角色物件

s=newSprite(ImageX,ImageY,ImageWidth,ImageHeight,maze);

}

//打开动画循环线程

publicvoidstart()

{

newThread=newThread(this);

newThread.start();

}

publicvoidstop()

{

newThread=null;

}

publicvoidupdate(Graphicsg)//update()函数

{

paint(g);//只单纯调用paint()函数

}

publicvoidpaint(Graphicsg)

{

//将次画面贴到主画面中

g.drawImage(OffScreen,0,0,this);

}

//===============绘图===========================

publicvoidrun()

{

while(true)

{

drawOffScreen.clearRect(0,0,AppletWidth,AppletHeight);

//绘制地板

for(inti=0;i<=AppletHeight;i+=floorW)

for(intj=0;j<=AppletWidth;j+=floorW)

drawOffScreen.drawImage(floor,j,i,j+floorW,i+floorW,

0,0,floorW,floorW,this);

//根据迷宫数组绘制障碍物

for(inti=0;i<14;i++)

for(intj=0;j<18;j++)

if(maze[i][j]==1)//绘制萝卜

drawOffScreen.drawImage(block1,j*floorW,i*floorW,

(j+1)*floorW,(i+1)*floorW,0,0,floorW,floorW,this);

elseif(maze[i][j]==2)//绘制香菇

drawOffScreen.drawImage(block2,j*floorW,i*floorW,

(j+1)*floorW,(i+1)*floorW,0,0,floorW,floorW,this);

//绘制角色

switch(direction)

{

case'U':

//角色向上

drawOffScreen.drawImage(character,s.LcX,s.LcY,

s.LcX+s.SizeW,s.LcY+s.SizeH,sx,0,sx+s.SizeW,

s.SizeH,this);

break;

case'D':

//角色向下

drawOffScreen.drawImage(character,s.LcX,s.LcY,

s.LcX+s.SizeW,s.LcY+s.SizeH,sx,s.SizeH*2,

sx+s.SizeW,s.SizeH*3,this);

break;

case'L':

//角色向左

drawOffScreen.drawImage(character,s.LcX,s.LcY,

s.LcX+s.SizeW,s.LcY+s.SizeH,sx,s.SizeH*3,

sx+s.SizeW,s.SizeH*4,this);

break;

case'R':

//角色向右

drawOffScreen.drawImage(character,s.LcX,s.LcY,

s.LcX+s.SizeW,s.LcY+s.SizeH,sx,s.SizeH,

sx+s.SizeW,s.SizeH*2,this);

break;

}

repaint();

//角色走动动画

sx+=s.SizeW;

if(sx>s.SizeW*2)

sx=0;

try{

Thread.sleep(200);

}

catch(InterruptedExceptione)

{

}

}

}

//=====实现KeyListener界面========================================

publicvoidkeyTyped(KeyEvente){}

publicvoidkeyPressed(KeyEvente)

{

key=e.getKeyCode();

if(key==KeyEvent.VK_RIGHT)//按向右键

{

direction='R';//改变角色绘图方向

s.moveRight();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 电力水利

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1