Дагазсервер: Как Все Работает

Видимо, я не самый правильный фронтенд-разработчик.

Большую часть своей взрослой жизни я работал с базами данных и небольшим бэкендом.

Моя любовь к настольным играм привела меня в веб-разработку.

Совершенно незнакомый мне язык программирования — JavaScript, я выучил попутно.

Я признаю, что многое из того, что я сделал, может привести в ужас опытных веб-разработчиков, но я стараюсь стать лучше.

Этот текст не для тех, кто привык во всем следовать письменным инструкциям раз и навсегда.

Но если вы любите экспериментировать, докапываться до каждой детали, открывать для себя новое, добро пожаловать в тень моего леса.



ДагазСервер: Как все работает

Как все началось Фаза активного увлечения настольными играми началась для меня со знакомства с Миллионы игр .

То, что на компьютере можно играть в игры, не было новостью.

Оригинальность этого проекта заключалась в использовании ZRF, Lisp-подобного языка, предназначенного для быстрого описания разнообразие игр .

К сожалению, я быстро понял, что хотя простые игры легко создавать с помощью ZRF, игры посложнее быстро приводят к появлению тысяч строк непонятного кода.

Например, в ZRF нет самой распространенной арифметики.

В результате целочисленные значения приходится собирать из битовых флагов.

И это выглядит примерно так

  
  
   

(define not-0? (or (flag? $1-08) (flag? $1-04) (flag? $1-02) (flag? $1-01) ) ) (define inc (if (flag? $1-01) (set-flag $1-01 false) (if (flag? $1-02) (set-flag $1-02 false) (if (flag? $1-04) (set-flag $1-04 false) (if (flag? $1-08) (set-flag $1-08 false) else (set-flag $1-08 true) ) else (set-flag $1-04 true) ) else (set-flag $1-02 true) ) else (set-flag $1-01 true) ) ) (define dec (if (not-flag? $1-01) (set-flag $1-01 true) (if (not-flag? $1-02) (set-flag $1-02 true) (if (not-flag? $1-04) (set-flag $1-04 true) (if (not-flag? $1-08) (set-flag $1-08 true) else (set-flag $1-08 false) ) else (set-flag $1-04 false) ) else (set-flag $1-02 false) ) else (set-flag $1-01 false) ) ) (define sum (while (not-0? $2) (inc $1) (dec $2) ) )

В Комплект разработчика Axiom — библиотека, разработанная Грегом Шмидтом, можно было добавлять числа, но в качестве метаязыка использовался диалект Форт -a, что не сделало программы более понятными.

Само решение было в некотором роде хаком с использованием API, предназначенного для подключения к миллионам ботов.

Кроме того, Axiom ничего не сделала для решения фатального недостатка Zillions — игры продолжали запускаться только на Windows и только на платной платформе с закрытым исходным кодом.

Знакомство с проектом Жокли дал мне возможное решение этой проблемы.

Действительно, игра, написанная на JavaScript, может работать в любом современном браузере, включая мобильные платформы.

С этого момента началась работа над Дагаз .

Я заметил что-то в Жокли и что-то о Зейн Фишер .

Так же, как и Zillions, Dagaz использует ZRF (это позволяет очень быстро разрабатывать прототипы новых игр), но не напрямую (что оказалось невозможным из-за недостаточной производительности), а после составления специального полезность .

Этот

(define checker-shift ( $1 (verify empty?) (if (in-zone? promotion) (add King) else add ) )) (define checker-jump ( $1 (verify enemy?) capture $1 (verify empty?) (if (in-zone? promotion) (add-partial King continue-type) else (add-partial jump-type) ) )) (define king-shift ( $1 (while empty? add $1 ) )) (define king-jump ( $1 (while empty? $1) (verify enemy?) $1 (while empty? mark (while empty? (opposite $1) ) capture back (add-partial continue-type) $1 ) )) (define king-continue ( $1 (while empty? $1 (verify not-last-from?) ) (verify enemy?) $1 (while empty? mark (while empty? (opposite $1) ) capture back (add-partial continue-type) $1 ) )) (game (title "Russian Checkers") (players White Black) (turn-order White Black) (move-priorities jump-type normal-type) (board (image "images/8x8.bmp") (grid (start-rectangle 2 2 52 52) (dimensions ("a/b/c/d/e/f/g/h" (50 0)) ; files ("8/7/6/5/4/3/2/1" (0 50)) ; ranks ) (directions (ne 1 -1) (nw -1 -1) (se 1 1) (sw -1 1)) ) (symmetry Black (nw se) (se nw) (ne sw) (sw ne)) (zone (name promotion) (players White) (positions b8 d8 f8 h8) ) (zone (name promotion) (players Black) (positions a1 c1 e1 g1) ) ) (piece (name Man) (image White "images/wman.bmp" Black "images/bman.bmp") (moves (move-type jump-type) (checker-jump nw) (checker-jump ne) (checker-jump sw) (checker-jump se) (move-type normal-type) (checker-shift nw) (checker-shift ne) ) ) (piece (name King) (image White "images/wdamone.bmp" Black "images/bdamone.bmp") (moves (move-type jump-type) (king-jump nw) (king-jump ne) (king-jump sw) (king-jump se) (move-type continue-type) (king-continue nw) (king-continue ne) (king-continue sw) (king-continue se) (move-type normal-type) (king-shift nw) (king-shift ne) (king-shift sw) (king-shift se) ) ) (board-setup (White (Man a1 c1 e1 g1 b2 d2 f2 h2 a3 c3 e3 g3) ) (Black (Man b8 d8 f8 h8 a7 c7 e7 g7 b6 d6 f6 h6) ) ) )

