0

オブジェクトは、5 秒ごとにモード (移動アルゴリズム) を変更することになっています。最初に while ループを試してみましたが、ループの繰り返しが速すぎました。次に追加しましThread.sleep(5000)たが、それでもオブジェクトは 1 つのアルゴリズムでしか動きません ( scatterMode)。アルゴリズムは次のとおりです。

//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 void updateMode() throws InterruptedException {  
    while(ghostalive){
        if(seconds<7){
            Thread.sleep(100);
            mode = scatterMode;
        }
        if(7<seconds && seconds<27){
            Thread.sleep(5000);
            mode = chaseMode;
        }
        if(27<seconds && seconds<34){
            Thread.sleep(5000);
            mode = scatterMode;
        }
        if(34<seconds && seconds<54) {
            Thread.sleep(5000);
            mode = chaseMode;
        }
        if(54<seconds && seconds>59) {
            mode = scatterMode;
        }
        if(59< seconds && seconds<79){
            mode = chaseMode;
        }
        if(seconds>84){
            mode = scatterMode;
            ghostalive=false;
        }
        seconds++;
        ghostalive=false;
    }
}

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

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

static int mode = scatterMode; //initially ghost start in scatterMode

public Ghost(int x, int y, Maze maze) throws InterruptedException{
    super(x, y, maze);
    futureDirection = 0;
    timer = 0;
    updateMode();
    //chaseMode = false; 
    //frightenedMode = false;
}     

public static int getMode(){
    return mode;
}
4

4 に答える 4

3

睡眠パターンはミリ秒と数秒の混合ですが、秒を数えることを期待しています。

次のようなものを試してください。

while(ghostalive){

    if(seconds<7){
        mode = scatterMode;

    }

    if(7<seconds && seconds<27){
        mode = chaseMode;
    }

    if(27<seconds && seconds<34){
        mode = scatterMode;
    }

    if(34<seconds && seconds<54) {
        mode = chaseMode;
    }

    if(54<seconds && seconds>59) {
        mode = scatterMode;
    }

    if(59< seconds && seconds<79){
        mode = chaseMode;
    }

    if(seconds>84){
        mode = scatterMode;
        ghostalive=false;
    }

    seconds++;
    Thread.Sleep(1000);//Sleep for one second only

    //ghostalive=false; // Should this be here? Ghost is set to not alive after each loop?
}

各ループで一貫性を保つために、ifステートメントの後にスリープを移動しました。

于 2012-11-15T17:23:03.060 に答える
2

実行するたびに動作が異なる可能性があるため、時間を測定するために Sleep に頼るべきではないと思います。スレッドは、指定された時間よりも長くスリープ状態になる可能性があります。スリープは、特定の時間だけ現在のスレッドを一時停止します。このスレッドが同じ時間後に再び実行を開始することは保証されません。

于 2012-11-15T17:45:09.467 に答える
1

コンストラクターから呼び出さないでください。updateMode

代わりに、新しいスレッドを開始してください。

現時点では、おそらく次のことが起こります。ゴーストが作成され、コンストラクターが完了する前にすべてのステージを通過します。ghostalive=false次に、メイン プログラムが開始されると、ゴーストがscatterModeすでに存在します。

デバッグのために、多くのLogginステートメントを入れます。ロギング API を使用するのが最善ですが、多くの初心者はSystem.out.println. 実行していること、つまりゴーストをどのモードに設定したかだけを印刷することをお勧めします。

次にゲームタイマーも追加すると、実際のゲームが始まる前に、ゴーストが最初にすべての状態を通過することが簡単にわかるはずです(つまり、「ゲームが開始されました」のログも必須です.

ロギングは、印刷よりも難しくありません。

// for each class, add such a line:
private static final LOG = java.util.logging.Logger.getLogger("packagename.classname");

static {
  // Configure the active logging level manually
  // For larger projects, use a .properties file!
  LOG.setLevel(java.util.logging.Level.ALL);
}

// inside of appropriate methods, use
if (LOG.isLoggable(Level.DEBUG)) {
  LOG.log(Level.DEBUG, "My ghost is now frightened.");
}

if声明は重要です。ホットスポットによって適切に最適化できるため、ロギングが無効になっている場合、ロギング ステートメントはほぼ無料で提供されます。

良い点は、これらのステートメントを簡単にオンまたはオフにできることです。手動でコードをSystem.out.println削除して再読み込みする必要があります。

于 2012-11-15T17:26:43.360 に答える
0

seconds が正確に 7、34、または 54 の場合、これらのケースを処理する条件はありません。if ステートメントのいずれにも入らないだけです。

于 2012-11-15T17:24:16.183 に答える