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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2012, 06:44   #1
Дим
 
Регистрация: 19.05.2012
Сообщений: 8
По умолчанию Реализация выигрышной стратегии на Паскаль: В первом ящике 68 шаров, а во втором - 97. Игроки берут шары по очереди.

В первом ящике 68 шаров, а во втором - 97. Двое играющих поочередно берут шары, причем за один ход игрок может взять из любого (но только одного) ящика произвольное количество имеющихся в нем шаров. Выигрывает берущий последние шары. Кто выигрывает при правильной игре, начинающий или его парт-нер, и как надо для этого играть?

Решение. Если первый игрок начнет с того, что уравняет количество шаров в ящиках (т.е. вынет из второго ящика 29 шаров), он получит возможность выиграть: его стратегия будет заключаться в том, чтобы все время и в дальнейшем уравнивать число шаров в ящиках после каждого хода второго игрока (так называемая "симметричная стратегия"). Поступая таким образом, он, очевидно, выиграет: поскольку второй игрок всегда своим ходом нарушает симметрию, он не может забрать последние шары (ведь тем самым он создаст симметричную ситуацию - оба ящика пусты) а когда второй игрок заберет все из одного ящика, (что рано или поздно неизбежно - ведь количество шаров после каждого хода уменьшается, что не может продолжаться бесконечно) первый следующим своим ходом сделает то же самое с другим ящиком - заберет все - и лишит второго игрока возможности сделать очередной ход. Если же первый игрок хотя бы один раз отступит от этой стратегии, второй получит возможность выиграть, если "перехватит инициативу" и сам начнет делать ходы, "симметричные" ходам первого.

Ответ: при правильной игре выигрывает первый игрок.

Не могу реализовать решение на Паскале


______________
Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.
Учтите это на будущее.

Модератор.

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

во-первых, когда речь идёт о реализации игр, то один из важных вопросов - какой интерфейс Вы будете воплощать? (графика или консоль, что выводить, как игрок делает ход и т.д.)

во-вторых, Паскали - они разные, одно дело TurboPascal, другое Delphi или PascalABC.Net.

ну и последнее, а что именно у вас не получается? Ведь статегия у Вас есть. Она простая. Осталось написать простенькую программу, которая эту стратегию воплощает на практике. всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.05.2012, 09:47   #3
Дим
 
Регистрация: 19.05.2012
Сообщений: 8
По умолчанию

