Файл StreamReader, как обновлять ТОЛЬКО при достижении высокого балла в списке?

Как мне написать файл StreamReader, в котором он будет переопределять рекорд игры, ТОЛЬКО если он выше текущего рекорда? В настоящее время все оценки обновляются в списке, а не только те оценки, которые превышают текущий файл score/txt.

Заранее спасибо

public partial class Form1 : Form
{
    int Dice;
    int RunningTotal;
    int MaxRolls;
    int RollCount;
    Random rand = new Random();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        RollDiebutton.Enabled = true;
        StartOverbutton.Enabled = true;
        ClickBeginGametoStartlabel.Visible = false;
        int beginTotal = 0;
        TotalMoneyEarnedlabel.Text = beginTotal.ToString("c");

        MaxRolls = rand.Next(3) + 2;
    }

    private void button4_Click(object sender, EventArgs e)         
    {
        try
        {
            string highScore;
            StreamReader inputFile; 

            inputFile = File.OpenText("Highscore.txt"); 
            HighscoreBox.Items.Clear();

            while (!inputFile.EndOfStream)
            {
                highScore = inputFile.ReadLine();   
                HighscoreBox.Items.Add(highScore);
            }

            inputFile.Close();
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        RollDiebutton.Enabled = false;
        BeginGamebutton.Enabled = true;
        StartOverbutton.Enabled = false;
        TotalMoneyEarnedlabel.Text = "";

        BeginpictureBox.Image = P2Kbembow.Properties.Resources.Begin;
        Pressyourluckandrollagainlabel.Visible = false;
        ClickBeginGametoStartlabel.Visible = true;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        //Close Form
        this.Close();
    }

    private void RollDiebutton_Click(object sender, EventArgs e)
    {
        Random rand = new Random();
        Dice = rand.Next(6) + 1;

        RunningTotal += 0;
        int DollarAmount = 100;
        int Sum = (Dice * DollarAmount);

        BeginGamebutton.Enabled = false;
        Pressyourluckandrollagainlabel.Visible = true;

        RunningTotal += Sum;
        TotalMoneyEarnedlabel.Text = RunningTotal.ToString("c");
        RollCount += 1;

        if (MaxRolls == 0)
        {
            Random getMax = new Random();
            TotalMoneyEarnedlabel.Text = ""; 
        }
        else
            if (RollCount >= MaxRolls)
            {
                MaxRolls = 6;
                RollCount = 0;
                RunningTotal = 0;

                TotalMoneyEarnedlabel.Text = "$0.0";
                Show(); MessageBox.Show("Sorry! You lose!");

                RollDiebutton.Enabled = false;
                BeginGamebutton.Enabled = true;

                TotalMoneyEarnedlabel.Text = "";

                BeginpictureBox.Image = P2Kbembow.Properties.Resources.Begin;
                Pressyourluckandrollagainlabel.Visible = false;
                ClickBeginGametoStartlabel.Visible = true;
                StartOverbutton.Enabled = false;

                return;
            }

        StreamWriter outputFile;
        outputFile = File.CreateText("HighScore.txt");

        outputFile.WriteLine(TotalMoneyEarnedlabel.Text);
        outputFile.Close();

        if (Dice == 1)
        {
            //shows Image of dice 1
            BeginpictureBox.Image = P2Kbembow.Properties.Resources._1Die;
        }

        if (Dice == 2)
        {
            //shows Image of dice 2
            BeginpictureBox.Image = P2Kbembow.Properties.Resources._2Die;
        }

        if (Dice == 3)
        {
            //shows Image of dice 3
            BeginpictureBox.Image = P2Kbembow.Properties.Resources._3Die;
        }
        if (Dice == 4)
        {
            //shows Image of dice 4
            BeginpictureBox.Image = P2Kbembow.Properties.Resources._4Die;
        }

        if (Dice == 5)
        {
            //shows Image of dice 5
            BeginpictureBox.Image = P2Kbembow.Properties.Resources._5Die;
        }

        if (Dice == 6)
        {
            //shows Image of dice 6
            BeginpictureBox.Image = P2Kbembow.Properties.Resources._6Die;
        }

        //Display Message Box of dice rolled 
        Show(); MessageBox.Show(" You rolled a  " + Dice + "!");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            string highScore;
            StreamReader inputFile;

            inputFile = File.OpenText("Highscore.txt");
            HighscoreBox.Items.Clear();

            while (!inputFile.EndOfStream)
            {
                highScore = inputFile.ReadLine();
                HighscoreBox.Items.Add(highScore);

            }

            inputFile.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }    
    }
}

