NTaveras Ответов: 3

Как перетасовать колоду карт в C#?


Я пытаюсь создать игру в блэкджек на C#, но застрял в той части, как перетасовать колоду. Я сделал массив из 52 целых чисел.

Вот код, который я написал до сих пор. Код написан в файле. cs (так что это не основной файл игры).


 class Deck
    {

        int[] Cards = new int[52];

        public enum SuitType
        {
            Hearts,
            Clubs,
            Spades,
            Diamonds
        }
        public enum Value
        {
            Two = 2,
            Three,
            Four,
            Five,
            Six,
            Seven,
            Eight,
            Nine,
            Ten,
            Jack = 10,
            Queen = 10,
            King = 10,
            Ace,
        }
        public void ShuffleCards()
        {
            
        }
    }    
}


Что я уже пробовал:

Я пробовал запускать различные разновидности циклов for, но не добился никакого успеха.

Garth J Lancaster

Я бы начал с рассмотрения алгоритма перетасовки кнута-Фишера-Йейтса - хорошая статья о том, почему он здесь https://blog.codinghorror.com/the-danger-of-naivete/

3 Ответов

Рейтинг:
2

User 59241

Комментарий Гарта Дж. Ланкастера ответил на ваш вопрос. Предлагаю вам начать с чтения этого: Как не перетасовать - алгоритм кнута Фишера-Йейтса[^]
Это дает примеры кода, которые могут быть адаптированы по мере необходимости:Кнут шаффл - код Розетты[^]


Maciej Los

+5

Рейтинг:
2

johannesnestler

Я рекомендую не "тасовать карты", а выбирать их случайным образом из массива, инициализированного всеми"картами". Нет никаких причин для реальной "перетасовки" в программе. Но если вы планируете сделать что - то связанное с реальными деньгами - например, онлайн-покер/блэкджек-лучше сделать так, чтобы потенциальные хакеры не могли "увидеть" перетасованный массив. Если вам нужна следующая карта-Просто выберите ее случайным образом из списка всех оставшихся карт.


BillWoodruff

"Если вам нужна следующая карта-Просто выберите ее случайным образом из списка всех оставшихся карт."

И как вы можете помешать "хакерам" увидеть этот список ? Или видеть содержимое списка карт в текущих "руках", которые программа должна будет поддерживать для реализации правил игры ?

johannesnestler

Привет, Билл!
Вы правы - это всего лишь небольшая часть защиты вашего приложения, - но я думаю, что это не самое подходящее место, чтобы углубляться в эту тему здесь (можно было бы многое сказать об этом...). В любом случае, Шаг 1 - "Не делайте следующую карту предсказуемой" - подумайте о реальной игре - смотреть на карты ваших противников-это один вид мошенничества, но знать, какая карта будет вытянута следующей, - это другой уровень мошенничества, не так ли?
Во всяком случае, я никогда не видел причины для "перетасовки" в карточных играх, которые я реализовал, - это было то, что я пытался сделать. Но, возможно, ОП просто делает какую - то домашнюю работу-если это так, то ваше решение хорошо подходит.
С уважением Йоханнес

Рейтинг:
1

BillWoodruff

Вы изучали случайный Класс C# и его методы ? Я хотел бы увидеть какой-нибудь код, где вы его используете; прямо сейчас похоже, что вы на самом деле ничего не сделали, кроме как написали несколько перечислений.

Давайте посмотрим, как просто получить список из 52 уникальных чисел в диапазоне #0~51:

// required in addition to the usual directives:
using System.Collections.Generic;
using System.Linq;

private Random rnd;

private List<int> ShuffledDeck;

private void ShuffleButton_Click(object sender, EventArgs e)
{
    // seed the Random with current current time millisecond value
    rnd = new Random(DateTime.Now.Millisecond);
    
    ShuffledDeck = new List<int>(52);
    
    int card;

    // create a sequence 0~51
    List<int> DeckSequence = Enumerable.Range(0, 52).ToList();

    for (int i = 0; i < 52; i++)
    {
        card = DeckSequence[rnd.Next(0, DeckSequence.Count)];
        DeckSequence.Remove(card);
        
        ShuffledDeck.Add(card);
    }
}
Мы создаем упорядоченный список, выбираем из него значение с помощью случайной функции, удаляем это выбранное значение из упорядоченного списка; каждый раз, когда мы выбираем упорядоченный список, он становится "короче"."

Примечание: для обсуждения "посева".Генератор псевдослучайных чисел по умолчанию: [^Если вы хотите лучшего" качества "случайности, загляните в "систему".Безопасность.Криптография.В разделе randomnumbergenerator" центр в .Нет.

Перечисления: обратите внимание, что, хотя наличие записей перечисления с одним и тем же присвоенным значением является "законным" в .NET, вы должны по крайней мере, думать о вопросы, обсуждаемые здесь: [^].