📄 mi.java
字号:
{
if(向上())
peopley--;
}
if(key==KeyEvent.VK_DOWN)//向下走
{
if(向下())
peopley++;
}
repaint();
}
//---------------------------------------------------------------------------
//避免闪动的方法
//
//---------------------------------------------------------------------------
public void update(Graphics g)
{
paint(g);
}
//----------------------------------------------------------------------------
//向上,下,左,右方向的方法
//
//---------------------------------------------------------------------------
private boolean 向右(){
if(标记[peoplex][peopley]=='r'
||标记[peoplex][peopley]=='e')//如果右边有通道,就返回true
return true;
else return false;
}
private boolean 向上(){
if(标记[peoplex][peopley]=='u'||
标记[peoplex][peopley]=='e')//如果上边有通道,就返回true
return true;
else return false;
}
private boolean 向左(){
if((标记[peoplex-1][peopley]=='r')||
(标记[peoplex-1][peopley]=='e'))//如果左边有通道,就返回true
return true;
else return false;
}
private boolean 向下(){
if((标记[peoplex][peopley+1]=='u')||
(标记[peoplex][peopley+1]=='e'))//如果下边有通道,就返回true
return true;
else return false;
}
//---------------------------------------------------------------------------
//画出人的方法
//
//---------------------------------------------------------------------------
private void 画出人(Graphics page)
{
if(peoplex==(n+1)&&peopley==n)//当人的坐标超出了边界之后,人重新回到始点,进入下一关
{
peoplex=peopley=1;
if(nn<=40)nn++;
label.setText("关数:"+(nn-9));
生成迷宫();
}
page.drawImage(people,peoplex*width,peopley*width+10,width-10,width-8,this);
//在人位置上画出人
Font f=new Font("Dialog",Font.BOLD+Font.ITALIC,40);
page.setFont(f);
page.setColor(Color.black);
page.drawString("第"+(n-9)+"关",0,40);
if(peoplex==n&&peopley==n)
timer.stop(); //当人的位置处于坐标(n,n)时,自动演示就停止
}
//--------------------------------------------------------------------------------
//在人所在之处进行遍历,目的是遍历到坐标(n,n)这个位置,这个位置就是要遍历的目标
//
//-------------------------------------------------------------------------------
private void find(int i,int j)
{
if(i==n&&j==n) //用find方法进行递归遍历,目的是找到坐标为(n,n)的位置
{ //当找到时就令purpose为1,表示已经找到了,0表示还没有找到
purpose=1;
direction=4;
}
mark[i][j]=1; //遍历过的地方用mark[i][j]=1标记,否则则标记为0
if((标记[i][j]=='u'||标记[i][j]=='e')&&purpose==0)
{//----------------------------------------------------------------
//如果本坐标的上方没有"上墙",且还没有遍历到坐标(n,n),则执行下列程序
//------------------------------------------------------------------
if(标记[i][j-1]!='w'&&(mark[i][j-1]==0))
{ //如果本坐标的上方不是边界且还没有遍历,则向上遍历
find(i,j-1);
if(purpose==1)direction=1;
//如果如果目标已经找到,就令用于指示方向的direction为1,表示要找到(n,n)
//这个目标必然经过本坐标,而且在本坐标遍历时是向上走,2表示向下走
//3表示向左走,4表示向右走
}
}
if((标记[i][j+1]=='e'||标记[i][j+1]=='u')&&purpose==0&&mark[i][j+1]==0)
{ //-------------------------------------------------------------------------
//如果向下存在通道,且还没有遍历到坐标(n,n),而(i,j+1)还没有遍历,则向下遍历
//--------------------------------------------------------------------------
find(i,j+1);
if(purpose==1)direction=2;
}
if((标记[i-1][j]=='r'||标记[i-1][j]=='e')&&purpose==0&&mark[i-1][j]==0)
{ //-------------------------------------------------------------------------
//如果向左存在通道,且还没有遍历到坐标(n,n),而(i,j+1)还没有遍历,则向下遍历
//--------------------------------------------------------------------------
find(i-1,j);
if(purpose==1)direction=3;
}
if((标记[i][j]=='e'||标记[i][j]=='r')&&(标记[i+1][j]!='w')&&purpose==0&&mark[i+1][j]==0)
{ //-------------------------------------------------------------------------
//如果向右存在通道,且还没有遍历到坐标(n,n),而(i,j+1)还没有遍历,则向下遍历
//--------------------------------------------------------------------------
find(i+1,j);
if(purpose==1)direction=4;
}
}
//---------------------------------------------------------------------------------------
//提示方向方法,用画出提示的方向
//
//----------------------------------------------------------------------------------------
private void 提示方向(Graphics page){
if(是否提示==1){
if(direction==1) //当direction为一时,表示向上有路通向终点,并画出指向上方的箭头
page.drawImage(updirection,peoplex*width,peopley*width,width,width,this);
if(direction==2) //当direction为二时,表示向下有路通向终点,并画出指向下方的箭头
page.drawImage(downdirection,peoplex*width,peopley*width,width,width,this);
if(direction==3) //当direction为三时,表示向左有路通向终点,并画出指向左方的箭头
page.drawImage(leftdirection,peoplex*width,peopley*width,width,width,this);
if(direction==4) //当direction为四时,表示向右有路通向终点,并画出指向右方的箭头
page.drawImage(rightdirection,peoplex*width,peopley*width,width,width,this);
}
是否提示=0; //当执行一次后就令"是否提示"等于0,这样当下次的时候就不再显示方向了
}
//-----------------------------------------------------------------------------------------
//"调整"方法,是用于使镜头始对应着小人,就算小人出了视野,也可以通过此方法能看到它的所在处
//
//
//---------------------------------------------------------------------------------------------
public void 调整(Graphics page)
{
page_2d=(Graphics2D)page;
page_2d.translate(原点i*width,原点j*width);
//此方法为平移画面方法,相对原来的原点来说,向右平移"原点i*width",向下平移"原点j*width"
//此方法对应于下面的平移方法,目的是使现在的"原点"恢复到(0,0)的坐标上
if(peoplex==1&&peopley==1)原点i=原点j=0;
if(原点i>=0&&原点j>=0)
{
if((peoplex-原点i)>=10) //当人横坐标离原点的横坐标超过10时,原点就向右平移6个单位
原点i+=6;
if((peoplex-原点i)<=4) //当人横坐标离原点的横坐标小于4时,原点就向右平移6个单位
if(原点i!=0)
原点i-=6;
if((peopley-原点j)>=10) //当人纵坐标离原点的纵坐标超过10时,原点就向下平移6个单位
原点j+=6;
if((peopley-原点j)<=4) //当人的纵坐标离原点的纵坐标小于4时,原点就向上平移6个单位
if(原点j!=0)
原点j-=6;
}
page_2d.translate(-1*原点i*width,-1*原点j*width);
//此方法为平移画面方法,相对原来的原点来说,向右平移"原点i*width",向下平移"原点j*width"
}
//-------------------------------------------------------------------------------
//"Listen演示"内部类,此内部类可以演示小人在迷宫内部行走的动画
//
//
//---------------------------------------------------------------------------------
private class Listen演示 implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mark[i][j]=0;
purpose=0; //purpose=0表示还没有找到目标,当purpose=1时,就表示已经找到目标了
direction=1;//direction表示方向,当direction=0时就表示初始化,没有方向
//direction=1,2,3,4分别表示向上,下,左,右
find(peoplex,peopley);//从人物当前的位置做起,进行递归
if(direction==1)
peopley-=1;
else{
if(direction==2)
peopley+=1;
else{
if(direction==3)
peoplex-=1;
else peoplex+=1;
}
}
repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -