Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Sorokano Гость
|
Добавлено: Пт Авг 30 2002 18:12 Заголовок сообщения: 4Poker + C++ = ;( |
|
|
У меня имеется колода карт,которую я инициализировал след. образом: int* deck=new int[53]; deck[1]=11; deck[2]=21;...deck[52]=134; У меня есть 52 карты в массиве.1-му элемиенту присвоил туза крестей, 2му-двойку кр,3му-тройку и т.п. Колода не перемешана.Я ее перемешиваю функцией: int n = floor(400*random_numb()+500); for ( int i равно 1;; i меньше n;; i + +) //{ int card1 = floor(52*random_numb()); int card2 = floor(52*random_numb()); int temp = deck[card2]; deck[card2]=deck[card1]; deck[card1]=temp; } она работает как надо: выбирается произвольное число и на его основе создаем цикл. За цикл выбираются 2 карты и переразмешиваются в колоде.Когда после цикла я обращаюся к первым 5 картам колоды, которые должны быть случайными, мне выдается расклад: крест туз, крест. двойка, тройка, четверка и пятерка! После поиска в инете я обнаружил что переменные в цикле FOR в C++ умирают после завершения цикла...ОБЛОМ! ЧТО ДЕЛАТЬ, ЛЮДИ ДОБРЫЕ!??!?!?!?! S.O.S. Заранее спасибо,Sorokano. |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Пт Авг 30 2002 19:05 Заголовок сообщения: Re: 4Poker + C++ = ;( |
|
|
1) Случайная функция не гарантирует, что выберет все значения из диапазона. Посмотри на распределение Гаусса и поймешь, почему крайние значения диапазона оказались нетронутыми. 2) Переменные, объявленные внутри блока (ты, наверное, подразумевал "блока", а не "цикла"), действительно умирают при выходе из блока, и это надо было обнаружить не в инете, а в учебнике по C++. Но в данном случае они ни при чем. 3) Думаю, что ты хотел внутри своего цикла сделать еще один цикл по картам и каждую обменять со случайной картой (то есть int card1 = номер_карты; int card2 = floor(52*random_numb()), а не выбирать случайные две, так как при выборе случайных двух выбор крайних не гарантирован, вот у тебы крайние и остались не перемешанными.
Все это, конечно, IMHO. |
|
Вернуться к началу |
|
|
Sorokano Гость
|
Добавлено: Пт Авг 30 2002 23:19 Заголовок сообщения: Re: 4Poker + C++ = ;( |
|
|
Что вы имели ввиду под "номером карты"?(пункт 3) И что вы имели ввиду под "ты хотел внутри своего цикла сделать еще один цикл по картам "?
Заланее спсибо, Sorokano. |
|
Вернуться к началу |
|
|
Sorokano Гость
|
Добавлено: Сб Авг 31 2002 01:00 Заголовок сообщения: Re: 4Poker + C++ = ;( |
|
|
Может плохое перемешивание колоды связано с функцией random_num в которой используется srand(time(NULL)), цикл проходит слишком быстро поэтому "случайный" номер все время более не менее тот же... Не могли бы вы тут мне что-нибудь посоветовать? Буду очень благодарен!!!
Sorokano. |
|
Вернуться к началу |
|
|
Раф
Зарегистрирован: 31.08.2002 Сообщения: 5 Откуда: Череповец
|
Добавлено: Сб Авг 31 2002 03:44 Заголовок сообщения: Re: 4Poker + C++ = ;( |
|
|
Я еще не знаю C++(тока учу ), но подсказать могу... Все делается чуточку иначе: нужно создать массив (True/False), в который будет записываться, перемешивалась данная карта или нет. Если выбранная карта уже размешивалась, то просто ищем следующее случаайное число. Конечно не оптимально, но на Delphi работает прекрасно (игра Морской бой |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Сб Авг 31 2002 16:19 Заголовок сообщения: Re: 4Poker + C++ = ;( |
|
|
Я имел ввиду следующее: вместо
for ( int i равно 1;; i меньше n;; i + +) //{ int card1 = floor(52*random_numb());
написать
for ( int i равно 1;; i меньше n;; i + +) for ( int card1 равно 1;; card1 меньше или равно 52;; card1 + +) //{
что гарантирует, что каждая карта с какой-нибудь поменяется
PS. Если пишем на C/C++, то приучаемся нумерацию начинать с нуля |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Сб Авг 31 2002 17:23 Заголовок сообщения: Во-во. Случайным образом выбрать из еще неперемешанных новую карту и перемешать, и так пока не кончатся, то есть перебрать ВСЕ |
|
|
|
|
Вернуться к началу |
|
|
Раф
Зарегистрирован: 31.08.2002 Сообщения: 5 Откуда: Череповец
|
Добавлено: Сб Авг 31 2002 18:04 Заголовок сообщения: Re: Во-во. Случайным образом выбрать из еще неперемешанных новую карту и перемешать, и так пока не кончатся, то есть перебрать |
|
|
ну да... можно последовательно выбирать все ЕЩЕ не перемешанные карты... |
|
Вернуться к началу |
|
|
Sorokano Гость
|
Добавлено: Вс Сен 01 2002 14:38 Заголовок сообщения: Re: Огромное ПАСИБО! Все получилось как надо! :)) |
|
|
ОГРОМНОЕ ПАСИБО! Sorokano |
|
Вернуться к началу |
|
|
Sorokano Гость
|
Добавлено: Вс Сен 01 2002 14:40 Заголовок сообщения: Re: :Ждите появления в инете новой супер игрухи! :)) хехехе |
|
|
Ждите появления в инете новой супер игрухи! ) хехехе Sorokano. |
|
Вернуться к началу |
|
|
Andy-C Гость
|
Добавлено: Пн Сен 02 2002 08:09 Заголовок сообщения: Re: 4Poker + C++ = ;( |
|
|
Но человек тасует колоду не так. Может красивее эмулировать действия человека.
- делит колоду примерно поровну, кладёт ч/з одну, - делит на 2-5 частей меняет местами, - берёт "сначала" 2-7 карт, кладёт "в конец", и т.п. в сочетаниях? |
|
Вернуться к началу |
|
|
|