我一直在做一个小项目,试图学习一些基础知识,我正在尝试克隆太空入侵者。我没有真正的经验(这就是我这样做的原因)而且我遇到了一些我以前从未遇到过的问题。
我的问题是循环,我使用了基本循环,但我现在使用了一些嵌套循环,这给我带来了一些问题。这是破坏我的项目的代码
public void moveLevel(int l, ArrayList ms){
switch(l){
case 1:{
centerX = 60;
centerY = 35;
alienArray = ms;
moveRight = true;
while(moveRight == true){
x += 1;
}
}
case 2:{
}
}
}
如果有人认为它会有所帮助,我可以显示更多代码,但基本上,这个块获取传递给它的级别编号 (l) 以及包含大约 15 个“外星人”对象的数组列表。'x+=1' 行是移动外星人的原因(每个外星人的位置是 x)。该代码是从另一个经常从摆动计时器调用的函数中调用的。
发生的事情是,当代码到达这一点时,程序似乎冻结了。我在 JPanel 上有一个没有反应的按钮,我有一个热键来关闭没有反应的应用程序,并且用鼠标退出应用程序什么都不做(我在 JFrame 中包含了 DefaultCloseOperation(EXIT_ON_CLOSE)没有这个while循环也可以工作)。
如果我用“if”替换“while”这个词,就像下面的代码一样。
public void moveLevel(int l, ArrayList ms){
switch(l){
case 1:{
centerX = 60;
centerY = 35;
alienArray = ms;
moveRight = true;
if(moveRight == true){
x += 1;
}
}
case 2:{
}
}
}
我也尝试了一个 do, while 循环。
我不知道问题是什么,我认为这是一个逻辑错误,但对我来说似乎相当简单。同样,如果有人想查看其余代码,我可以发布它。否则,如果有人有任何建议,我将不胜感激。我愿意接受具体的建议,或者只是关于代码效率的一般建议。谢谢
回答
好的,多亏了 Ted Hopp,我已经让我的代码向前发展了,他在下面发表了评论。看起来在 case 语句中正在执行一个无限循环。
这是我对任何好奇的人的修复,我已经包含了从原始帖子调用该函数的函数。
public void move(int l, ArrayList ms){
level = l;
alienArray = ms;
moveLevel(level, alienArray);
centerX += horizontal;
centerY += vertical;
x += horizontal;
y += vertical;
if(moveRight == true){
horizontal = 1;
vertical = 0;
System.out.println(centerX);
}
else x -= 1;
}
public void moveLevel(int l, ArrayList ms){
switch(l){
case 1:{
alienArray = ms;
moveRight = true;
if(moveRight == true){
if (centerX > 300){
moveRight = false;
}
if(moveRight == false){
if(centerX < 100){
}
}
}
}
break;
case 2:{
}
}
}
这基本上只是将所有外星人向右移动并停止到目前为止,但我已经超越了最初的问题。