7 October 2019

Dagaz: Конец одиночества

JavaScriptGame developmentLogic games
Счастье для всех, даром
и пусть никто не уйдёт обиженный! 
 
А. и Б. Стругацкие «Пикник на обочине»
 
          

Боты, как бы хорошо они не играли, плохая замена живым игрокам. Если бот играет слабо — это не интересно. Если сильно — это обидно и снова не интересно. Баланс соблюсти чертовски трудно (тем более, что для каждого игрока он индивидуальный). Я уже давно собирался реализовать сетевую игру, но всё упиралось в необходимость содержания собственного сервера. К счастью, решение пришло с неожиданной стороны.

Ed van Zon — это человек, с которым я общаюсь довольно давно. Так получилось, что именно он подхватил падающее знамя Zillions, когда разработчики (Jeff Mallett и Mark Lefler) внезапно потеряли интерес к развитию проекта. Так что, все эти игры опубликованы на сайте его силами. А ещё, он и Christian Freeling занимаются поддержкой и развитием собственного сайта (само собой, тоже про настольные игры):


Но всё это была присказка. Сказка начинается с того, что на этом сайте есть нора (вернее, яма, но суть не в этом), в которой живые игроки могут играть по переписке. Вернее могли, до тех пор пока технология Java-апплетов не стала считаться устаревшей. В последнее же время, поскольку их использование простыми смертными стало затруднительным, Эд задумался о более современных решениях. И тут подвернулся я, вместе со своим проектом.


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

Была, впрочем, одна проблема
Подразумевалось, что во все эти игры игроки смогут играть между собой, а не только с ботами, Dagaz же, в его первоначальной реализации, такой возможности не предусматривал. Пришлось быстренько что-то придумывать. К счастью, у меня уже был session-manager, позволявший откатывать ошибочно сделанные ходы. В качестве бонуса, он сохранял историю игры в оперативной памяти и этим решено было воспользоваться.

Сохранение
SessionManager.prototype.save = function() {
  if (_.isUndefined(this.current) || _.isUndefined(this.current.board)) return null;
  var states = [];
  var board  = this.current.board;
  while (board.parent !== null) {
      states.push(board);
      board = board.parent;
  }
  var r = "(";
  while (states.length > 0) {
      var board = states.pop();
      r = r + ";" + Dagaz.Model.playerToString(board.parent.player);
      r = r + "[" + Dagaz.Model.moveToString(board.move) + "]";
  }
  r = r + ")";
  return r;
}

и загрузка
SessionManager.prototype.load = function(sgf) {
  var res = Dagaz.Model.parseSgf(sgf);
  this.states = [];
  delete this.current;
  var board = Dagaz.Model.getInitBoard();
  this.addState(Dagaz.Model.createMove(), board);
  for (var i = 0; i < res.length; i++) {
       var p = res[i].name;
       if (p != Dagaz.Model.playerToString(board.player)) return false;
       if (res[i].arg.length != 1) return false;
       var move = this.locateMove(board, res[i].arg[0]);
       if (move === null) return false;
       board = board.apply(move);
       this.addState(move, board);
  }
  this.controller.setBoard(board);
  return true;
}

Уложились всего в несколько десятков строк (сам парсер SGF-формата я конечно не считаю, желающие могут посмотреть его здесь). К слову сказать, и сам SGF и session-manager поддерживают работу с деревом, а не просто с историей игры, но для наших текущих целей это не требовалось.

В качестве первой игры от Dagaz, с возможностью игры по сети, хотелось выбрать что-то оригинальное (тем более, что Шашки, Шахматы и Го у Эда уже были). Выбор пал на Turnover. Эту игру, во многом похожую на Шахматы, совсем недавно придумал Lúcio José Patrocínio Filho.


Фигуры здесь сборные. Самое большое кольцо ходит как шахматная пешка, среднее — как слон, а сердцевина представляет из себя ладью. Комбинация из ладьи и слона даёт ферзя (что вполне логично), а два кольца — шахматного коня. Все три части вместе образуют замок — главную фигуру, которую необходимо защищать. Здесь стоит сказать, что перемещается всегда всего одна, самая внешняя часть. Таким образом, внешнее кольцо замка, в любой момент, может переместиться ходом пешки (в том числе, прыжком через поле), но замок, при этом, будет разрушен.

Здесь есть ещё одна, пока не решённая, проблема
Потеряв последний замок, игрок проигрывает. На самом деле, потерять все замки игрок не может, поскольку в игре действуют правила шаха и мата. Замки запрещено оставлять под ударом, но только при условии, что все они атакованы. Кроме того, интригу в игру добавляет то, что новые фигуры (и замки тоже) могут создаваться из составных частей по ходу дела (в том числе, из материала противника). Всё это делает проверку на шах и мат очень сложной задачей и вот пример, с которым она пока не справляется:


На самом деле, здесь нет мата, но это довольно сложно. Поле D1 атаковано слоном на E2 и это последний замок. Золотые могут построить второй замок, сходив ладьёй с C3 на C4, но это поле тоже атаковано! Фокус заключается в том, что оба поля атакует одна и та же фигура, а она не может съесть оба замка одним ходом! Lúcio обнаружил эту ошибку совсем недавно и это то, над чем я буду работать в ближайшее время.

Рокировок и взятия на проходе в игре нет, да и вообще, Turnover не очень похож на Шахматы. Королей в игре много, но они не могут двигаться (во всяком случае, без разрушения), а кони и ферзи «одноразовые», поскольку перемещаясь, внешнее кольцо разрушает фигуру. На мой взгляд, игра выглядит довольно интересной, хотя и совершенно не исследованной. Поиграть можно вот здесь:


Для игры по сети, разумеется потребуется зарегистрироваться (игра то ведь по переписке) и послать кому нибудь «Challenge». Если хотите поиграть с ботом (или просто подвигать по доске фигуры), никакой регистрации не требуется. Впрочем, при таком режиме, игра мало чем будет отличаться от опубликованной на GitHub-е. Также, не требуется регистрация для наблюдения за текущими или ранее сыгранными партиями.

В качестве бонуса
В Dagaz поддерживается ещё один режим игры:


Так что, желающие могут попробовать поиграть вслепую (в этот раз, только против бота).

Учёт побед/поражений для Turnover пока не ведётся, но здесь всё в ваших руках. Если игра будет популярна, Эд обещал прикрутить к ней рейтинг. Ну и напоследок небольшой опрос, на тему дальнейшего развития проекта:
Only registered users can participate in poll. Log in, please.
В какие игры вам было бы интересно играть по переписке?
33.33% Шахматы 6
0% Шашки 0
5.56% Сёги 1
5.56% Сянцы 1
44.44% Го 8
11.11% Нарды 2
5.56% Оваре 1
11.11% Тогыз Кумалак 2
16.67% что-то другое (напишите в комментариях что именно) 3
18 users voted. 11 users abstained.
Tags:DagazMindSportsChess Variants
Hubs: JavaScript Game development Logic games
+13
2.5k 14
Comments 5
Popular right now