值递增但立即回零

时间:2012-10-10 13:25:37

标签: 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 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的新手。非常感谢你!

2 个答案:

答案 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对象可能会被重置,可能在重置功能中。将调试器绑定到进程上并在这两个函数中放置一个断点。