It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center
                            
                        
                    
                
                7年前关闭。
            
        

我这里有我的俄罗斯方块项目的代码片段。

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

最佳答案

您发布的代码绝对不会将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毫秒的间隔安排另一个Timer,并根据您在actionPerformed中的当前代码实现相关的while (onPlay)-您需要更改的只是不再需要循环。当然,Thread.sleep(100)也将是多余的。游戏结束后,只需cancel您的计时器任务即可。

与这个问题的问题没有直接关系,但是这段代码

public void setCount(int count){
    count++;
}


这也是错误的:它不会写入实例变量count,而只是增加所提供的参数,并立即将其丢弃(这只是一个局部变量)。

关于java - 值增加,但立即返回零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12820464/

10-11 01:01