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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2015, 16:49   #1
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Радость Камень, ножницы, бумага... (TurboPascal)

Всем привет!


Хочу что бы мне помогли разобраться что не правильно в моём коде. Задача и код ниже:

Roshambo - это простая игра известная во всем мире. В Германии она называется "Schnick, Schnack, Schnuck", в Японии "Janken", в Испании "Cachipun", в Польше "Papier, kamien,nozyce", в Чехии "K.amen, n.u.zky, pap..r". Как бы не называлась игра, ее принципы остаются одни и те же. Два игрока одновременно выбрасывают руку в одной из возможных трех форм (символов), например: "Камень" (рука сложена в кулак), "Бумага (раскрытая ладонь), "Ножницы" (два оттопыренных пальца). Если оба игрока выбрали одну и ту же форму, то ничья и никто не заработал очков. Иначе один из символов побеждает: "Камень" побеждает (тупит) "Ножницы", "Ножницы" побеждают (режут) "Бумагу", "Бумага" побеждает (обворачивает) "Камень".
Студенты CTU тоже знают эту игру и используют ее для разрешения небольших споров - например, кому идти на лекции и писать конспект, а кому оставаться в общежитии и отсыпаться после ночного веселья.
А Вы знаете, что имеется даже чемпионат мира по Roshambo?
Ваша задача написать программу оценки игры двух игроков. Поскольку участники из разных стран, система должна поддерживать ввод на различных языках. Следующая табличка показывает названия трех символов Roshambo в разных языках.


(Табличка во влажениях )

Формат ввода:
Ввод состоит из нескольких игр. Каждая игра начинается с двух строк описывающих игроков. Каждая из этих строк содержит две маленькие буквы, указывающие язык игрока (см. в таблицу выше), пробел и имя игрока (до 20 больших и маленьких букв).
После описания игроков идет не более 100 строк, описывающих раунды. Каждый раунд описывается двумя словами, разделенными одним пробелом - что показал первый и второй игрок соответственно - на языке игрока. Все разрешенные названия приведены в таблице выше, первая буква всегда большая, все остальные - маленькие.
За последним раундом идет строка, содержащая только символ "-". Затем начинается следующая игра. В последней игре ВМЕСТО символа "-" используется символ "." .
Формат вывода:
Для каждой игры выведите 5 строк.
1. Первая строка должна содержать строку "Game #G:" где G - номер игры, начиная с первой.
2. Вторая строка содержит имя первого игрока, за которым следует ":" пробел и количество раундов, которые выиграл этот игрок. За числом идет пробел и слово "points". Используйте слово "point" если и только если игрок заработал одно очко.
3.Третья строка имеет аналогичный формат, но о втором игроке.
4.Четвертая строка сообщает результат игры. Она должна содержать слово "WINNER", потом двоеточие, пробел и имя игрока, который набрал больше очков. Если оба игрока набрали одинаковое количество очков, четвертая строка должна содержать слова "TIED GAME".
5. Пятая строка должна быть пустой, чтобы визуально разделять различные игры.


Пример ввода:
cs Pepik
en Johnny
Nuzky Scissors
Papir Rock
Papir Scissors
-
de Gertruda
cs Lenka
Stein Papir
Schere Kamen
.

Пример вывода:
Game #1:
Pepik: 1 point
Johnny: 1 point
TIED GAME

Game #2:
Gertruda: 0 points
Lenka: 2 points
WINNER: Lenka


У меня короче не проходит 2 тест и его ещё нельзя посмотреть . Код следующим сообщением.
Изображения
Тип файла: jpg pic1.jpg (31.5 Кб, 59 просмотров)

