0

オブジェクトは、経過時間に応じてモード (移動アルゴリズム) を変更することになっています (チェイスまたはスキャッターの切り替え)。while ループを作成しましたが、オブジェクトは 1 つのモード (追跡) でしか移動しません。これは、最初に散布するように設定したため、奇妙です。

private static int seconds=0;
private static boolean ghostalive;

protected static final int chaseMode = 0;
protected static final int scatterMode = 1;
protected static final int frightenedMode = 2;

static int mode; //initially ghost start in scatterMode

public Ghost(int x, int y, Maze maze){
    super(x, y, maze);
    futureDirection = 0;
    timer = 0;
    mode = getMode();
}     

public static int getMode(){
    mode=setMode();
    return mode;
}

//LEVEL 1
//scatter for 7s 
//chase for 20s 
//scatter for 7s 
//chase for 20s 
//scatter for 5s 
//chase for 20s
//scatter for 5s 
//chase indefinite

public static int setMode(){

while(ghostalive){

    mode = scatterMode;
    if(seconds>7)
        mode = chaseMode;//chaseMode=true;
    if(seconds>27)
        mode = scatterMode;
    if(seconds>34)
        mode = chaseMode;
    if(seconds>54) 
        mode = scatterMode;
    if(seconds>59) 
        mode = chaseMode;
    if(seconds>79)
        mode = scatterMode;
    if(seconds>84)
        mode = chaseMode;

    seconds++;      
   }    
       return mode;
}
4

1 に答える 1

1

あなたのコメントはそれがで始まると言っていますがscatterMode、宣言されたときにモードを何にも設定しません。したがって、実際にはデフォルトでchaseMode. boolean を初期化しないためghostAlive、デフォルトで false になります。これは、ループが発生しないことを意味します。これは、モードが に設定されないことscatterModeを意味します。つまり、常に に留まることを意味しますchaseMode

これを修正するには、ghostAlivetrue に初期化する必要があります。次に、すべての if に対してghostAlive = false、ループを終了するステートメントを配置できます。プロジェクト全体のコンテキストでこの方法を使用して目的が何であるかは正確にはわかりませんが、その少しの知識はどちらの方法でも役立つはずです. ghostAliveループから抜け出すには、何らかの方法でループ内で false にする必要があります。

ただし、これらすべての静的メソッドとフィールドを使用している理由はわかりません。あなたが投稿したものには不必要に思えます。

さらに、単一のステートメントであっても、if ステートメントを中括弧で囲むことをお勧めします。これは、後で追加する必要がある場合にエラーを抑えるのに役立ちます (ここで追加する必要があるようです)。

于 2012-11-15T04:42:12.573 に答える