该对象应该每5秒更改一次模式(移动算法)。我首先尝试使用while循环,但循环迭代速度太快。然后我添加了Thread.sleep(5000)
,但我的对象仍然只在一个算法(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;
}
答案 0 :(得分: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语句之后移动了睡眠,以便它在每个循环中都是一致的。
答案 1 :(得分:2)
我认为您不应该依赖Sleep来测量时间,因为每次运行它时它的行为都会有所不同。线程可以转移睡眠超过上述时间。睡眠仅暂停当前线程特定时间。它不保证该线程会在同一时间后再次开始执行。
答案 2 :(得分:1)
NOT 从构造函数中调用updateMode
。
相反,开始一个新线程。
截至目前,可能会发生以下情况:您的Ghost是创建的,在构造函数完成之前通过所有阶段。然后,当您的主程序启动时,您的幽灵已经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
时,您必须手动删除并读取代码。
答案 3 :(得分:0)
当秒数恰好是7或34或54,......时,没有条件来处理这些情况。它只是不输入任何if语句。