я не могу сообразить как эту стратегию написать на ТурбоПаскале. Вроде и простенькая программка должна получиться.
Дим вне форума Ответить с цитированием
Старый 28.05.2012, 20:19   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы на первый вопрос не ответили - Вы игру хотите делать в графике или в консоли?! и какой интерфейс должен быть? (как выглядеть должно игровое поле, грубо говоря!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.05.2012, 20:58   #5
Дим
 
Регистрация: 19.05.2012
Сообщений: 8
По умолчанию

Интерфейс в консоли, не нужно мудренного интерфейся. Главное чтоб программа работала и выводила ответ что выигрывает комп и все.
Дим вне форума Ответить с цитированием
Старый 28.05.2012, 22:11   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Код:
begin
  writeln('Выигрывает комп');
end.
PS. Так в чем все-таки проблема, записать алгоритм по-русски или перевести с русского на Паскаль?
s-andriano вне форума Ответить с цитированием
Старый 29.05.2012, 07:31   #7
Дим
 
Регистрация: 19.05.2012
Сообщений: 8
По умолчанию

Я не понимаю, как записать чтоб один игрок уравнивал кол-во шаров
Дим вне форума Ответить с цитированием
Старый 29.05.2012, 09:51   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
var
m1, m2: integer;  //число шаров в ящиках
x1, x2: integer; // число шаров которые надо взять.
Код:
if m1>m2 then begin x1:=m1-m2; x2:=0; end
else if m1<m2 then begin x1:=0; x2:=m2-m1; end
else s:='не знаю что делать';
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.05.2012, 11:53   #9
Дим
 
Регистрация: 19.05.2012
Сообщений: 8
По умолчанию

Я не понял что значит эта строчка: else s:='не знаю что делать';
Дим вне форума Ответить с цитированием
Старый 29.05.2012, 13:35   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. наслаждайтесь...

Код:
{ 
В первом ящике 68 шаров, а во втором - 97. 

Двое играющих поочередно берут шары, 
причем за один ход игрок может взять из любого (но только одного) ящика 
произвольное количество имеющихся в нем шаров. 
Выигрывает берущий последние шары.

}
uses Crt;

var box : array[1..2] of integer;
  nBox, CountOfMove  : integer;
  CurrentMoveOrder, answer : char;
begin
  ClrScr;

  {выдадим на экран правила игры}
  WriteLn('Правила игры.');
  WriteLn('---------------');
  WriteLn('Двое играющих поочередно берут шары, ');
  WriteLn('причем за один ход игрок может взять из любого (но только одного) ящика ');
  WriteLn('произвольное количество имеющихся в нем шаров. ');
  WriteLn('Выигрывает берущий последние шары.');
  WriteLn;

  repeat
    box[1] := 68;   {В первом ящике 68 шаров}
    box[2] := 97;   {Во втором ящике 97 шаров}

    repeat
      WriteLn;
      Write('Кто ходит первым (1/2): (1-компьютер, 2-человек):');
      Readln(CurrentMoveOrder);
      if not (CurrentMoveOrder  in ['1','2']) then WriteLn('Неверный вариант. Введите цифру 1 или 2');
    until CurrentMoveOrder in ['1','2'];

    {основной игровой цикл}
    repeat
       {перед ходом выведем информацию о состоянии ящиков на экран}
       WriteLn('В первом ящике: ',box[1], ' , во втором ящике: ', box[2]);
       WriteLn;

       if CurrentMoveOrder='1' then begin 

         {ход компьютера}
         if box[1]>box[2] 
           then nBox := 1
           else nBox := 2;

         CountOfMove := abs( box[1] - box[2]);

         {если в ящиках ОДИНАКОВОЕ число шаров, то берём 1 шар из ящика nBox - ждём несимметричной ситуации, 
              вдруг человек ошибётся на очередном ходе...}
         if CountOfMove=0 then CountOfMove := 1;

         {выполняем ход: уменьшаем количество шаров в выбранном ящике на заданное число}
         Box[nBox] := Box[nBox] - CountOfMove;

         {ход сделан. выведем информацию о нём на экран}
         WriteLn('Компьютер взял из ящика №',nBox,' ',CountOfMove,' шаров. В нём осталось ',Box[nBox], ' шаров. ');

         {переход хода к человеку}
         CurrentMoveOrder := '2';
       end
       else begin
         {ход человека}
         repeat
           WriteLn;
           Write('Укажите номер ящика (1/2): ');
           Readln(nBox);
           if not (nBox  in [1,2]) then WriteLn('Неверный вариант. Введите цифру 1 или 2');
         until nBox in [1,2];

         repeat
           WriteLn;
           Write('Укажите сколько хотите взять из ящика №',nBox,'( 1..', Box[nBox],' ) : ');
           Readln(CountOfMove);
           if ( CountOfMove<1 ) or ( CountOfMove>Box[nBox] ) 
                then WriteLn('Неверный вариант. Нет столько шаров в ящике! Введите число от 1 до ',Box[nBox]);
         until ( CountOfMove>=1 ) and ( CountOfMove<=Box[nBox] );

         {выполняем ход: уменьшаем количество шаров в выбранном ящике на заданное число}
         Box[nBox] := Box[nBox] - CountOfMove;
         
         {ход сделан. выведем информацию о нём на экран}
         WriteLn('Человек взял из ящика №',nBox,' ',CountOfMove,' шаров. В нём осталось ',Box[nBox], ' шаров. ');

         {переход хода к компьютеру}
         CurrentMoveOrder := '1';

       end;

       {проверка на окончание игры}
       if (box[1]=0) and (box[2]=0) then
          if CurrentMoveOrder = '2' then WriteLn('Ура! Компьютер победил!')
          else WriteLn('Как ни удивительно, но победил человек!');

    until (box[1]=0) and (box[2]=0);

    WriteLn;
    Write('Желаете ещё раз сыграть? (Y/N) : '); Readln(answer);
  until UpCase(answer)<>'Y';
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация выигрышной стратегии для компьютера makc56 Паскаль, Turbo Pascal, PascalABC.NET 13 18.05.2012 13:32
Два текстовых файла. Записать в третий те строки, которые есть и в первом, и во втором файлах (Паскаль) dark999 Паскаль, Turbo Pascal, PascalABC.NET 4 28.03.2011 21:41
Два столбца таблицы, во втором - поле, в первом - визуальное название этого поля Krasi HTML и CSS 1 31.07.2010 00:30
Игра состоит в том, что игроки по очереди выбирают одну из карточек и передвигают свою фишку по ленте sverhuVniz Паскаль, Turbo Pascal, PascalABC.NET 3 16.11.2008 02:46
Фильтрация данных на втором листе по данным на первом ppl Microsoft Office Excel 3 13.08.2008 14:07