我这里有我的俄罗斯方块项目的代码片段。
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+"");
}
}
}
顺便说一句,班级Game
是一个内部类。每当新片断下来时,numDropped
的值递增(如JTextField中所示),但过了一会儿就会回到零。我错放了
numDropped = numDropped+1;
RightPanel.scoreTextField.setText(numDropped+"");
?或者因为其他东西如static
和其他东西。请帮我。我是Java的新手。非常感谢你!
答案 0 :(得分:2)
您发布的代码肯定永远不会将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线程之外的任何Swing组件,即所谓的事件调度线程(EDT)。我的建议是重新设计你的代码,类似于你在timer
变量上所做的:不要启动另一个线程;而是以100毫秒的间隔安排另一个Timer
,并根据actionPerformed
中的当前代码实施关联的while (onPlay)
- 您需要更改的是您不需要需要循环了。当然,Thread.sleep(100)
也是多余的。当游戏结束时,只需cancel
你的计时器任务。
与此问题的问题没有直接关系,但此代码
public void setCount(int count){
count++;
}
也是错误的:它不会写入实例变量count
,而只是增加提供的参数,立即丢弃它(它只是一个局部变量)。
答案 1 :(得分:1)
我能看到它如何设置为零的唯一两个地方如下:
public int getScore() {
if (board != null)
return board.getScore();
return 0;
}
AND
public int getScoreForLevelUpdate() {
if (board != null)
return board.getScoreForLevelUpdate();
return 0;
}
在某些时候,您的board
对象可能会被重置,可能在重置功能中。将调试器绑定到进程上并在这两个函数中放置一个断点。