-ѕоиск по дневнику

ѕоиск сообщений в predefglas

 -ѕодписка по e-mail

 

 -—татистика

—татистика LiveInternet.ru: показано количество хитов и посетителей
—оздан: 10.12.2014
«аписей:
 омментариев:
Ќаписано: 94

Ўахматы льда и пламени

ƒневник

ѕонедельник, 16 ћа€ 2016 г. 16:09 + в цитатник
          »гра эта зоветс€ кайвассой. ≈е завезли в ƒощатый город на волантинской торговой галере, а сироты разнесли ее вверх и вниз по «еленой  рови. ѕри дорнийском дворе все помешались на нейЕ           ƒес€ть фигур, кажда€ из которых ходит по-разному, а доска мен€етс€ с каждой игрой, смотр€ как игроки перемешают свои квадратики.                                                     ƒжордж ћартин Ђѕир стерв€тниковї  Cyvasse Ч ещЄ одна игра родивша€с€ в художественном произведении. » как это обычно и бывает, дело вновь не обошлось без участи€ армии фанатов. ’от€ автор и удел€ет игре большое внимание (в Ђ“анце с драконамиї, “ирион Ћанистер только и делает, что в неЄ играет), детальное описание правил, всЄ же Ч не дело автора художественного произведени€. ¬прочем, за фанатами Ђне заржавелої. –азнообразных реализаций Ђ айвассыї дес€тки.  вадратные и гексоганальные Ч найдутс€ на любой вкус! я хочу рассказать о той, что понравилась мне больше всего. Ѕольшинство версий Ђ айвассыї (за все не скажу, мог что-то и пропустить) Ч это всЄ те же, привычные нам с детства, шахматы, только с катапультами и драконами. ƒа, фигуры ход€т непривычно, а по доске, щедрой рукой, можно разбросать горы и водоЄмы, но принципы самой игры не мен€ютс€ Ч шахматное вз€тие и король, которого необходимо съесть. Zane Fisher подошЄл к вопросу более творчески. Ќа мой взгл€д, его верси€ игры гораздо более глубока, в тактическом плане. «а счЄт чего? ¬от давайте вместе и посмотрим. Ѕольша€ Ђестественностьї и продуманность Ч вот что в первую очередь бросилось мне в глаза. ѕосмотрите, как Ђконницаї обходит Ђгорыї.  ажда€ фигура, в этой игре, может перемещатьс€ не более чем на заданное число шагов и, выполн€€ Ђтихий ходї, она может Ђповорачиватьї как угодно, главное Ч не возвращатьс€ на ранее пройденные клетки и не заступать на территорию зан€тую противником или Ђгорамиї. „ерез клетки зан€тые своими фигурами проходить можно (исключением €вл€етс€ Ђ—лонї, который не может проходить Ђсквозьї другие фигуры), нельз€ лишь завершать на них ход. Ёто был вызов!“ак уж получилось, что в чисто техническом плане, реализовать подобные блуждани€ на ZRF непросто. ’од фигуры состоит из нескольких шагов в произвольном направлении, как правило, с дополнительным условием не посещени€ уже пройденных полей. я делал игру с подобной механикой, но в тот раз использовал механизм частичных ходов (да и то не слишком удачно, в редких случа€х фигура могла загнать себ€ в тупик).  огда € совсем уж было думал, что без Axiom здесь не обойтись, решение само, вдруг, неожиданно пришло мне в голову: ћного кода(define check-target (if (position-flag? is-target?) (set-flag is-succeed? true) ) ) (define check-target-dir (if (and (on-board? $1)(position-flag? is-target? $1)) (set-flag is-succeed? true) ) ) (define check-dir-3 (if (on-board? $1) $1 (if (not (or enemy? (piece? Mount))) (check-target) (if (not-speared?) (check-target-dir $2) (check-target-dir $3) (check-target-dir $4) ) ) (opposite $1) ) ) (define check-branch-3 mark (if (on-board? $1) $1 (if (not (or enemy? (piece? Mount))) (check-target) (if (not-speared?) (check-dir-3 $1 $1 $2 $3) (check-dir-3 $2 $1 $2 $4) (check-dir-3 $3 $1 $2 $5) ) ) ) back ) (define move-3 ( (check-pass) (set-position-flag is-target? true) START (while (on-board? next) next (set-flag is-succeed? false) (if (or empty? (piece? Point)) (check-branch-3 w sw nw se ne) (check-branch-3 nw w ne se e) (check-branch-3 ne nw e w se) (check-branch-3 e ne se nw sw) (check-branch-3 se e sw ne w) (check-branch-3 sw se w e nw) (if (flag? is-succeed?) add) ) ) )) (piece (name LightHorse) ... (moves (move-3) ... ) ) Ќа самом деле, всЄ просто. ¬место того чтобы пытатьс€ проложить путь от текущего пол€ (при таком подходе было бы сложно боротьс€ с дубликатами генерируемых ходов), можно его пометить позиционным флагом, а затем, перебрав все пол€ доски (благо Ч их немного, доска небольша€), попытатьс€ добратьс€ до отмеченного пол€, за заданное число шагов. «вучит не особо впечатл€юще, но дл€ мен€ это было поворотным пунктом. — этого момента € поверил, что игру можно реализовать на чистом ZRF. ¬з€тие осуществл€етс€ только Ђпо пр€мойї и, в большинстве случаев, по Ђшахматному принципуї Ч фигура выполн€юща€ вз€тие становитс€ на место вз€той фигуры (здесь снова есть исключение Ч Ђ атапультаї, о которой € расскажу ниже). ѕри этом, брать можно далеко не любую фигуру! Zane вводит пон€тие Ђзацеплени€ї (Engagement). “акже как вз€тие, Ђзацеплениеї распростран€етс€ по пр€мой, на количество шагов индивидуальное дл€ каждого типа фигуры. — пон€тием Ђзацеплени€ї тесно св€зано Ђвооружениеї фигуры. ¬се фигуры дел€тс€ на легко-, т€жело- и не вооружЄнные. Ђќполченецї (Rabble) Ч лЄгка€ фигура, не может просто так атаковать т€жЄлую, например Ђ—лонаї (Elephant). ƒл€ того чтобы атаковать, ему требуетс€ Ђзацеплениеї цели ещЄ одной лЄгкой (или т€жЄлой) фигурой. — другой стороны, Ђ—лонї легко может атаковать Ђќполченцаї (за исключением, разве что случа€, когда он находитс€ в воде). “акже он может в одиночку Ђзацепитьї любую т€жЄлую фигуру противника, даже Ђƒраконаї (Dragon). Ќе вооружЄнные (unarmored) фигуры (Ђјрбалетчикї и Ђ атапультаї) могут быть вз€ты без Ђзацеплени€ї. Ёто тоже было непросто¬ основном, из за количества писанины. ” разных фигур Ч разна€ дистанци€ зацеплени€, да и вообще, они разные. Ђƒраконї Ч может летать через горы, Ђ опейщикиї цепл€ют всего два пол€ перед собой, надо учесть действие Ђводыї, а проверка на присутствие дружеских/вражеских Ђ репостейї поблизости Ч это вообще мрак. ¬ общем всЄ сложно (и не исключено, что в коде есть ошибки), но вроде всЄ работает как задумано: ≈щЄ код(define set-engaged (if (flag? is-light-engaged?) (set-flag is-heavy-engaged? true) else (set-flag is-light-engaged? true) ) ) (define check-escape (if (or enemy? (piece? Mount)) (set-flag is-escaped? true) ) ) (define check-other mark (set-flag is-escaped? false) (if (on-board? $1) $1 (check-escape) (if (and friend? (not-in-zone? water) (or (piece? Rabble) (piece? LightHorse) (piece? HeavyHorse) (piece? Elephant) (piece? Crossbow) (piece? Dragon) (piece? Tower) (piece? King))) (set-engaged) (if (or (piece? HeavyHorse) (piece? Elephant) (piece? Dragon) (piece? Tower)) (set-flag is-heavy-engaged? true) ) (if (piece? Tower) (set-flag is-enemy-tower? true) ) ) ) (if (and (on-board? $1) (not-flag? is-escaped?)) $1 (check-escape) (if (and friend? (not-in-zone? water) (or (piece? Elephant) (piece? Crossbow) (piece? Trebuchet) (piece? Dragon))) (set-engaged) (if (or (piece? Elephant) (piece? Dragon)) (set-flag is-heavy-engaged? true) ) ) ) (if (and (on-board? $1) (not-flag? is-escaped?)) $1 (check-escape) (if (and friend? (not-in-zone? water) (or (piece? Crossbow) (piece? Trebuchet))) (set-engaged) ) ) (if (and (on-board? $1) (not-flag? is-escaped?)) $1 (check-escape) (if (and friend? (not-in-zone? water) (piece? Trebuchet)) (set-engaged) ) ) back ) (define check-spears (if (on-board? $1) (if (and (friend? $1) (not-in-zone? water $1) (piece? Spears $1)) (set-engaged) ) ) ) (define check-friend-tower (if (on-board? $1) (if (and (enemy? $1) (piece? Tower $1)) (set-flag is-light-engaged? false) ) ) ) (define check-engaged (verify (not-piece? Mount)) (set-flag is-enemy-tower? false) (set-flag is-light-engaged? false) (set-flag is-heavy-engaged? true) (if (or (piece? Crossbow) (piece? Trebuchet)) (set-flag is-light-engaged? true) ) (if (or (piece? HeavyHorse) (piece? Elephant) (piece? Dragon) (piece? Tower)) (set-flag is-heavy-engaged? false) ) (check-spears sw) (check-spears se) (check-other w) (check-other e) (check-other nw) (check-other ne) (check-other sw) (check-other se) (if (and (not-piece? Tower) (not-piece? Crossbow) (not-piece? Trebuchet) (not-flag? is-enemy-tower?)) (check-friend-tower w) (check-friend-tower e) (check-friend-tower nw) (check-friend-tower ne) (check-friend-tower sw) (check-friend-tower se) ) (verify (and (flag? is-light-engaged?) (flag? is-heavy-engaged?))) ) (define common-1 ( $1 (verify enemy?) (check-engaged) add )) (piece (name King) ... (moves (common-1 w) (common-1 e) (common-1 nw) (common-1 ne) (common-1 sw) (common-1 se) ... ) )  ак € уже сказал, много писанины, но с этого момента, разработка игры стала, по большей части, механической работой. Ѕыл, правда, ещЄ момент с Rabble, но об этом ниже. ƒистанци€ Ђзацеплени€ї совпадает с максимальной дистанцией хода фигуры лишь в самых простых случа€х (Rabble, Spears и King). ќбычной €вл€етс€ ситуаци€, при которой рассто€ние, на котором возможно Ђзацеплениеї, меньше максимального хода фигуры (Light Horse, Heavy Horse, Dragon). ¬прочем, есть исключение. Ђ—лонї (Elephant) Ч т€жЄла€ фигура перемещающа€с€ лишь на одну клетку за ход, но Ђзацепитьї вражескую фигуру он может на рассто€нии двух клеток! Ѕолее того, он может еЄ съесть, передвинувшись на две клетки, но лишь при условии, что путь не загораживают какие либо преграды (в отличии от других фигур, Ђ—лонї не может проходить через клетки, зан€тые другими фигурами. ¬се эти особенности делают игру ещЄ более интересной, в тактическом плане. ѕосмотрите, например решение одной из задач учебника: –ассто€ние Ђзацеплени€ї, дл€ конницы Ч единичка. „тобы вз€ть вражескую фигуру (при отсутствии других фигур, выполн€ющих Ђзацеплениеї), придЄтс€ подойти вплотную, но во врем€ бо€, есть свобода выбора Ч остановитьс€ на поле вз€той фигуры или двигатьс€ дальше (наподобие дамки в шашках). ћаксимальна€ дистанци€ Ч три шага дл€ Light Horse и два дл€ Heavy Horse. ƒетальные параметры всех фигур можно посмотреть в руководстве к игре: Rabble (x6) Ч light armor, movement allowance 1, engagement range 1 Spears (x3) Ч light Armor, Movement Allowance 1, Engagement Range 1 Light Horse (x3) Ч light Armor, Movement Allowance 3, Engagement Range 1 Heavy Horse (x2) Ч heavy armor, Movement Allowance 2, Engagement Range 1 Elephant (x2) Ч heavy armor, Movement Allowance 1, Engagement Range 2 Crossbows (x2) Ч unarmored, Movement Allowance 2, Engagement Range 3 Trebuchet (x1) Ч unarmored, Movement Allowance 1, Engagement Range 4 (min. 2) Dragon (x1) Ч heavy armor, Movement Allowance 4, Engagement Range 2 Tower (x2) Ч heavy armor, Movement Allowance 0, Engagement Range 1 King (x1) Ч light armor, Movement Allowance 1, Engagement Range 1 “ам же можно найти информацию об особенност€х каждой из фигур. Ќекоторые из этих примечаний ввод€т в смущение. Ќапример, дл€ Ђјрбалетчикаї (Crossbows) написано следующее: "Crossbows cannot capture". ƒл€ чего может понадобитьс€ фигура неспособна€ брать фигуры противника? ¬новь, всЄ дело в Ђзацепленииї! Crossbows Ч не защищЄнна€ фигура неспособна€ к ближнему бою, но она может Ђзахватыватьї фигуры противника на большом рассто€нии. —ледующа€ задача из учебника это иллюстрирует. ≈сли Ђјрбалетчикї сдвинетс€ так, чтобы Ђзахватитьї все цели, Ђ¬садникї сможет побить их за три хода:   сожалению, в задачке есть досадный недочЄт ƒистанции Ђтихого ходаї Light Horse вполне достаточно, чтобы переместитьс€ на позицию, с которой он может убить все три вражеских фигуры без посторонней помощи. ¬ своей реализации, € исправил это, переместив фигуру Ђ¬садникаї ниже. ƒруга€ слабо защищЄнна€ (unarmored) фигура Ч Ђ атапультаї (Trebuchet). «десь со вз€тием всЄ в пор€дке! ‘игура бьЄт издалека, на дистанцию от двух до четырЄх шагов (противника расположившегос€ вплотную Ђ атапультаї побить не может). ”никальность этой фигуры в том, что после выполнени€ вз€ти€ Ђ атапультаї продолжает оставатьс€ в тылу. „тобы вз€ть фигуру противника, она перемещаетс€ на один шаг в противоположном направлении (конечно, если там есть свободное место)! Ёто важное стратегическое оружие, Ђ атапультуї необходимо вс€чески оберегать! Ќе было бы счасть€, да несчастье помогло¬ процессе подготовки игры к публикации, мне понадобились примеры начальной расстановки фигур. ƒело это не простое и € постаралс€ подойти к нему со всем тщанием. Ќа первый взгл€д, дл€ фигур почти не остаЄтс€ места. „то-то занимают горы, что-то вода (в неЄ тоже не хочетс€ соватьс€).   счастью, всЄ не так плохо как кажетс€, поскольку больша€ часть фигур может свободно проходить через территорию, зан€тую другими дружественными фигурами.  онницу вполне можно ставить во второй р€д, за Ђ опейщикамиї и Ђќполченцамиї. ƒракона можно ставить вообще где угодно Ч он перелетает через горы. ѕосле нескольких минут мучений, у мен€ получилось что-то вроде этого: я отослал дистрибутив на публикацию и только потом заметил, что Ђ атапультыї расположены крайне неудачно. ƒа, € оставил за ними место, но в оригинальной версии игры, через горы они стрел€ть не умеют! ¬озможно этот скриншот так и осталс€ бы забавным казусом, но мне пришла в голову интересна€ иде€: Ђпочему бы катапультам и не стрел€ть через горы, ведь они стрел€ют навесомї? “ак родилось следующее дополнение: если на пути выстрела вдруг оказалась гора, Ђ атапультаї не может выполнить Ђзацеплениеї, но коль скоро нашЄлс€ Ђнаводчикї, уже зацепивший цель, пульнуть в неЄ камушек поверх гор Ђ атапультаї вполне способна! ѕо моему, это неплоха€ иде€, добавл€юща€ в игру ещЄ больше тактических возможностей. Ђ репостьї (Tower) Ч ещЄ одна очень странна€ фигура. ќна не двигаетс€! —овсем. ¬ общем-то это даже логично. √де (кроме €понских мультиков) вы видели двигающиес€ крепости? «адача крепости Ч защита (и она с этой задачей прекрасно справл€етс€). ‘игура наход€ща€с€ вблизи дружеской крепости не может быть Ђзацепленаї. „тобы еЄ убить, сначала придЄтс€ разрушить крепость, а это не просто.  роме того, Ђ орольї (King) умеет Ђпрыгатьї сквозь дружескую Ђ репостьї, оказыва€сь по другую сторону от неЄ за один ход. ≈сть мнение, что крепость справл€етс€ со своей задачей слишком хорошо Ёто последн€€ задачка из учебника, котора€, по идее, должна решатьс€ за семь ходов. ѕоймите мен€ правильно.  орол€, в этой позиции, можно съесть Ђ¬садникомї всего за три хода! ѕри условии, что он не будет ни на что реагировать, когда Ђ¬садникї подскачет к нему вплотную. ¬ реальной жизни, так не бывает. ƒл€ мен€ очевидно, что сдвинув Ђ атапультуї вправо и вз€в мешающего ей Ђќполченцаї при помощи Ђ—лонаї, задачу можно было бы решить за отведЄнное число ходов. Ќо мешают крепости! ѕока Ђ опейщикиї р€дом с ними, они не могут быть Ђвз€ты под прицелї, а они закрывают Ђ орол€ї! ¬ оригинальных правилах, говоритс€ следующее: A piece that is adjacent to one or more opposing Towers cannot engage any pieces except the adjacent Tower(s)¬озможно, здесь имелась в виду ситуаци€, когда фигура может Ђзацепитьї и Ђ репостьї и охран€емую ей фигуру (то есть стоит вплотную к ним обеим). Ќе знаю. Ёто хороша€ тема, над которой стоит подумать. ѕока же, € разрешил Ђƒраконуї (Dragon) брать фигуру, наход€щуюс€ под защитой крепости, с рассто€ни€ в два шага (в радиусе действи€ его Ђзацеплени€ї, но не вплотную). Ќа мой взгл€д, это немного оживл€ет игру. —тоит рассказать о двух самых слабых фигурах, к которым, в равной степени, подходит выражение Ђмал, да удалї. Ђ опейщикї (Spears) Ч это, в каком-то смысле, аналог шахматной пешки. ћожет идти только вперЄд и атакует всего два пол€ перед собой (правда, при этом, ни во что не превращаетс€). „ем может быть полезна така€ фигура?  онечно же, у неЄ есть секрет.  онтролируемые ею два пол€ (всего два) ни одна из вражеских фигур не может Ђпроскочитьї за один ход. Ќапример, это означает, что конница не может атаковать Ђ опейщикаї с фронта, даже если тот Ђзацепленї другой фигурой. —начала она должна подойти вплотную. Spears Ч это превосходный защитный юнит, напоминающий Ђ“елохранител€ї (’иа) из монгольской игры ’иашатар. — Ђќполченцамиї (Rabble) всЄ обстоит немного проще. ќни могут ходить (и Ђбитьї) на один шаг, в любую сторону, как Ђ орольї. ‘окус заключаетс€ в том, что игрок имеет право сделать два Ђтихихї хода Ђќполченцамиї подр€д. Ёто атакующий юнит. —делав два Ђтихихї хода, можно создать две угрозы, в разных концах доски. ќдного Ђќполченцаї, скорее всего съед€т, но другим можно будет организовать прорыв. Ёто решение мне тоже безумно нравитс€. ’от€ и доставило мне некоторое количество проблем, в части реализации“ут вот в чЄм дело, пор€док ходов в ZRF (да и в ZoG в целом) жЄстко задан. ≈сли бы каждому из игроков всегда приходилось делать по два хода (как в "ћарсельских шахматах"), это было бы просто.  ак-то вот так: (turn-order White White Black Black) Ќо нам-то требуетс€, чтобы право повторного хода предоставл€лось только после Ђтихогої хода Rabble и чтобы вторым ходом был тоже Ђтихийї ход, но уже другого Rabble. » никак иначе! », кстати, право, а не об€занность. ¬от тут, мне пришлось пойти на компромиссы. Ѕыло пон€тно, что без механизма пропуска хода (pass) здесь не обойтись, но автор на этот счЄт выразилс€ предельно чЄтко: "He must move a piece, or forfeit the game".   счастью, в ZoG предусмотрен режим, при котором пропуск хода выполн€етс€ (автоматически), лишь при отсутствии любых разрешЄнных ходов (это конечно тоже не совсем правильно, поскольку, при использовании данной опции, игроку не будет засчитано поражение, при отсутствии возможности хода). —обственно, код(define rabble-1 ( (set-position-flag from-pos? true) (verify (not-enemy? a8)) (verify (not is-moved?)) $1 (verify (or empty? (piece? Point))) (set-flag other-rabble? false) mark START (while (on-board? next) next (if (not-position-flag? from-pos?) (if (and friend? (piece? Rabble)) (set-flag other-rabble? true) ) ) ) back (if (flag? other-rabble?) (if (empty? a8) (create Point a8) (set-attribute is-moved? true) ) ) (if (not-empty? a8) (capture a8) mark START (while (on-board? next) next (if is-moved? (set-attribute is-moved? false) ) ) back ) add )) (piece (name Rabble) ... (attribute is-moved? false) (moves (rabble-1 nw) (rabble-1 ne) (rabble-1 sw) (rabble-1 se) (rabble-1 w) (rabble-1 e) ) ) ) –ешение не идеально. ƒвига€ первый Rabble мы помечаем его атрибутом, после чего, игрок уже об€зан найти и передвинуть какой-то другой свой Rabble (его противник просто пропускает один ход). ¬о врем€ второго перемещени€, кстати, снимаетс€ установленный атрибут и если этого не произойдЄт, игра, скорее всего, просто остановитс€. ѕоэтому, очень важно, ещЄ на первом ходу, найти хот€ бы ещЄ один другой Rabble и, если такого нет, всю эту магию не включать!  ак обычно, задним умом пришла мысль, что хорошо бы еще и провер€ть возможность хода этим самым другим Rabble.   счастью, это было совсем просто. “ак родилс€ патч. ќсталось рассказать про рельеф местности. ѕомимо фигур, на доске могут быть расположены Ђгорыї и ЂводоЄмыї. — Ђгорамиї всЄ пон€тно Ч ни одна фигура не может располагатьс€ Ђна гореї и только Ђƒраконї умеет перелетать через горы. –азумеетс€, Ђгорыї перекрывают Ђобзорї, преп€тству€ Ђзацеплениюї вражеских фигур (про нюанс с Ђ атапультойї € уже говорил). — ЂводоЄмамиї всЄ сложнее. ‘игуры в них размещать можно, но с потерей возможности Ђзацеплени€ї ими вражеских фигур. Ёто также добавл€ет тактического разнообрази€ игре. ¬ этом месте, у ZoG таки тоже есть свои особенности≈сли с Ђгорамиї всЄ было просто (ну, фигуры и фигуры), то Ђводаї доставила хлопот. Ќет, в принципе, еЄ € тоже мог сделать фигурами. я как-то раз уже так делал и вот к чему всЄ привело. Ёто не лаг был, а така€ конструктивна€ особенность! ¬прочем, в тот раз выбора не было. –исование зелЄных квадратиков на чЄрном фоне отн€ло бы кучу времени и раза в два раздуло и без того полуторно-мегабайтный дистрибутив, на 90% заполненный радикально-чЄрными Ђзадникамиї. ¬ общем, в этот раз, воду € рисовал пр€мо на доске, параллельно отмеча€ еЄ в качестве игровой зоны в описании игры.   сожалению, таким образом, можно нарисовать хоть и любую, но лишь жЄстко фиксированную карту. Ќи о каком авторском ЂNine Tileї речи уже не идЄт. ј жаль,Е но тут уж ничего не попишешь. Ќу вот, в общем-то, и всЄ. »гра опубликована, с любезного дозволени€ автора. »нтерфейс вышел похуже чем в оригинальной версии (например, не подсвечиваютс€ Ђзацеплени€ї), но зато работает AI. ¬о вс€ком случае, задачки учебника решает Ђна ураї. »грает, в принципе, тоже вполне вмен€емо (особенно, если компьютер помощнее, да врем€ Ђна обдумываниеї выставлено побольше. —ама игра мне очень понравилась. ¬ тактическом плане, она показалась мне не менее сложной чем Ko Shogi, выгодно отлича€сь от последней большей Ђлаконичностьюї и продуманностью. ¬се фигуры работают! » дл€ игры вполне достаточно относительно небольшой доски. ј о том, как ослабить Ђ репостиї, € ещЄ подумаю.

ћетки:  

 —траницы: [1]