Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 7
.NET 4.x

Игра "Покер": как сгенерировать неповторяющиеся случайные числа

30.04.2012, 23:55. Показов 4319. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
итак. пишу игру. покер.
использую при создании карт цикл for (int i=0; i < 52; i++) , в нем пробегаю от 1 до 4 (масти) и от 1 до 15 (старшинство). таким образом вся колода карт будет заполнена. но тут возникают проблемы. у меня повторяются карты...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int i = 0; i < 48; i++) //создание основной игровой колоды карт
            {
                if (_suite == 5) _suite = 1; //сбрасываем масть
                if (_seniority == 15) _seniority = 3; //сброс старшинство
// задаем имя карте - и по ее имени присваиваем ей картинку. картинки в файле ресурсов. картинки имеют формат имени "xx_y" вместо хх - старшинство, вместо у - масть. но из за плохой генерации картинки не присваиваются.. только некоторые... не понимаю в чем причина...
                if (i < 10) name = "_0" + _seniority.ToString() + "_" + _suite.ToString();
                else name = "_" + _seniority.ToString() + "_" + _suite.ToString();
 
//тут мы картинку задаем карте
                Bitmap b = (Bitmap)Poker.ResourceManager.GetObject(name);
                //создается с помощью конструктора по умолчанию класса Cards объект карта и добавляется в коллекцию deck - игровая колода, с которой в будущем будет происходить раздача карт игрокам
                Cards c = new Cards(_suite, _seniority, b);
                deck.Add(c);
                _suite++;
                _seniority++;
            }
ребят, помогите с этим циклом да чтобы картинки подключались.... заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2012, 23:55
Ответы с готовыми решениями:

Как сгенерировать случайные числа?
Как сгенерировать случайные числа?

Неповторяющиеся случайные числа
Здравствуйте, помогите пожалуйста Язык программирования C# Console.WriteLine(&quot;Введите размер числовой последовательности n&quot;); ...

Как сгенерировать случайные простые числа?
Как через Random или иным способом сгенерировать случайные простые числа (делятся на 1 и на себя) в количестве n, а потом вывести их на...

18
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.05.2012, 00:56
Если "картинки имеют формат имени "xx_y", то зачем в строчках if (i < 10) name = "_0" + _seniority.ToString() + "_" + _suite.ToString();
else name = "_" + _seniority.ToString() + "_" + _suite.ToString(); перед началом имени файла ставится "_"?
0
 Аватар для dextermd
101 / 100 / 18
Регистрация: 04.09.2009
Сообщений: 133
01.05.2012, 18:30
Андрей_lil, замените ваш код:
C#
1
2
if (i < 10) name = "_0" + _seniority.ToString() + "_" + _suite.ToString();
else name = "_" + _seniority.ToString() + "_" + _suite.ToString();
на этот:
C#
1
name = string.Format("{0} {1}", _seniority.ToString().PadLeft(2, '0'), _suite);
1
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 7
01.05.2012, 18:38  [ТС]
в файле ресурсов они так подписаны.. если убрать нижнее подчеркивание, то картинки не ставятся на объект.

Добавлено через 1 минуту
но что с созданием карт?? где код генерирует числа.. для карт..
0
 Аватар для dextermd
