C#: Написал свой собственный shuffler; продолжайте получать пикового короля в качестве последней карты в колоде

Я работаю над программой для блэкджека, пытаясь изучить С#. У меня есть класс карт и объект массива колод, состоящий из карт. Я использовал массив колоды для заполнения списка deckInPlay (карт), который фактически будет использоваться в игре. Я решил использовать список вместо массива в игре, потому что список может динамически изменять размер. До сих пор я мог решать свои собственные проблемы, но теперь, когда я создал метод shuffleDeck, у меня возникла проблема, которая меня действительно озадачивает.

Давайте начнем с моего кода для метода shuffleDeck (я создал экземпляр Random как rnd в конструкторе класса дилера):

public void shuffleDeck(int timesToShuffle)
    {
        for (int i = 0; i <= timesToShuffle; i++)
        {
            for (int j = 0; j < 52; j++)
            {
                int randomNumber = rnd.Next(0, deckInPlay.Count - 1);
                Card randomCard = deckInPlay[randomNumber];
                shuffler.Add(randomCard);
                deckInPlay.RemoveAt(randomNumber);
            }

            for (int j = 0; j < 52; j++)
            {
                int randomNumber = rnd.Next(0, shuffler.Count - 1);
                Card randomCard = shuffler[randomNumber];
                deckInPlay.Add(randomCard);
                shuffler.RemoveAt(randomNumber);
            }
        }
    }

Как вы можете видеть, я использую два списка: список deckInPlay, который является реальной колодой, которую я хочу использовать в игре, и список тасования, который в основном используется для помощи в тасовке карт. Я хотел, чтобы код брал случайные карты из списка deckInPlay и добавлял их одну за другой в список тасовщика, при этом удаляя карты из списка deckInPlay. Затем я хотел, чтобы процесс был обратным: брать случайные карты из списка тасователя и добавлять их в список deckInPlay, удаляя каждую карту из списка тасователя в процессе.

На первый взгляд кажется, что шаффлер работает нормально. Это работает еще лучше, если вызвать shuffleDeck с параметром выше 1. Но одно остается неизменным, независимо от параметра: пиковый король всегда является последней картой в списке после процесса тасования. Так получилось, что пиковый король является последней картой по умолчанию в моем исходном массиве колод и в списке deckInPlay.

Я не понимаю, где я ошибся здесь. Я был бы очень признателен, если бы вы могли дать мне ключ. Спасибо за чтение!


c#
person Dana Alcala    schedule 16.07.2014    source источник


Ответы (2)


Максимальное значение «Далее» равно эксклюзивному, поэтому это означает, что вы не достигнете этого числа, и тогда я подозреваю, что ваш «Пиковый король» — номер 52 в вашей колоде.

person Allan S. Hansen    schedule 16.07.2014
comment
Спасибо! Я так счастлив, что это было так просто, но я чувствую себя идиотом, потому что не заметил этого. Полностью исправил мою проблему. Я так боялся выйти за пределы списка, что забыл об исключительном правиле максимального значения Next. Спасибо еще раз! - person Dana Alcala; 16.07.2014
comment
Без проблем, рад был помочь. - person Allan S. Hansen; 16.07.2014

Использовать

int randomNumber = rnd.Next(0, shuffler.Count);

rnd.Next получает число от 0 до Count - 1 в вашем примере, но не включая верхний диапазон.

person Michel Keijzers    schedule 16.07.2014
comment
Спасибо также за ваш ответ. Вы и г-н Хансен оба правы и очень помогли! Вы оба очень быстро нашли решение моей проблемы и разместили здесь в рекордно короткие сроки! Большое спасибо! - person Dana Alcala; 16.07.2014