Java 该值递增,但立即返回零
我这里有一个俄罗斯方块项目的代码片段Java 该值递增,但立即返回零,java,field,inner-classes,Java,Field,Inner Classes,我这里有一个俄罗斯方块项目的代码片段 private class Game implements Runnable { private int numDropped = -1; public void setCount(int count){ count++; } public int getCount(){ return count; } public void run() { int colum
private class Game implements Runnable {
private int numDropped = -1;
public void setCount(int count){
count++;
}
public int getCount(){
return count;
}
public void run() {
int column = 4, style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
while (onPlay) {
if (piece != null) {
if (piece.isAlive()) {
try {
Thread.currentThread().sleep(100);
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
continue;
}
}
checkFullLine();
if (isGameOver()) {
playItem.setEnabled(true);
pauseItem.setEnabled(true);
resumeItem.setEnabled(false);
rightPanel.setPlayButtonEnable(true);
rightPanel.setPauseButtonLabel(true);
displayGameOver();
return;
}
piece = new Piece(style, -1, column, board);
piece.start();
style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
rightPanel.setTipStyle(style);
numDropped = numDropped+1;
RightPanel.scoreTextField.setText(numDropped+"");
}
}
}
顺便说一下,类游戏是一个内部类。每当一个新的工件下降时,numDropped
的值就会增加(如JTextField中所显示的),但过一会儿就会回到零。我放错地方了吗
numDropped = numDropped+1;
RightPanel.scoreTextField.setText(numDropped+"");
??或者是因为像是静态的之类的东西。请帮帮我。我对Java有点陌生。多谢各位 您发布的代码绝对不会将scoreTextField
更新为小于先前使用的值
我首先怀疑的是,还有其他一些代码将scoreTextField
更新为不等于numDropped
的值
更新
在您另外发布的代码中,我看到:
RightPanel.scoreTextField = new JTextField(numDropped+"");
这是错误的;删除它并取消注释上面的行,该行设置现有文本字段中的文本
此外,您还有以下代码:
timer = new Timer(
500, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
scoreTextField.setText("" + game.getScore());
int scoreForLevelUpdate = game.getScoreForLevelUpdate();
if (scoreForLevelUpdate >= Tetris.PER_LEVEL_SCORE && scoreForLevelUpdate > 0)
game.levelUpdate();
}
}
);
timer.start();
显然,这将用游戏分数覆盖scoreTextField
,而在game
的循环中,您正在写入被删除元素的数量。根据变量scoreTextField
的名称判断,您应该在Game
中更改代码,以更新其他一些文本字段,而不是用于显示分数的文本字段
您设计中的另一个错误是:
Thread thread = new Thread(new Game());
thread.start();
您正在启动另一个线程来控制游戏性。您不能更新主GUI线程(即所谓的事件调度线程(EDT))之外的任何Swing组件。我的建议是重新设计您的代码,类似于您在上面使用timer
变量所做的工作:不要启动另一个线程;相反,计划另一个间隔为100毫秒的计时器
,并在while(onPlay)
中基于当前代码执行相关的actionPerformed
——您需要更改的只是不再需要循环。当然,Thread.sleep(100)
也将是多余的。游戏结束后,只需取消计时器任务
与此问题没有直接关系,但此代码
public void setCount(int count){
count++;
}
这也是错误的:它不会写入实例变量count
,而只是增加提供的参数,立即丢弃它(它只是一个局部变量)。您发布的代码绝对不会将scoreTextField
更新为小于先前使用的值的值
我首先怀疑的是,还有其他一些代码将scoreTextField
更新为不等于numDropped
的值
更新
在您另外发布的代码中,我看到:
RightPanel.scoreTextField = new JTextField(numDropped+"");
这是错误的;删除它并取消注释上面的行,该行设置现有文本字段中的文本
此外,您还有以下代码:
timer = new Timer(
500, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
scoreTextField.setText("" + game.getScore());
int scoreForLevelUpdate = game.getScoreForLevelUpdate();
if (scoreForLevelUpdate >= Tetris.PER_LEVEL_SCORE && scoreForLevelUpdate > 0)
game.levelUpdate();
}
}
);
timer.start();
显然,这将用游戏分数覆盖scoreTextField
,而在game
的循环中,您正在写入被删除元素的数量。根据变量scoreTextField
的名称判断,您应该在Game
中更改代码,以更新其他一些文本字段,而不是用于显示分数的文本字段
您设计中的另一个错误是:
Thread thread = new Thread(new Game());
thread.start();
您正在启动另一个线程来控制游戏性。您不能更新主GUI线程(即所谓的事件调度线程(EDT))之外的任何Swing组件。我的建议是重新设计您的代码,类似于您在上面使用timer
变量所做的工作:不要启动另一个线程;相反,计划另一个间隔为100毫秒的计时器
,并在while(onPlay)
中基于当前代码执行相关的actionPerformed
——您需要更改的只是不再需要循环。当然,Thread.sleep(100)
也将是多余的。游戏结束后,只需取消计时器任务
与此问题没有直接关系,但此代码
public void setCount(int count){
count++;
}
这也是错误的:它不写入实例变量count
,只是增加提供的参数,立即丢弃它(它只是一个局部变量)。我能看到它如何设置为零的仅有两个地方如下:
public int getScore() {
if (board != null)
return board.getScore();
return 0;
}
及
在某个时刻,您的板
对象可能在重置功能中被置空。将调试器绑定到进程上,并在这两个函数中放置断点。我能看到的两个地方是如何将其设置为零的,如下所示:
public int getScore() {
if (board != null)
return board.getScore();
return 0;
}
及
在某个时刻,您的板
对象可能在重置功能中被置空。将调试器绑定到进程上,并在这两个函数中放置一个断点。“或者因为其他原因,例如是静态的
之类的东西。”即使不是由此引起的,属性/代码可能也应该更改,以允许它成为实例属性。您没有发布足够的代码,我们无法帮助您。这是如何调用的?@Woot4Moo实际上,在任何情况下都不会使这个特定的代码减量/重置numDropped
。@MarkoTopolnik如果OP调用setCount(numbersmallerhancurrent)
will@Woot4Moo什么意思?这只会更新count
变量,该变量在任何地方都不会被读取(好吧,除了getter中)。“或者因为是静态的之类的东西。”即使不是由此引起的,属性/代码可能应该更改为允许它成为实例属性。您没有发布足够的代码,我们无法帮助您。这是如何调用的?@Woot4Moo实际上,在任何情况下都不会使这个特定的代码减量/重置numDropped
。@MarkoTopolnik如果OP调用setCount(number