Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2010, 12:59   #1
MerCY
Новичок
Джуниор
 
Регистрация: 17.09.2007
Сообщений: 2
По умолчанию Delphi. random, случайные числа без повторений

Здравствуйте!

имеется необходимость написать карточную игру, проблема в следующем:

допустим есть колода 36 карт, достоинства и масти хранятся в разных массивах вроде так:

var
d:array[6..14] of integer; //достоинства карт(6-шестерка, 11-валет, 12-дама и т.д)
m:array[1..4] of integer; //масти карт(1-бубны, 2-червы и т.д)

либо так:
var
d:array[1..36] of integer; //все карты колоды(1 - 6пик, 2 - 7пик, 3 - 8пик, и т.д. по всем мастям)

как можно раздать карты допустим в 36 image'ей случайным образом, чтобы карты не повторялись?

Последний раз редактировалось MerCY; 01.02.2010 в 13:05.
MerCY вне форума Ответить с цитированием
Старый 01.02.2010, 13:44   #2
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

подобное обсуждалось здесь - http://programmersforum.ru/showthread.php?t=83020
Deamonig вне форума Ответить с цитированием
Старый 01.02.2010, 14:02   #3
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Код:
//  глобально
var _card,_index,_number: byte;
      mas_card: array[1..36] of byte; 
procedure Razdacha;
var i: byte;
label _new;
begin
  Randomize;
  While _number < 36 do
          begin
_new:    _card:= Random(36) + 1;
            for i:= 0 to 35 do
            begin
               if _card = mas_card[i] then GOTO  _new;
            end;
            mas_card[_index]:= card;
            Inc(_index);
            Inc(_number);
         end;
end;
В результате процедуры получим массив с числами от 1 до 36 расположенным в случайном порядке.
Дальше уже извлекайте из mas_card линейным методом.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 01.02.2010 в 16:41. Причина: random д.б. (36) , от 0 до 35 (всего 36 значений)
DeKot вне форума Ответить с цитированием
Старый 01.02.2010, 14:13   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

еще одна тема
http://programmersforum.ru/showthrea...599#post379599
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 01.02.2010, 15:09   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

кстати, я бы всё таки завёл тип Карта (Card) - с мастью и значением
и хранил бы массив не абстрактных значений, а именно массив карт!
примерно так:
Код:
type
  Mast = (Piki, Trefy, Bubny, Chervi);
  Card = record
    Value : 6..14;
    MColor : Mast;
end;

var
  Cards : array[1..36] of Card;
  mm : Mast;
  iv  : 6..14;
begin
  for mm := Piki to Chervi do
    for iv :=6 to 14 do
      with Cards[ord(mm)*4 + (iv-5)] do
      begin
        Value := iv;
        MColor := mm
      end;

....

Последний раз редактировалось Serge_Bliznykov; 01.02.2010 в 15:19.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.02.2010, 15:18   #6
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

гляньте, сколько уже похожих тем снизу.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 01.02.2010, 15:47   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

russian-stalker, да по поводу сортировку уважаемые коллеги evg_m и Deamonig уже дали ссылочки.

Кстати, если кратенько передать алгоритм, то самый простой способ - заполнить массив, а потом сделать так, как делается в реальности - менять карты случайным образом в пределах массива.
(для этого в цикле просто получать брать очередную карту, брать случайное число в нужном диапазоне (в данном случае от 1 до 36) и менять эти две карты.
Если это повторить несколько раз, всё перемешается напрочь!
Код:
randomize;
for k:=1 to 50 {50 циклов перемешиваний - можно любое число, от 2-х и до бесконечности ;) } do
  for i:=1 to 36 do begin
     repeat NewK := random(35)+1 until NewK<>i;
     TempCard := Cards[i];
     Cards[i] := Cards[NewK];
     Cards[NewK] := TempCard
  end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.02.2010, 16:45   #8
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

От Serge_Bliznykov :
Цитата:
repeat NewK := random(36)+1 until NewK<>i;
Я тоже вначале так ошибся. Random(36) дает диапазон от 0 до 35 (всего 36 значений).
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 10.05.2010, 15:19   #9
Treshmazai
 
Регистрация: 07.05.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
russian-stalker
Код:
randomize;
for k:=1 to 50 {50 циклов перемешиваний - можно любое число, от 2-х и до бесконечности ;) } do
  for i:=1 to 36 do begin
     repeat NewK := random(35)+1 until NewK<>i;
     TempCard := Cards[i];
     Cards[i] := Cards[NewK];
     Cards[NewK] := TempCard
  end;
Простите, а как сделать аналогичное, только у меня 1 массив стринговый(записи) а 2ой - интеджер(туда будут заносится индексы стрингового массива) ?? Т.е. мне надо отрандомить стринговый массив без повтрений, и во 2 массив запихнуть их индексы?
Код:
const n:=5;
var
team: array[1..n] of string[10]=('Спартак','Динамо','Зенит','ЦСКА','Торпедо');
gi:string;
i,m:integer;
begin
n:=5;
      randomize;
        for i:=1 to n do
          begin
           repeat
           m := random(n) + 1;
           until
           m <> i;
           gi := team[i];
           team[i] := team[m];
           team[m] := gi;                
     end;
вот, тут тоже самое, только работа с записями..

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

Последний раз редактировалось Treshmazai; 10.05.2010 в 16:01.
Treshmazai вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Случайные числа Toa Microsoft Office Excel 6 30.11.2013 18:45
Случайные числа severin Помощь студентам 8 02.02.2010 17:35
Random вывод нескольких чисел без повторений leonw Общие вопросы Delphi 4 05.09.2009 13:15
Массив без повторений Uzenec Помощь студентам 2 17.01.2008 08:23
Delphi - Случайные числа Albenous Помощь студентам 2 28.12.2007 22:34