невозможно изменить стоимость имущества - PullRequest
0 голосов
/ 10 мая 2018

Я сейчас улучшаю свою программу, которую я разместил на CR , но столкнулся с проблемой. У меня есть свойство с именем Total, но когда я пытаюсь установить его в значение (0), оно остается прежним.

Это свойство:

public class Player
{
    private int total;
    public int Total
    {
        get
        {
            total = 0;
            foreach (int card in hand)
            {
                total += card;
            }
            return total;
        }
        set { this.total = value; }
    }
}

А вот как я пытаюсь это изменить:

public class Game
{
    private void CompareHands()
    {
        //This is just for testing
        Console.WriteLine($"player total: {player1.Total}, is bust: {player1.Bust}");
        Console.WriteLine($"house total: {house.Total}, is bust: {house.Bust}");

        if (player1.Bust)
            player1.Total = 0;
        if (house.Bust)
            house.Total = 0;

        //this too
        Console.WriteLine($"player total: {player1.Total}, is bust: {player1.Bust}");
        Console.WriteLine($"house total: {house.Total}, is bust: {house.Bust}");
...
}

Также свойство Bust, если необходимо:

    private readonly int blackjack = 21;
    public bool Bust
    {
        get { return Bust = Total > blackjack; }
        private set { }
    }

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

На вашем месте я бы разделил Общее вычисление и Бюст немного по-другому:

public class Player
{
    public bool Bust { get; set; }

    public int GetTotal()
    {
        if (Bust)
        {
            return 0;
        }

        var total = 0;
        foreach (int card in hand)
        {
            total += card;
        }
        return total;
    }
}

Несколько замечаний:

  • вычисление выполняется методомне свойство - я думаю, что это более чистый способ, так как свойство должно быть довольно простым и не иметь никакой логики в нем
  • включить Bust в вычисление GetTotal и вернуть 0, если Bust установлен в true
  • всегда вычисляет общее значение, если только у вас нет веской причины иметь его кэшированную версию

Надеюсь, это поможет.

0 голосов
/ 10 мая 2018

Фактически вы пересчитываете общее количество каждый раз, когда звоните получателю вашей собственности.

Решение состоит в том, чтобы сделать поле total как Nullable<int>, поэтому, если оно равно null, вы делаетелогика, которую вы делаете на самом деле, в противном случае возвращает то, что установлено в поле total.

public class Player
{
    private int? total; // <- Nullable<int> here
    public int Total
    {
        get
        {
            if(total.HasValue) // <- If value is set return that value.
            {
                return total.Value;
            }

            total = 0;
            foreach (int card in hand)
            {
                total += card;
            }

            return total.Value;
        }
        set { this.total = value; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...