101 / 100 / 18
Регистрация: 04.09.2009
Сообщений: 133
01.05.2012, 18:42
Цитата Сообщение от Андрей_lil Посмотреть сообщение
в файле ресурсов они так подписаны.. если убрать нижнее подчеркивание, то картинки не ставятся на объект.
В таком случае нужно добавить подчеркивание:
C#
1
name = string.Format("_{0}_{1}", _seniority.ToString().PadLeft(2, '0'), _suite);
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
01.05.2012, 18:49
Немного не понял вопроса, вы не можете перемешать колоду?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void Shuffle<T> (T[] array) 
    {
        Random rnd = new Random();
        int n = array.Length;
        while (n > 1) 
        {
            int k = rnd.Next(n);
            n--;
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 7
02.05.2012, 10:02  [ТС]
Цитата Сообщение от dextermd Посмотреть сообщение
В таком случае нужно добавить подчеркивание:
C#
1
name = string.Format("_{0}_{1}", _seniority.ToString().PadLeft(2, '0'), _suite);
этот код не работает((

Добавлено через 2 минуты
я не могу сформировать колоду карт... они не правильно создаются... т.е. всего 14 старшинств карт, 4 масти... 52 карты.. нужно както создать колоду карт... у мя она неверно создается
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
02.05.2012, 14:53
Почему бы не сделать по человечески?
Код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Cardgame
{
    enum Suits
    {
        Hearts,
        Diamonds,
        Spades,
        Clubs
    }
 
    
    class Program
    {
        static void Main(string[] args)
        {
            List<Card> Deck = new List<Card>(52);
 
            string[] numbers = new[] { "2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K" };
 
            Deck.AddRange(numbers.Select(s => new Card(Suits.Spades, s)));
            Deck.AddRange(numbers.Select(s => new Card(Suits.Clubs, s)));
            Deck.AddRange(numbers.Select(s => new Card(Suits.Hearts, s)));
            Deck.AddRange(numbers.Select(s => new Card(Suits.Diamonds, s)));
 
            foreach (Card card in Deck)
            {
                Console.WriteLine(card);
            }
 
            Console.ReadKey(true);
        }
    }
 
    class Card
    {
        public Suits Suite { get; set; }
        public string Seniority { get; set; }
 
        public Card(Suits suite, string sen)
        {
            this.Suite = suite;
            this.Seniority = sen;
        }
 
        public override string ToString()
        {
            return String.Format("Масть: {0}, Достоинство: {1}", this.Suite, this.Seniority);
        }
    }
}


Ну или на крайняк так

Код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Cardgame
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Card> Deck = new List<Card>(52);
 
            int[] numbers = new[] { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
            int[] _suite = new[] { 0, 1, 2, 3 };
            foreach (int i in _suite)
            {
                Deck.AddRange(numbers.Select(s => new Card(i, s)));
            }
            foreach (Card card in Deck)
            {
                Console.WriteLine(card);
            }
 
            Console.ReadKey(true);
        }
    }
 
    class Card
    {
        public int Suite { get; set; }
        public int Seniority { get; set; }
        public string ImageName
        {
            get { return string.Format("{0:00}_{1}", Seniority, Suite); }
        }
        public Card(int suite, int sen)
        {
            this.Suite = suite;
            this.Seniority = sen;
        }
 
        public override string ToString()
        {
            return String.Format("Масть: {0}, Достоинство: {1}, Image: {2}", this.Suite, this.Seniority, this.ImageName);
        }
    }
}
0
49 / 49 / 5
Регистрация: 11.07.2011
Сообщений: 282
02.05.2012, 15:51
1)Создаете колоду 52 карты.
2)Перемешиваете ее. Реализовать это можно путем получения двух рандомных значений в диапазоне 1..52 (эти значения будут индексами карты) и далее меняем местами. Сколько раз нужно произвести обмен? зависит от вашего желания.
0
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 7
02.05.2012, 16:55  [ТС]
ниче не понял если честно....
я даже не уверен что напишу этот курсач... и все 3 года обучения полетят к чертям
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
02.05.2012, 17:16
Андрей_lil, для начала выложите полный код приложения, можно даже сам проект.
И объясните, что вам не понятно в
этом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Cardgame
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Card> Deck = new List<Card>(52);
 
            int[] numbers = new[] { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
            int[] _suite = new[] { 0, 1, 2, 3 };
            foreach (int i in _suite)
            {
                Deck.AddRange(numbers.Select(s => new Card(i, s)));
            }
            foreach (Card card in Deck)
            {
                Console.WriteLine(card);
            }
 
            Console.ReadKey(true);
        }
    }
 
    class Card
    {
        public int Suite { get; set; }
        public int Seniority { get; set; }
        public string ImageName
        {
            get { return string.Format("{0:00}_{1}", Seniority, Suite); }
        }
        public Card(int suite, int sen)
        {
            this.Suite = suite;
            this.Seniority = sen;
        }
 
        public override string ToString()
        {
            return String.Format("Масть: {0}, Достоинство: {1}, Image: {2}", this.Suite, this.Seniority, this.ImageName);
        }
    }
}
примере
0
37 / 37 / 2
Регистрация: 13.05.2010
Сообщений: 81
02.05.2012, 17:37
на vs studio 2008 на плюсах на стартовой странице был пример реализации и даже там
во время тасования карт тупо сравнивали в новом массиве есть такая карта или нет если есть запускали опять рандом И ТАК ДО УПОРА)))


