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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2009, 23:33   #1
Игорь777
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 33
По умолчанию Побьёт ли одна карта другую? Delphi.

Составить программу, проверяющую, побьёт ли одна карта К1 другую карту К2 с учетом козарной масти КМ.
Каждая карта представляет собой запись (структуру) из двух полей: масти (пики, трефы, бубны, червы) и значени (6, 7, 8, 9, 10, Валет, Дама, Король, Туз).
Для проверки использовать 3 пары карт.
В выходной файл вывести информацию о проверяемых картах, козырной масти и результат проверки (бьёт, не бьёт).


Буду очень благодарен, если поможете с решением. Сам долго бился, но ни к чему путному пока не пришел(

Последний раз редактировалось Игорь777; 28.04.2009 в 23:35.
Игорь777 вне форума Ответить с цитированием
Старый 29.04.2009, 09:27   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот полностью готовая программа на Паскаль.
идея/алгоритм ясны. если надо, под Delphi сами замените:
Код:
TYPE
  str5 = string[6];
  MAST  = (PIKI,TREF,BUBN,CHER);
  ZNACH = (K6,K7,K8,K9,K10,KVAL,KDAM,KKOR,KTUZ);
const
  Mast_STR : array[ord(PIKI)..ord(CHER)] of str5 = ('Пик','Треф','Бубен','Червей');
  ZNACH_STR : array[ord(K6)..ord(KTUZ)] of str5 = 
     ('6','7','8','9','10','Валет','Дама','Король','ТУЗ');

TYPE
  KARTA=RECORD
     M:MAST;
     Z:ZNACH;
  END;

var
  K1, K2 : KARTA;
  KM : MAST; 
  KTemp  : KARTA;
  Koloda : array[1..36] of KARTA;
  i,j,k  : integer;

begin
  randomize;


  {заполним колоду полностью по мастями и значениям}
  for i:=ord(PIKI) to ord(CHER) do
    for j:=ord(K6) to ord(KTUZ) do
      begin
        Koloda[i*9+j+1].M := MAST(i);
        Koloda[i*9+j+1].Z := ZNACH(j);
      end;


  {перемешиваем
     (просто многократно меняем местами две карты случайным образом)
       при замене используем KTemp в качестве временного буфера
          (вместо KTemp можно было использовать K1 или K2,
            но отдельная переменная добавлена для наглядности}
  for k:=1 to 1000 do {меняем 1000 раз, думаю, этого достаточно :-)}
    begin
      i := Trunc(Random(36))+1; {получили случ.число от 1 до 36}
      j := Trunc(Random(36))+1; {получили случ.число от 1 до 36}
      if i<>j {если случайно получили один и тот же номер, то зачем
                 менять карту саму с собой?!}
        then begin
          KTemp := Koloda[i];
          Koloda[i] := Koloda[j];
          Koloda[j] := KTemp
        end;
    end;


  {просто берём первую и вторую карты и отображаем их масти и значение}  
  K1 := Koloda[1];
  K2 := Koloda[2];
  WriteLn('Первая карта: ', ZNACH_STR[ord(K1.Z)],'-',Mast_STR[ord(K1.M)]);
  WriteLn('Вторая карта: ', ZNACH_STR[ord(K2.Z)],'-',Mast_STR[ord(K2.M)]);

  {получим козырную масть случайным образом}
  KM := MAST(trunc(Random(4)));
  WriteLn('Козырная масть: ',Mast_STR[ord(KM)]);

  if ((K1.M = K2.M) and (K1.Z > K1.Z)) or ((K1.M = KM) and (K2.M <> KM)) 
    then 
      WriteLn('Карта1 бьёт карту2')
    else
      WriteLn('Карта1 НЕ бьёт карту2');

  Readln;
  
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.04.2009, 09:31   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я помоему предлагал тут вариант распределения карт по старшенству в массив, а потом просто сравнить позиции бьющей и побиваемой, и если позиция бьющей больше - то побьет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.04.2009, 10:17   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да. важное уточнение. "Побьёт" в моём примере, это по правилам игры "Дурак" (т.к. в разных играх разные правила).
например, в коде выше, туз одной масти (не козырной) не бьёт любую карту, если она другой масти...
А козырная карта, наоборот, бьёт любую некозырную карту (даже если она старше по достоинству!).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.04.2009, 11:33   #5
Игорь777
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 33
По умолчанию

Огромное спасибо!!
Игорь777 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одна картинка при наводе сменяет другую Delpher JavaScript, Ajax 6 24.05.2010 15:27
2 задачи на Delphi и одна Паскаль Армана Помощь студентам 5 08.04.2009 17:52
одна форма в Delphi Алена777 Компоненты Delphi 5 23.01.2009 15:53
WMF карта и работа с ней в Delphi 7 Арт Общие вопросы Delphi 3 30.08.2007 02:02