0

ここに私の Tetris プロジェクトのコード スニペットがあります。

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が初めてです。どうもありがとうございました!

4

2 に答える 2

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'sループでは、ドロップされた要素の数を書き込んでいます。変数の名前から判断すると、スコアの表示に使用されるテキストフィールドではなく、他のテキストフィールドを更新するようscoreTextFieldにコードを変更する必要があります。Game

あなたのデザインで間違っているさらにもう一つのことはこれです:

Thread thread = new Thread(new Game());
thread.start();

ゲームプレイを制御するために別のスレッドを開始しています。メインGUIスレッド、いわゆるイベントディスパッチスレッド(EDT)の外部でSwingコンポーネントを更新しないでください。私の提案は、変数を使用して上記で行ったのと同様にコードを再設計することですtimer。別のスレッドを開始しないでください。代わりにTimer、100ミリ秒の間隔で別のスケジュールを設定actionPerformedし、現在のコードに基づいて関連を実装しwhile (onPlay)ます。変更する必要があるのは、ループが不要になることだけです。もちろん、Thread.sleep(100)冗長にもなります。ゲームが終わったらcancel、タイマータスクだけです。

この質問の問題に直接関係していませんが、このコード

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

また、間違っています。インスタンス変数には書き込まれませんcountが、指定された引数をインクリメントし、すぐに破棄します(これは単なるローカル変数です)。

于 2012-10-10T13:34:16.307 に答える
1

ゼロに設定される方法を確認できる唯一の2つの場所は次のとおりです。

public int getScore() {
        if (board != null) 
            return board.getScore();
        return 0;
    }

  public int getScoreForLevelUpdate() {
        if (board != null) 
            return board.getScoreForLevelUpdate();
        return 0;
    }

ある時点boardで、おそらくリセット関数で、オブジェクトが無効になっています。デバッガーをプロセスにストラップし、これら 2 つの関数にブレーク ポイントを配置します。

于 2012-10-10T13:43:52.783 に答える