превращается в это

ZRF = { JUMP: 0, IF: 1, FORK: 2, FUNCTION: 3, IN_ZONE: 4, FLAG: 5, SET_FLAG: 6, POS_FLAG: 7, SET_POS_FLAG: 8, ATTR: 9, SET_ATTR: 10, PROMOTE: 11, MODE: 12, ON_BOARD_DIR: 13, ON_BOARD_POS: 14, PARAM: 15, LITERAL: 16, VERIFY: 20 }; Dagaz.Model.BuildDesign = function(design) { design.checkVersion("z2j", "2"); design.checkVersion("animate-captures", "false"); design.checkVersion("smart-moves", "true"); design.checkVersion("show-hints", "false"); design.checkVersion("show-blink", "true"); design.checkVersion("deferred-captures", "true"); design.checkVersion("advisor-wait", "5"); design.addDirection("ne"); design.addDirection("se"); design.addDirection("sw"); design.addDirection("nw"); design.addPlayer("White", [2, 3, 0, 1]); design.addPlayer("Black", [2, 3, 0, 1]); design.addPosition("a8", [0, 9, 0, 0]); design.addPosition("b8", [0, 9, 7, 0]); design.addPosition("c8", [0, 9, 7, 0]); design.addPosition("d8", [0, 9, 7, 0]); design.addPosition("e8", [0, 9, 7, 0]); design.addPosition("f8", [0, 9, 7, 0]); design.addPosition("g8", [0, 9, 7, 0]); design.addPosition("h8", [0, 0, 7, 0]); design.addPosition("a7", [-7, 9, 0, 0]); design.addPosition("b7", [-7, 9, 7, -9]); design.addPosition("c7", [-7, 9, 7, -9]); design.addPosition("d7", [-7, 9, 7, -9]); design.addPosition("e7", [-7, 9, 7, -9]); design.addPosition("f7", [-7, 9, 7, -9]); design.addPosition("g7", [-7, 9, 7, -9]); design.addPosition("h7", [0, 0, 7, -9]); design.addPosition("a6", [-7, 9, 0, 0]); design.addPosition("b6", [-7, 9, 7, -9]); design.addPosition("c6", [-7, 9, 7, -9]); design.addPosition("d6", [-7, 9, 7, -9]); design.addPosition("e6", [-7, 9, 7, -9]); design.addPosition("f6", [-7, 9, 7, -9]); design.addPosition("g6", [-7, 9, 7, -9]); design.addPosition("h6", [0, 0, 7, -9]); design.addPosition("a5", [-7, 9, 0, 0]); design.addPosition("b5", [-7, 9, 7, -9]); design.addPosition("c5", [-7, 9, 7, -9]); design.addPosition("d5", [-7, 9, 7, -9]); design.addPosition("e5", [-7, 9, 7, -9]); design.addPosition("f5", [-7, 9, 7, -9]); design.addPosition("g5", [-7, 9, 7, -9]); design.addPosition("h5", [0, 0, 7, -9]); design.addPosition("a4", [-7, 9, 0, 0]); design.addPosition("b4", [-7, 9, 7, -9]); design.addPosition("c4", [-7, 9, 7, -9]); design.addPosition("d4", [-7, 9, 7, -9]); design.addPosition("e4", [-7, 9, 7, -9]); design.addPosition("f4", [-7, 9, 7, -9]); design.addPosition("g4", [-7, 9, 7, -9]); design.addPosition("h4", [0, 0, 7, -9]); design.addPosition("a3", [-7, 9, 0, 0]); design.addPosition("b3", [-7, 9, 7, -9]); design.addPosition("c3", [-7, 9, 7, -9]); design.addPosition("d3", [-7, 9, 7, -9]); design.addPosition("e3", [-7, 9, 7, -9]); design.addPosition("f3", [-7, 9, 7, -9]); design.addPosition("g3", [-7, 9, 7, -9]); design.addPosition("h3", [0, 0, 7, -9]); design.addPosition("a2", [-7, 9, 0, 0]); design.addPosition("b2", [-7, 9, 7, -9]); design.addPosition("c2", [-7, 9, 7, -9]); design.addPosition("d2", [-7, 9, 7, -9]); design.addPosition("e2", [-7, 9, 7, -9]); design.addPosition("f2", [-7, 9, 7, -9]); design.addPosition("g2", [-7, 9, 7, -9]); design.addPosition("h2", [0, 0, 7, -9]); design.addPosition("a1", [-7, 0, 0, 0]); design.addPosition("b1", [-7, 0, 0, -9]); design.addPosition("c1", [-7, 0, 0, -9]); design.addPosition("d1", [-7, 0, 0, -9]); design.addPosition("e1", [-7, 0, 0, -9]); design.addPosition("f1", [-7, 0, 0, -9]); design.addPosition("g1", [-7, 0, 0, -9]); design.addPosition("h1", [0, 0, 0, -9]); design.addZone("promotion", 1, [1, 3, 5, 7]); design.addZone("promotion", 2, [56, 58, 60, 62]); design.addZone("best", 1, [26, 21]); design.addZone("best", 2, [37, 42]); design.addCommand(0, ZRF.FUNCTION,

Теги: #Разработка игр #Логические игры #JavaScript #typescript #настольные игры #Дагаз

Вместе с данным постом часто просматривают: