| 
| 
 | Вопрос # 3 339/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!
 Дана колода карт с 52 штук. Нужно написать алгоритм для тасовки карт и их же роздачи. Короче говоря, карточную игру.
 
|  |   Вопрос задал: Жикльор (статус: 5-ый класс)Вопрос отправлен: 29 октября 2009, 13:11
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Тасовать колоду очень просто. Берёшь статический массив из 52 элементов, каждый из которых характеризует одну фиксированную карту. Заполняешь массив колодой ПО ПОРЯДКУ, типа 4 туза, 4 короля,... , 4 двойки. Затем задаёшься неким абстрактным числом (можно константой, можно псевдослучайной величиной), например, Count:= Random(2000) + 1000, и в цикле переставляешь пары случаных карт в массиве местами Count раз. Вот и всё. Раздача после перетасовки - это распределение элементов массива по порядку в другие массивы, характеризующие наборы карт на руках у игроков.
 З.Ы. Не забудь в начале программы вызвать 1 раз Randomize().
 З.З.Ы. Если чо не понятно, могу написать консольный пример.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 29 октября 2009, 13:35
 Оценка за ответ: 5
 Комментарий к оценке: Заслужил))) |  
 Мини-форум вопросаВсего сообщений: 15; последнее сообщение — 31 октября 2009, 09:56; участников в обсуждении: 4. 