т, е. создаешь 1 массив со всей колодой, создаешь 2 массив и тупо рандомом туда перетаскиваешь карты (с проверкой) и все
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
02.05.2012, 17:47
edd, на этот вопрос я уже ответил, зачем сравнивать и запускать рандом заново? Таким образом длительность выполнения задачи стремится к бесконечности, т.к. если из 52 карт останется не перемешанными последние 3 то шанс выпадения 1 из этих 3 будет равен примерно 1.5%
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public void Shuffle<T> (T[] array) 
    {
        Random rnd = new Random();
        int n = array.Length;
        while (n > 1) 
        {
            int k = rnd.Next(n);
            n--;
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }
У человека проблема в другом, он не знает как собрать колоду, что бы карты не повторялись
0
37 / 37 / 2
Регистрация: 13.05.2010
Сообщений: 81
02.05.2012, 19:08
я ж написал сие пример от мягкотелых и они там писали так как массив маленький то время займет не много)))

У человека проблема в другом, он не знает как собрать колоду, что бы карты не повторялись

Так там так и делают создают массив скажем тупо 52 цифры по порядку, далее эти 52 цифры рандомом перетаскивают в новый массив , и далее из нового массива раздают челам и все!

Правда там класс карта создавали и заполняли массив 53 объектами, можно еще проще число 1 - 2 пик , 2- 3 пик и тд до 52; далее остаток от деления на 13 определяет масть а разница достоинство и вперед)))

Добавлено через 11 минут
пардон с остатком наоборот
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
02.05.2012, 21:14
Вот набросал небольшой пример
Вложения
Тип файла: zip PokerGame.zip (637.9 Кб, 41 просмотров)
1
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 7
03.05.2012, 23:40  [ТС]
я прост сам код не понимаю.. синтаксис не понятен.. и откуда там появляются карты?? вроде не прикреплены ни в ресурсах, ни к форме...
чертт.. вот мне курсач то выпал... и совсем мало времени до сдачи...(

Добавлено через 10 минут
аа... посмотрел... увидел карты... так.. спасибо за помощь.))
теперь могли бы Вы мне чуть помочь с кодом в плане того, что некоторые конструкции мне не знакомы...
private void Shuffle<T>(T[] array)
что означают треугольные скобки???
и как можно реализовать еще раздачу карт из колоды deck в две другие колоды??
т.е. игроку и компьютеру..
нужно дать карту игроку, удалить из главной колоды... дать компу, удалить из главной.. и так пока не наберем 5 карт компу и игроку... как вот этот алгоритм закодить используя пример, который был прикреплен??
буду премного благодарен! возможно вознаграждение, если поможете написать курсач... (некоторая часть авансом)
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
04.05.2012, 01:46
Андрей_lil, про скобки можно почитать тут
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
04.05.2012, 01:48
Вот обновил пример, раздает в 2 руки по 5 карт
Вложения
Тип файла: zip PokerGame.zip (641.8 Кб, 49 просмотров)
1
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 7
04.05.2012, 03:28  [ТС]
благодарю)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2012, 03:28
Помогаю со студенческими работами здесь

Случайные неповторяющиеся числа
как можно написать программу, в неком диапазоне вычисляет случайные числа, но так, чтобы ни одно число не повторялось

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

Случайные неповторяющиеся числа
как создать массив из случайных НЕПОВТОРЯЮЩИХСЯ чисел

Неповторяющиеся случайные числа
Нужно сделать так, чтобы числа от 1 до 3000 рандомно выводились на экран. Но сделать это надо без повторений чисел Никак не пойму как это...

Как сгенерировать такие случайные числа?
4287709036.32353 5765613642.35294 7896396583.23529 и как перевести такое число в шеснацати-ричный формат?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru