2017-03-02 2 views
1

C#を使用してクイズを作成しました(楽しいと覚えてください) 私の最高得点グリッドには、playerdetailsクラスの情報1回ではなく同じプレイヤーで5回表示されます。コードを参照してください:C#でテキストファイルに書き込むが、グリッドに表示されているときに同じ情報が繰り返される

public frmHighscore() 
    { 
     InitializeComponent(); 

     //Only save the test scores once 
     if (!File.Exists("highscores.txt")) 
     { 
      SaveScores(); 
     } 

     LoadScores(); 
     //Sort the grid based on the value of Column 1 which will be the score value 
     dataGridView1.Sort(dataGridView1.Columns[1], ListSortDirection.Descending); 
    } 

    private void SaveScores() 
    { 
     //Open filestram and streamwriter needed to save details to a text file 
     FileStream fileStream = new FileStream("highscores.txt", FileMode.Append, FileAccess.Write); 
     StreamWriter streamWriter = new StreamWriter(fileStream); 

     try 
     { 
      //loop over each player 

      { 
       //Write details of the player to the textfile in format playerName~Score 
       foreach (Player player in PlayerList) 
       { 
        streamWriter.WriteLine(player.playerName + "~" + player.playerScore); 
       } 
      } 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Error loading the scores", "Please try again"); 
     } 
     finally 
     { 
      //close streamwriter and filestream 
      streamWriter.Close(); 
      fileStream.Close(); 
     } 
    } 

    private void LoadScores() 
    { 
     //Check if the file exists 
     if (File.Exists("highscores.txt")) 
     { 
      //Read in all the details of the text file 
      var playerScores = File.ReadAllLines("highscores.txt"); 

      //check if players exist in the text file 
      if (playerScores.Length > 0) 
      { 
       //Loop over each player details 
       foreach (var playerScore in playerScores) 
       { 
        //Add the player name and score to the datagrid 
        var splitDetails = playerScore.Split('~'); 
        dataGridView1.Rows.Add(splitDetails[0], Convert.ToInt32(splitDetails[1])); 
       } 
      } 
      else 
      { 
       //Hide the grid and show the No Scores label 
       HideGrid(); 
      } 
     } 

マイプレイヤークラスは次のようになります。player変数は、私はそれが、その後

streamWriter.WriteLine(PlayerDetails.playerName + "~" + PlayerDetails.playerScore); 

であると仮定するものであれば 名前空間CWQuiz

{ 
     public class Player 
{ 
    public string Username; 
    public int Score; 
    public int quizNumber; 

    public string playerName { get; set; } 
    public int playerScore { get; set; } 

    public static List<Player> player = new List<Player>(); 


    public Player(string name) 
    { 
     Username = name; 
     Score = 0; 
    } 

} 
} 
+0

foreach(PlayerDetailsのvarプレーヤー) streamWriter.WriteLine(player .playerName + "〜" player .playerScore); } –

+0

どのようなタイプが 'PlayerDetails.playerName'ですか? –

+0

OP37 PlayerDetails.playerNameのコメントによると、文字列型 –

答えて

0

する必要があります
streamWriter.WriteLine(player.playerName + "~" + player.playerScore); 
+1

が 'string'なので' player'は 'char'になります。コンパイラは' playerName'プロパティを見つけることができないと不満を持ちます。 –

0

あなたはPlayerDetails.playerNameタイプstringであると言うよう場合は、6つの文字を持っており、あなたがたびに同じ情報を印刷するstringをループされています

PlayerDetails.playerName + "~" + PlayerDetails.playerScore =>名〜6を。

これは、6行を取得する理由です。

あなただけの現在のプレーヤーの名前とスコアを印刷したい場合は、単にループせずにそれを使用する:

streamWriter.WriteLine(PlayerDetails.playerName + "~" + PlayerDetails.playerScore); 

あなたがあなたのゲーム で複数のプレーヤーを持っているしたい場合は、私が使用することをお勧め選手の情報を保存するための適切な構造。 (あなたはおそらく既に持っている)すべてのあなたの情報を含むクラスPlayer

public class Player 
{ 
    public string playerName { get; set; } 
    public int playerScore { get; set; } 
} 

とすべてのプレイヤーが含まれていList<Player>のようなコレクションを持っています。次に、プレイヤーのリストをループし、反復変数playerを使用して各プレーヤーのプロパティにアクセスします。

List<Player> PlayerList = new List<Player>(); 

PlayerList.Add(new Player(){playerName = "Alfred", playerScore = 0}); 

// start the game 
//... 

// write down the results of all players 
foreach (Player player in PlayerList) 
{ 
    streamWriter.WriteLine(player.playerName + "~" + player.playerScore); 
} 

のforeachでコレクションをループし、その要素item

foreach (var item in collection) 
      ^
       | 

は、各項目を表し、あなたにそのプロパティにアクセスすることができます。あなたの場合、collectionは、charsで構成されたstringであり、は、その文字列の各文字を表します。

EDIT

1)の問題は、あなたのクラスに値を追加したことである:

public string playerName { get; set; } 
public int playerScore { get; set; } 

しかし、あなたはそれらに値を割り当てることはありません。コンストラクタでは、まだ初期化するだけ:

Username = name; 
Score = 0; 

これらの値も使用する必要があります。 forループにUsernameScoreがあります。

2)次に問題は、PlayerListがクラスPlayerに属していないことです。それはプレイヤーの所有物ではなく、ゲームの特性であるため、ゲームが起こっている場所でなければなりません。また、プレイしたいプレイヤーをリストに追加するためです。現実の世界のシナリオのように考えてください。あなたはPlayerList

foreach (Player player in PlayerList) 
{ 
    streamWriter.WriteLine(player.playerName + "~" + player.playerScore); 
} 

をループにしたいfrmHighscoreクラスではしかし、私はそこに、この変数のいずれかの宣言が表示されません。コンパイラは、これを見つけることができないという不満を述べるべきです。これを追加する必要があります。このクラスに記入するか、プレイヤーを初期化してリストに追加するクラスのリファレンスを渡します。

私はあなたがそれをよく理解してくれることを願っています。

+0

ああ、私はここで私は私が取得する行のamoutですので、私はこのためのユーザー名を置くものを見てください。しかし、私はコードを歓迎しているが、PlayerListを参照してください、私は手動でこれらを追加したくない、それはまた、それがフィールドであるが、タイプとして使用されているというエラーをスローする –

+0

プレイヤーをリストに追加する点は、図。エラーについては、あなたのコードが表示されていないので、私はあなたを大いに助けることはできません。投稿の下の[編集ボタン](http://stackoverflow.com/posts/42552505/edit)を使用して、質問にこの情報を編集、追加、更新することができます –

+0

ありがとうございました。編集したバージョン –

関連する問題