person cpkob    schedule 01.11.2012    source источник
comment
переопределить высокие баллы HighscoreBox в играх ? я не мог этого понять... каковы ваши критерии для высокой оценки?   -  person Mullaly    schedule 01.11.2012
comment
Вы хотите перезаписать значение рекорда в текстовом файле?   -  person Prabhu Murthy    schedule 01.11.2012
comment
Извините, кажется, я отредактировал там, где я не похож на такого идиота, ха-ха. Но в значительной степени, если текущий новый общий результат больше, чем предыдущий высокий балл, показанный в форме или в моем текстовом файле, который я создал, мне нужно, чтобы игра перезаписала новый общий высокий балл в текстовый файл, чтобы он впоследствии отображался в форме.   -  person cpkob    schedule 01.11.2012
comment
Да Codelgnoto это правильно, где только рекорд будет обновляться в txt файл и показывать по моей программе на новых играх.   -  person cpkob    schedule 01.11.2012
comment
@cpkob Я думаю, вы хотите показать только наивысший балл из текстового файла в список? В настоящее время вы добавляете каждый балл в свой список.   -  person nawfal    schedule 01.11.2012
comment
Да, как бы я это сделал?   -  person cpkob    schedule 01.11.2012
comment
@cpkob это довольно тривиально. У вас есть только одна оценка в виде целых чисел в каждой строке вашего файла?   -  person nawfal    schedule 01.11.2012
comment
Да, я записал случайный рекорд в файле .txt, который предварительно загружен в игру, и мне просто нужно, чтобы он обновлял .txt и список, отображающий ТОЛЬКО когда счет был побит, но просто не могу понять, как это сделать.   -  person cpkob    schedule 01.11.2012


Ответы (1)


Проблемная часть вашего кода очень тривиальна. Чтобы добавить только наивысший балл из вашего файла в список, вы можете просто использовать:

var highScore = File.ReadAllLines("Highscore.txt").Max(score => decimal.Parse(score));
HighscoreBox.Items.Clear();
HighscoreBox.Items.Add(highScore);

Но есть ряд других вещей, о которых вы должны позаботиться:

  1. Вы должны убедиться, что имеется действующий лист рекордов. Поэтому проверьте это при загрузке формы (и, возможно, вам не нужно создавать и перезаписывать существующий файл каждый раз при броске кубика).

  2. СУХОЙ ваш код для загрузки рекордов из файла в список.

    string _fileName = "Highscore.txt";
    
    private void Form1_Load(object sender, EventArgs e)
    {
        if (!File.Exists(_fileName))
        {
            File.Create(_fileName);
            return; 
        }
    
        LoadHighestScore();
    }
    
    private void LoadHighestScore()
    {
        HighscoreBox.Items.Clear();
    
        var highestScore = GetHighestScore();
        HighscoreBox.Items.Add(highestScore);
    }
    
    private decimal GetHighestScore()
    {
        var scores = File.ReadAllLines(_fileName);
        if (scores.Length == 0)
            return 0;
    
        return scores.Max(score => decimal.Parse(score));
    }
    
  3. Вы можете записывать счет в свой файл каждый раз после броска кубика следующим образом:

    private void RollDiebutton_Click(object sender, EventArgs e)
    {
        //-------------------------
        //-------------------------
    
        WriteScore(score);
    
        //-------------------------
        //-------------------------
    }
    
    private void WriteScore(string score)
    {
        File.AppendAllLines(sd, new string[]{ score });
    }
    

Имейте в виду, что это appends баллы в вашем файле каждый раз. Если вам нужно писать только в том случае, если оценка превосходит существующую наивысшую оценку (что не очень ясно из вашего вопроса), вы можете сделать:

    private void WriteScore(string score)
    {
        if (int.Parse(score) > GetHighestScore())
            File.AppendAllLines(sd, new string[]{ score });
    }
  1. Пожалуйста, разбейте большую часть кода на разные методы, чтобы облегчить повторное использование кода. Еще лучше, если вы можете перенести логику в другой класс.

  2. Для этого лучше использовать небольшую облегченную клиентскую базу данных, такую ​​как SQLite. Что, если в будущем вам понадобится более сложная операция, например, «наивысший балл для каждого пользователя»? Чтобы получить максимальный балл, вы можете сделать:

    SELECT MAX(score) FROM highscores;
    

Так просто.

Наконец, пожалуйста, опубликуйте проблемный участок вашего кода, а не целую кучу нерелевантных строк.

person nawfal    schedule 01.11.2012
comment
Спасибо за ответ, но использование этого, похоже, не работает в моем файле, это приводит к сбою моей программы. Есть ли еще какой-нибудь совет, который вы можете мне дать? в простейшей форме, где будет отражаться только высокий балл. И извините за столько кода. Я супер новичок в программировании. - person cpkob; 02.11.2012
comment
@cpkob где происходит сбой? В какой строке? Расскажите нам сообщение о сбое. Без всего этого невозможно сказать вам. Я только что сам запустил приведенный выше код и не вижу сбоев. - person nawfal; 02.11.2012