Последний раз редактировалось VladKB1; 27.03.2015 в 16:52.
VladKB1 вне форума Ответить с цитированием
Старый 27.03.2015, 16:53   #2
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Код:
const
 rock: array [1..12] of string[20] =
 ('Kamen','Rock','Pierre','Stein','Ko','Koe','Sasso','Roccia','Guu','Kamien','Piedra','');
 scissors: array [1..12] of string[20] =
 ('Nuzky','Scissors','Ciseaux','Schere','Ollo','Olloo','Forbice','Choki','Nozyce','Tijera','','');
 paper: array [1..12] of string[20] =
 ('Papir','Paper','Feuille','Papier','Papir','Carta','Rete','Paa','Papier','Papel','','');
var
 name: array [1..2] of string[20];
 round: array [1..100] of string[20];
 i,y,u,x1,x2,s1,s2,g,c: longint;
 q,y1,y2: string;

begin
{ assign(input,'input.txt');
 reset(input);
 assign(output,'output.txt');
 rewrite(output); }

 while q <> '.' do
 begin
  for i:=1 to 2 do readln(name[i]);

  for i:=1 to 100 do
  begin
   readln(round[i]);
   q:=round[i];
   if (round[i] = '.') or
   (round[i] = '-') then
   begin
    delete(name[1],1,3);   //c 2 удоляю код языка
    delete(name[2],1,3);

    for y:=1 to i-1 do
    begin
     u:=pos(' ',round[y]);
     y1:=copy(round[y],1,u-1);
     y2:=copy(round[y],u+1,length(round[y])); //копирую 2 слова в 2 переменные. 1 слово что показл 1 игрок, 2 что покозал 2 игрок

     for u:=1 to 12 do
     if y1 = rock[u] then x1:=1 else
     if y1 = scissors[u] then x1:=2 else
     if y1 = Paper[u] then x1:=3;
                                                              //нахожу эти 2 слова в константах и если это камень дою переменно (x1) 1, если ножницы то 2 и если бумага то 3
     for u:=1 to 12 do
     if y2 = rock[u] then x2:=1 else
     if y2 = scissors[u] then x2:=2 else
     if y2 = Paper[u] then x2:=3;

     if (x1 = 1) and (x2 = 2) then inc(s1);
     if (x1 = 2) and (x2 = 1) then inc(s2);

     if (x1 = 2) and (x2 = 3) then inc(s1);    // нахожу победителя 1 раунда g игры
     if (x1 = 3) and (x2 = 2) then inc(s2);

     if (x1 = 3) and (x2 = 1) then inc(s1);
     if (x1 = 1) and (x2 = 3) then inc(s2);


     if y = i-1 then
     begin                            // вывожу все 5 строк (в переменных s1 и s2 очки игроков g игры)
      inc(g);
      writeln('Game #',g,':');
      for u:=1 to 2 do
      begin
       inc(c);
       if c = 1 then
       if s1 = 1 then writeln(name[c],': ',s1,' point') else
       writeln(name[c],': ',s1,' points');

       if c = 2 then
       if s2 = 1 then writeln(name[c],': ',s2,' point') else
       writeln(name[c],': ',s2,' points');

       if c =2 then
       if s1 > s2 then
       begin
        writeln('WINNER: ',name[1]);
        writeln;
       end else
       if s1 < s2 then
       begin
        writeln('WINNER: ',name[2]);
        writeln;
       end else
       if s1 = s2 then
       begin
        writeln('TIED GAME');
        writeln;
       end;
      end;
     end;
    end;
    s1:=0;
    s2:=0;
    c:=0;
    if (round[i] = '-') or (round[i] = '.') then break;
   end;
  end;
 end;
end.

Последний раз редактировалось VladKB1; 28.03.2015 в 14:40.
VladKB1 вне форума Ответить с цитированием
Старый 29.03.2015, 11:38   #3
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Тема уже 2 дня висит. Почему ещё никто ничего не написал?
VladKB1 вне форума Ответить с цитированием
Старый 29.03.2015, 11:43   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А что, должны? Тупая и не интересная задачка
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.03.2015, 12:59   #5
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Печаль

