0

私は自分のゲームにローカルのハイスコアシステムを追加しようとしていますが、実際に知っているプログラマーや講師、インターネット上のいくつかのチュートリアルによると、ファイルの読み取りと書き込みでレンガの壁にぶつかりました。私のコードは動作するはずです。私が望んでいるように、しかし、ゲームを開始するたびにハイスコアが読み込まれません。ファイルの読み取りと書き込みの両方の関数を以下に示します。愚かな間違いはありますか?

public void ReadHighScore()
    {
        byte[] myByteArray = new byte[64]; // Creates a new local byte array with a length of 64
        using (var store = IsolatedStorageFile.GetUserStoreForApplication()) // Creates an IsolatedStorageFile within the User Storage
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, store)) // Creates a new filestream attatched to the storage file
        {
            if (stream != null) // Checks to see if the filestream sucessfully read the file
            {
                int streamLength = (int)stream.Length; // Gets the length of the filestream
                stream.Read(myByteArray, 0, streamLength); // Parses the filestream to the byte array
            }
            else
                myState = (int)game_state.Terminate; // Temporary Error checking, the function gets though this without triggering the 'terminate' gamestate
        }

        string ScoreString = myByteArray.ToString(); // Parses the byte array to a string
        Int32.TryParse(ScoreString, out highScore.score); // Parses the string to an integer
    }

    public void SaveHighScore()
    {
        byte[] myByteArray = new byte[64]; // Creates a new local byte array with a length of 64
        using (var store = IsolatedStorageFile.GetUserStoreForApplication()) // Creates an IsolatedStorageFile within the User Storage
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, store)) // Creates a new filestream attatched to the storage file
        {
            if (stream != null) // Checks to see if the filestream sucessfully read the file
            {
                int streamLength = (int)stream.Length; // Gets the length of the filestream
                stream.Write(myByteArray, 0, streamLength); // Parses the byte array to the filestream
            }
            else
                myState = (int)game_state.Terminate; // Temporary Error checking, the function gets though this without triggering the 'terminate' gamestate
        }
    }
}
4

1 に答える 1

3

まず、読み取り部分に誤りがあります。ファイルを で開いていますFileMode.Create

そしてドキュメントによると:

オペレーティング システムが新しいファイルを作成する必要があることを指定します。ファイルが既に存在する場合は、上書きされます。

したがって、基本的にReadHighScoreは、古いファイルを削除して新しいファイルを作成しています。これは、あなたがやりたかったことではないと私は信じています。(メソッド内のみ)で置き換えるFileMode.Createと、より良い結果が得られるはずです。FileMode.OpenOrCreateReadHighScore


SaveHighScoreまた、次の行の にエラーがあります。

stream.Write(myByteArray, 0, streamLength);

ファイルを作成しているので、streamLengthは 0 に等しいはずです。したがって、何も書いていません。あなたが本当にやりたいことは次のとおりです。

stream.Write(myByteArray, 0, myByteArray.Length);

StreamReaderStreamWriterBinaryReader、およびを使用BinaryWriterしてストリームを読み書きすることを検討する必要があります。これらははるかに使いやすいためです。


最後になりましたが、読み書きしているデータが間違っています。メソッドではSaveHighScore、空の配列を保存しようとしていますが、実際のハイスコアはどこにもありません。このReadHighScoreメソッドでは、さらに悪いことに、 を読んmyByteArray.ToString()でいますが、これは常に と等しくなりSystem.Byte[]ます。


最終的に、コードは次のようになります: (highScore.scoreとして宣言されている場合int)

public void ReadHighScore()
{
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read, store))
        {
            using (var reader = new BinaryReader(stream))
            {
                highScore.score = reader.ReadInt32();
            }
        }
    }
}

public void SaveHighScore()
{
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, store))
        {
            using (var writer = new BinaryWriter(stream))
            {
                writer.Write(highScore.score);
            }
        }
    }
}
于 2012-11-03T14:07:56.077 に答える