Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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™

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™

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™

min@y™ (статус: Доктор наук), 30 октября 2009, 12:28 [#10]:

Цитата (Жикльор):


Ну блин, ты шаришь. Огромное спасибо.


Это ты кому сказал-то?
Если мне, то где мои честные 5 баллов за ответ?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 30 октября 2009, 15:13 [#11]:

Я считаю это вопросом не в тему, но как мне можно узнать путь с которого запущена программа. То есть изображения с картами находиться в папке Images, а она размещена в каталоге с программой. Мне нужно открыть изображение, а для этого нужен полный путь. Помогите!
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

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™

min@y™ (статус: Доктор наук), 31 октября 2009, 09:56 [#15]:

Цитата (Жикльор):


А как создать и работать с ресурсами?


Это тема для другого вопроса (или даже нескольких).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.03 сек.