|   | Егор (статус: 10-ый класс), 29 октября 2009, 13:28 [#1]:есть вопрос Вопрос #3 313 - там про рандомизацию как раз Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Жикльор (статус: 5-ый класс), 29 октября 2009, 14:21 [#2]:min@y™ вроде как понял. Попробую сделать. Если что, напишу в личку. Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | Жикльор (статус: 5-ый класс), 29 октября 2009, 15:13 [#3]:А можно использовать СтринжГрид для заполнения карт? А в конце просто сделать Висибл нет и пользоваться этим. Или это не рационально? Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | min@y™ (статус: Доктор наук), 29 октября 2009, 15:29 [#4]: Цитата (Жикльор): А можно использовать СтринжГрид для заполнения карт? А в конце просто сделать Висибл нет и пользоваться этим. Или это не рационально?  
 Это не только нерационально, это НАФИГ НЕ НАДО!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 29 октября 2009, 15:31 [#5]:Может открыть книжечку и почитать что такое многомерные массивы? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Жикльор (статус: 5-ый класс), 29 октября 2009, 15:32 [#6]:Тогда можешь написать хоть намекнуть програмно как сделать? Мне хотя бы скелет сделать программы, а потом графику я на нее нятяну. Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | Вадим К (статус: Академик), 29 октября 2009, 15:42 [#7]:ну тасовку написать можно, а вот раздачу.... откуда я знаю, какая игра, а у каждой ведь свои правила. Алгоритм тасовки я описывал раньше и даже ссылку дали. Занумеруйте все карты числами от 1 до 52 и задача стает банальной.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 29 октября 2009, 16:15 [#8]: Цитата (Жикльор): Мне хотя бы скелет сделать программы, а потом графику я на нее нятяну.  
 Ну, если натянешь, то вот пример тебе (только что написал, страдаю от безделья):
 
 
 program p3339;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const
  PackSize = 52; // Количество карт в колоде
 
type
  // Карточная масть
  TSuit = (suSpades,       // Пика
           suClubs,        // Трефа
           suDiamonds,     // Бубна
           suHearts);      // Черва
 
  // Достоинство карты
  TAdvantage = (adAce,     // Туз
                adKing,    // Король
                adQueen,
                adJack,
                adTen,
                adNine,
                adEight,
                adSeven,
                adSix,
                adFive,
                adFour,
                adThree,
                adDeuce);  // Двойка
 
  // Карта
  TCard = record
    Suit: TSuit; // Карточная масть
    Advantage: TAdvantage; // Достоинство
  end;
 
  // Колода из 52 карт
  TPack = array[0..PackSize - 1] of TCard;
 
// Процедура заполнения колоды картами по порядку
procedure Reset(var Pack: TPack);
var
  Index: Cardinal;
  Suit: TSuit;
  Advantage: TAdvantage;
begin
  Index:= Low(TPack);
  for Suit:= Low(TSuit) to High(TSuit) do
    for Advantage:= Low(TAdvantage) to High(TAdvantage) do
      begin
        Pack[Index].Suit:= Suit;
        Pack[Index].Advantage:= Advantage;
        Inc(Index);
      end;
end;
 
// Процедура тасования колоды
procedure Shuffle(var Pack: TPack);
var
  Index1, Index2, Count: Cardinal;
  Temp: TCard;
begin
  Count:= Random(2000) + 1000; // Количество перестановок
 
  repeat
    Index1:= Random(PackSize); // Номер первой перестанавливаемой карты (0 <= Index < 52)
    Temp:= Pack[Index1]; // Запоминаю элемент для перестановки
    Index2:= Random(PackSize); // Номер второй перестанавливаемой карты (0 <= Index < 52)
    Pack[Index1]:= Pack[Index2]; // Перестановка
    Pack[Index2]:= Temp;
    Dec(Count);
  until Count = 0;
end;
 
// Вывод колоды на экран
procedure OutPack(const Pack: TPack);
const
  Advantages: array[TAdvantage] of PChar =
    ('A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2');
  Suits: array[TSuit] of Char =
    (#6, #5, #4, #3);
var
  Index: Integer;
begin
  for Index:= Low(TPack) to High(TPack) do
    begin
      Write(' ', Advantages[Pack[Index].Advantage]: 3, Suits[Pack[Index].Suit]);
 
      if Index mod ((1 + High(TPack)) div 4) = High(TPack) div 4
        then WriteLn;
    end;
 
  WriteLn(#13#10);
end;
 
var
  Pack: TPack;
 
begin
  Randomize();
 
  // Изначальная колода
  Reset(Pack);
  OutPack(Pack);
 
  // Перемешанная колода
  Shuffle(Pack);
  OutPack(Pack);
 
 
  Write(#13#10'   Press "ENTER" to exit...');
  ReadLn;
end.Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Жикльор (статус: 5-ый класс), 30 октября 2009, 11:48 [#9]:Ну блин, ты шаришь. Огромное спасибо. Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | min@y™ (статус: Доктор наук), 30 октября 2009, 12:28 [#10]: Цитата (Жикльор): Ну блин, ты шаришь. Огромное спасибо.
 
 
 Это ты кому сказал-то?
 Если мне, то где мои честные 5 баллов за ответ?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Жикльор (статус: 5-ый класс), 30 октября 2009, 15:13 [#11]:Я считаю это вопросом не в тему, но как мне можно узнать путь с которого запущена программа. То есть изображения с картами находиться в папке Images, а она размещена в каталоге с программой. Мне нужно открыть изображение, а для этого нужен полный путь. Помогите! Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | min@y™ (статус: Доктор наук), 30 октября 2009, 15:19 [#12]:ParamStr(0) - функция. Application.ExeName - свойство.
 Всё это возвращает полный путь.
 Только нафига хранить карты в файлах? Есть же ресурсы! А ещё есть системная библиотека c:\WINDOWS\system32\cards.dll, откуда грузят карты стандартные игры типа "Косынки", "Свободной ячейки", а также любые другие программы, авторы которых хотели иметь стандартные карты.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Жикльор (статус: 5-ый класс), 30 октября 2009, 15:47 [#13]:А как создать и работать с ресурсами? Создать ресурс я еще смогу, а вот как загрузить картинку нужную с ресурса? Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | Жикльор (статус: 5-ый класс), 30 октября 2009, 16:58 [#14]:Как можно добавить динамически новый слот для изображения. Допустим игрок забирает карту, как мне добавить ее на форму в свои руки?
 Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | min@y™ (статус: Доктор наук), 31 октября 2009, 09:56 [#15]: Цитата (Жикльор): А как создать и работать с ресурсами?
 
 Это тема для другого вопроса (или даже нескольких).
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |