对象应该根据经过的时间(在追踪或散射之间切换)来改变模式(移动算法)。我创建了一个while循环,但是对象仅在一种模式下移动(追逐),这很奇怪,因为我最初将它设置为散射。
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;
}
答案 0 :(得分:1)
您的评论说它从scatterMode
开始,但是在声明模式时您不会将模式设置为任何内容。因此,它实际上默认为chaseMode
。因为你没有初始化布尔值ghostAlive
,所以它默认为false,这意味着你的循环永远不会发生,这意味着模式不会被设置为scatterMode
,这意味着它始终保持在{{1} }}
要开始解决此问题,您应该将chaseMode
初始化为true。然后,对于所有ifs,您可以放置ghostAlive
语句来结束循环。在整个项目的背景下,我不确定你的目标是什么,但这一点知识应该可以帮助你。你必须以某种方式在循环中使ghostAlive = false
为假,以摆脱循环。
不确定为什么要使用所有这些静态方法和字段。对于您发布的内容似乎没有必要。
此外,将if语句(甚至是单语句)放在大括号中是一种好习惯。如果您以后必须添加一些错误,这将有助于遏制任何错误(因为看起来您将不得不在这里)。