?? 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 + -