|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|