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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2012, 14:54   #21
Олеся Ю
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 17
По умолчанию

вот если К>=N/2+1 то будет выигрывать по любому первый игрок, это и так понятно. А вот если, правда я могу ошибаться, К>N/2, выигрывает первый игрок, а если К=N/2 и если брать клетки ВСЕ N не пропуская не одной, то выиграет 2й игрок, а если брать не подряд, т.е. пропуская то выиграет 1й игрок... Но я не уверенна, не все варианты перебирала, просто сижу играю, и как то так получается...Может и не права я...=(
Олеся Ю вне форума Ответить с цитированием
Старый 03.05.2012, 15:05   #22
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Если комп ходит 2, то давайте повторять ходы 1, НО при попадании в середину запускать алгоритм который ищет и просчитывает все возможные ходы выбирая лучший (ну например n = 9 k = 2
Код:
| | | | |1/1 |1/1 | | | |
логически рассуждая понимаем что лучше сделать так :
Код:
|2/1 |2/1 | | |1/1 |1/1 | | | |
иначе соперник сделает так :
Код:
|    |     |     |    | 1/1 | 1/1 |    | 2/1 | 2/1 | 
|    | 1/2 | 1/2 |    | 1/1 | 1/1 |    | 2/1 | 2/1 |
и мы проиграли....

Последний раз редактировалось Poma][a; 03.05.2012 в 15:09.
Poma][a вне форума Ответить с цитированием
Старый 03.05.2012, 15:26   #23
Олеся Ю
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 17
По умолчанию

не очень понятно...

Последний раз редактировалось Олеся Ю; 03.05.2012 в 15:34.
Олеся Ю вне форума Ответить с цитированием
Старый 03.05.2012, 15:42   #24
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Код:
|   |   |   |   |   |   |   |   |   |   |   |   |
вот края нашего поля размером 9
тоесть n = 9, k = 2
поехали...
Код:
|1\1|1\1|   |   |   |   |   |   |   |   |   |   |
вот 1 игрок "закрасил" 2 ячейки, мы (копм) повторим действия 1 игрока
Код:
|1\1|1\1|   |   |   |   |   |   |   |   |2\1|2\1|
ну и повторяем.... пока 1 игрок не "закрасит" середину тоесть поля 5, 6 тогда надо алгоритм поиска наилучшего хода...
Poma][a вне форума Ответить с цитированием
Старый 03.05.2012, 16:19   #25
Олеся Ю
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 17
По умолчанию

блин, ну мне в программе все 40 клеток перебирать что-ли со всеми возможными ходами=((
Олеся Ю вне форума Ответить с цитированием
Старый 03.05.2012, 16:29   #26
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

обобщение стратегии Poma][a

0. для простоты анализа условимся что каждый из противников идет со своего края линии. Любой другой можно свести к данному варианту путем перестановки блоков.

1. наличие попарно симметричных блоков длин (достигается симметричной игрой).
2. наличие центрального блока несимметричного длины (единственного!) (опять симметричная игра).
теперь все симметричные блоки дают преимущество второму игроку (опять симметричная игра) забудем о них.

3. несимметричный блок
k..2k-1 выигрывает игрок делающий ход(первый)
2k..3k-2 выигрывает опять же он (при правильной игре! захват центра и два блока <k)
3k-1 =k+(2k-1) и только тут гарантия выигрыша противника.
поскольку 3k опять выигрывает первый (захват центра и ДВА блока длины k)
для следующего (3k-1) +(2k-1) =k +(2k-1)+(2k-1) и т.д.
т.о. надо стремиться к длине центрального блока k+m(2k-1)
соблюдая симметричность (п.1..2) и немного отступая от нее ( блоки длин k и k+x, где x<k сами по себе равносильны но по разному влияют на длину центрального!)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.05.2012 в 16:34.
evg_m вне форума Ответить с цитированием
Старый 03.05.2012, 16:59   #27
Олеся Ю
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 17
По умолчанию

вот я нашла кое-что не совсем конечно моё задание, здесь проще, то что зачеркивают подряд и К = либо1,2 или3....

но чем то похоже.В делфи.
Вложения
Тип файла: rar число (2).rar (487.9 Кб, 7 просмотров)
Олеся Ю вне форума Ответить с цитированием
Старый 04.05.2012, 12:20   #28
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Извиняюсь - ответ писал понемногу в течение двух дней..

Rin, привет )
Да, именно что игра кажется похожей на известные. Это и меня подставило ). Но похоже, что игра оригинальная. Респект ее автору! Мне нравится, что ее граф сильно ветвится.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так во всех подобных задачах успех на произвольной стадии НЕ ГАРАНТИРОВАН.
вот если вышел на выигрышную позицию, то тогда нужно придерживаться выигрышной стратегии.
Серж, негарантированность выигрышной позиции носит не совсем принципиальный характер, мне кажется. IMHO легко доказать, что в любой детерминированной игре с полной информацией у одного из игроков (пеового или второго) ВСЕГДА ЕСТЬ либо выигрышная, либо ничейная (на худой конец) стратегия. Но только толку от подобного утверждения не так уж много..

Например, возьмем шашки (а можно и шахматы, разницы нет). Согласно высказыванию выше, один игрок (скорее всего, первый) имеет выигрышную стратегию в самом начале игры. Но только найти ее невозможно (на данном уровне развития выч. техники). В эндшпиле ее можно указать. Но это не значит, что мы вышли на выигрышную позицию. Это значит, что мы вышли на позицию, с которой мы МОЖЕМ ПРОСЧИТАТЬ выигрыш.

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

Я понимаю, что это деление весьма условное. То, что мы не можем указать правило, не значит, что правила нет. Может, чтобы выиграть в шашки, первому игроку следует просто ходить с сохранением какой-нить "ультрапипертриплексной сепулькерии" - да и все тебе тут. Но пока мы не открыли оную сепулькерию, нам может быть полезно классифицировать хотя бы так.

Цитата:
Сообщение от Олеся Ю Посмотреть сообщение
не знаю, я вот что то пока совсем не понимаю как можно сделать чтобы выигрывал компьютер, ... И как это все реализовать я пока тоже не понимаю, что-то как-то все запутано и сложно.=(

Цитата:
Сообщение от Олеся Ю Посмотреть сообщение
просто сижу играю,
Это мне нравится ). Так и надо.
Цитата:
Сообщение от Олеся Ю Посмотреть сообщение
вот я нашла кое-что
А вот это - не очень.. Не искать надо, а думать. Гугл в этом не поможет.

Короче, как и обещал, "набросал" (по твоему выражению)) я прогу.. Чисто и честно учесть все варианты я почему-то не смог (запутался в логике), поэтому придумал некую оценочную функцию, на которую и ориентируюсь. В результате прога играет, вроде, неплохо, но гарантировать 100% уверенную победу (речь, конечно, о случае, когда выигрышная стратегия для компа ЕСТЬ) я все же не могу. Выкладываю код, пояснения могу дать любые, но не прямо сейчас..

Код:
const
  mn= 40;
  n: word= 25;  // board length
  l: word= 3;   // move size
  f= 3;

type
  tBoard= array[1..mn] of boolean;


procedure Show(b: tBoard);
var
  i: word;
begin
  for i:=1 to n do write(i:f);
  writeln;
  for i:=1 to n do if b[i] then write('x':f) else write('.':f);
  writeln
end;


function Move(b: tBoard; p: integer; i: word): LongInt;
var
  w: LongInt;
begin
  if not (b[i] or b[i+l-1]) then begin
    for i:=i to i+l-1 do b[i]:= true;
    w:= p;
    for i:=1 to n-l+1 do w:= w+Move(b,-p,i)
  end
  else w:=0;
  Move:= w
end;


var
  b: tBoard;
  i,xi: word;
  r,xr: LongInt;
  t: boolean;

begin
  writeln('game of bricks, (C) TinMan, 2012, programmersforum.ru');
  writeln('==========  well, let''s play!  ==========');
  for i:=1 to n do b[i]:= false;
  repeat
    Show(b);
    xr:= Low(LongInt);
    xi:= 0;
    for i:=1 to n-l+1 do begin
      r:= Move(b,1,i);
      // write(r:f);
      if not (b[i] or b[i+l-1]) and (r>xr) then begin
        xr:= r;
        xi:= i
      end
    end;
    // writeln;
    if xi=0 then writeln('you win')
    else begin
      for i:=xi to xi+l-1 do b[i]:= true;
      writeln('my move was ',xi);
      Show(b);
      t:= true;
      for i:=1 to n-l+1 do t:= t and (b[i] or b[i+l-1]);
      if t then writeln('you lose')
      else begin
        repeat
          write('what''s yours? ');
          readln(i)
        until (i>0) and (i<=n-l+1) and not (b[i] or b[i+l-1]);
        for i:=i to i+l-1 do b[i]:= true;
        //Show(b)
      end
    end
  until (xi=0) or t;
  readln
end.
Ввода длины поля и размера хода нет, они задаются константами (сделай сама). первым всегда ходит комп (это можно изменить). Писалось на FreePascal, за другие компиляторы не отвечаю.

Прога работает довольно быстро при длине поля не более 20-25 клеток. Дальше начинаются тормоза.. Возможно, их можно убрать более правильным алгоритмом. Другой путь - урезать глубину просчета в начале (дальше время падает), но тогда есть опасность упустить главное.. Короче, это не окончательное решение, и есть над чем подумать. Я подумаю, если время позволит.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 04.05.2012, 13:56   #29
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

думаю, что надо рандомайзить ходы компьютера (при равных оценочных значениях), иначе скучновато играть.

но так - весьма и весьма неплохо!! (хотя стратегия не является идеальной, к сожалению: для вашего примера доски ходы 5, 11, 20, 23 приводят к победе человека)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.05.2012, 15:06   #30
Олеся Ю
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 17
По умолчанию

у меня ссылается на ошибку:
xr:= Low(LongInt);
Олеся Ю вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование простых игр в Delphi lux16 Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 08.07.2011 23:59
Программирование или web-программирование? Дмитрий Батогов Помощь студентам 3 23.06.2011 14:14
XNA программирование игр на C# sergeybr Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 30.06.2010 13:52
CD к книге: Андре Ламот "Программирование игр для Windows. Советы профессионала, 2-е издание" Pirotexnik Общие вопросы C/C++ 2 03.06.2010 22:53
с чего начинать программирование игр Gunet Свободное общение 15 23.07.2009 11:22