0

私が取り組んでいるゲームでStringは、スコアを表示する があります。問題は、コードがStringをファイルに保存することです。ゲームをプレイするとスコアが更新されるため、ファイルに常にスコアを保存したくありません。そのため、このようにスイングタイマーからメソッドを実行します。

        Timer timer = new Timer(1, new ActionListener(){
            public void actionPerformed(ActionEvent e){
                save();
            } 
        });
        timer.start();

少し前に作成したテキスト プログラムにまったく同じコードを使用したので、save メソッドは次のようになります。

    public void save(){
        try{
            getScore = new File("Score.dat");
            scoreFile = new FileOutputStream(getScore);
            byte[] saveScore = score.getBytes();
            scoreFile.write(saveScore);
            scoreFile.close();
        }catch(FileNotFoundException ex){

        }catch(IOException ex){

        }
    }

ゲームの開始画面New GameContinue. New Gameファイルを押すとテキストが 0 に更新Continueされ、コードを押すと通常どおりに進み、スコアがファイルに表示されているものと等しくなるようにしました。これはActionListener2 つのボタン用です。

    public void actionPerformed(ActionEvent e){
    Object command = e.getSource(); 
    if(command.equals(newGame)){
        try{
            PrintWriter pw = new PrintWriter(new File("Score.dat"));
            pw.print("0");
            pw.close();
        }catch (FileNotFoundException ex){

        }
        startGame = true;
    }
    if(command.equals(contGame)){
        startGame = true;
    }
}

ファイルは正常に作成され、エラーは発生しませんが、ファイルは更新されず、ファイル内は常に 0 になります。ファイルのテキストを0に設定するために機能するため、PrintWriter代わりに使用しようとしましたが、ファイルエクスプローラーで使用するとクラッシュし、コンピューターを再起動する必要があります。FileOutputStreampw.print(score);

編集:

問題が何であるかを理解しましたが、それを解決する方法がわかりません。スコアを印刷すると、結果は次のようになります: 0, 0, 0, 0, 10, 0, 0, 0, 0, 20, 0, 0, 0, 0, 30 (ファイル内の数値が0、50 の場合は、すべての 0 を 50 に置き換えます) などです。

ご覧のとおり、ファイルがスコアを更新する可能性は 25% しかありません。コード内にこれを引き起こす可能性のある場所がないため、なぜこれが起こっているのかわかりません。

これはスコアをロードするコードです。

    public void load(){
        try{
            br = new BufferedReader(new FileReader("Score.dat"));
            score = br.readLine();
        }catch (FileNotFoundException ex){

        }catch(IOException ex){

        }
    }

このメソッドはload();public Player()メソッド (Playerはクラスの名前) に含めることで 1 回実行されます。

4

2 に答える 2

0

scoreこれを提案するのは嫌いですが、メソッドで変数がゼロでないことは確かsave()ですか? scoreデバッグ目的での値を出力する行をそこに入れるか、デバッガで値を確認することを検討してください。このメソッドには明らかな問題はありません。で定義されているように が autoflush するflush()ため、がなくても機能します。PrintWriterclose()Writer

バックスラッシュが指摘したように、おそらくタイマーのスリープ時間を増やしたいと思うでしょう。1 ミリ秒は本当に短いです。

于 2013-05-01T16:29:04.213 に答える
0

同期の問題が発生している可能性があります。スコアを取得してファイルに書き込むメソッドを 1 つだけ作成します。新しいゲームでこのメソッドを呼び出し、続行し、ウィンドウを閉じます (Java フレームの場合)、およびタイマーで。ただし、タイマーを少なくとも 250 ミリ秒にします。

synchronized void save(int score) {
    PrintWriter pw = null;//any resource with IO should be in a finally block to close
    try {
        pw = new PrintWriter(new File("Score.dat"));
        pw.print("" + score);
        pw.close();
    } catch (Exception ex) {
        System.out.println("save err " + ex);
        ex.printStackTrace();
        // or better get a logger
        // logger.log(Level.WARNING,"save err " + ex ,ex);

    }finally{
        if (pw != null) {
            try {
                pw.close();
            } catch (Throwable e) {
                logger.log(Level.FINER, "err close :pw" , e);
            }
        }           
    }
}

編集:スコア変数をintまたはlongとして保持することをお勧めします。それに応じてコードを編集して読み取ります

于 2013-05-01T17:27:26.203 に答える