Грустненько...
VladKB1 вне форума Ответить с цитированием
Старый 29.03.2015, 22:22   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Можно так попробовать. Но честно скажу, решение задачи несложное, просто на внимательность... Там посмотри на название файлов - я именовал для своего удобства.
Код:
program Roshambo;

type
  TPlayer = record
    Lang: string;
    Name: string;
    WinCount: integer;
  end;

const
  rock: array [1..12] of string[20] =
    ('Kamen', 'Rock', 'Pierre', 'Stein', 'Ko', 'Koe', 'Sasso', 'Roccia', 'Guu',
    'Kamien', 'Piedra', '');
  scissors: array [1..12] of string[20] =
    ('Nuzky', 'Scissors', 'Ciseaux', 'Schere', 'Ollo', 'Olloo', 'Forbice',
    'Choki', 'Nozyce', 'Tijera', '', '');
  paper: array [1..12] of string[20] =
    ('Papir', 'Paper', 'Feuille', 'Papier', 'Papir', 'Carta', 'Rete', 'Paa',
    'Papier', 'Papel', '', '');

  function GetChoice(s: string): integer;
  var
    res: integer;
    i: integer;
  begin
    res := -1;
    for i := low(rock) to high(rock) do
      if rock[i] = s then
      begin
        res := 0;
        break;
      end;
    for i := low(scissors) to high(scissors) do
      if scissors[i] = s then
      begin
        res := 1;
        break;
      end;
    for i := low(paper) to high(paper) do
      if paper[i] = s then
      begin
        res := 2;
        break;
      end;
    GetChoice := res;
  end;

var
  GameCount: integer;
  Player1, Player2: TPlayer;
  Choice1, Choice2: integer;
  s: string;
  i: integer;
begin
  Assign(input, 'Roshambo.txt');
  reset(input);
  GameCount := 0;
  repeat
    readln(s);
    Inc(GameCount);
    Player1.Lang := copy(s, 1, 2);
    Player1.Name := copy(s, 4, Length(s) - 3);
    Player1.WinCount := 0;
    readln(s);
    Player2.Lang := copy(s, 1, 2);
    Player2.Name := copy(s, 4, Length(s) - 3);
    Player2.WinCount := 0;
    repeat
      readln(s);
      if (s <> '.') and (s <> '-') then
      begin
        i := Pos(' ', s);
        Choice1 := GetChoice(copy(s, 1, i - 1));
        Choice2 := GetChoice(copy(s, i + 1, Length(s)));
        if Choice1 <> Choice2 then
        begin
          if (Choice2 - Choice1 = 1) or (Choice1 - Choice2 = 2) then
            Inc(Player1.WinCount)
          else
            Inc(Player2.WinCount);
        end;
      end
      else
      begin
        writeln('Game #', GameCount, ':');
        with Player1 do
        begin
          Write(Name, ': ', WinCount);
          if WinCount = 1 then
            writeln(' point')
          else
            writeln(' points');
        end;
        with Player2 do
        begin
          Write(Name, ': ', WinCount);
          if WinCount = 1 then
            writeln(' point')
          else
            writeln(' points');
        end;
        if Player1.WinCount = Player2.WinCount then
          writeln('TIED GAME')
        else
        begin
          Write('WINNER: ');
          if Player1.WinCount > Player2.WinCount then
            writeln(Player1.Name)
          else
            writeln(Player2.Name);
        end;
        writeln;
        break;
      end;
    until False;
  until s = '.';
  Close(input);
end.
FPaul вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра камень ножницы бумага Ri777 Microsoft Office Excel 2 18.11.2013 10:45
JavaScript камень ножницы бумага lafire JavaScript, Ajax 6 12.10.2013 16:38
Камень ножницы бумага Шайен Помощь студентам 3 22.05.2011 17:56
Камень, ножницы, бумага онлайн Bion Работа с сетью в Delphi 8 09.01.2011 19:24
Камень ножницы бумага grom333 Помощь студентам 0 14.01.2010 22:31