Видимо, я не самый правильный фронтенд-разработчик.
Большую часть своей взрослой жизни я работал с базами данных и небольшим бэкендом.
Моя любовь к настольным играм привела меня в веб-разработку.
Совершенно незнакомый мне язык программирования — JavaScript, я выучил попутно.
Я признаю, что многое из того, что я сделал, может привести в ужас опытных веб-разработчиков, но я стараюсь стать лучше.
Этот текст не для тех, кто привык во всем следовать письменным инструкциям раз и навсегда.
Но если вы любите экспериментировать, докапываться до каждой детали, открывать для себя новое, добро пожаловать в тень моего леса.
Как все началось
Фаза активного увлечения настольными играми началась для меня со знакомства с Миллионы игр .
То, что на компьютере можно играть в игры, не было новостью.
Оригинальность этого проекта заключалась в использовании ZRF, Lisp-подобного языка, предназначенного для быстрого описания разнообразие игр .
К сожалению, я быстро понял, что хотя простые игры легко создавать с помощью ZRF, игры посложнее быстро приводят к появлению тысяч строк непонятного кода.
Например, в ZRF нет самой распространенной арифметики.
В результате целочисленные значения приходится собирать из битовых флагов.
И это выглядит примерно так
В Комплект разработчика Axiom — библиотека, разработанная Грегом Шмидтом, можно было добавлять числа, но в качестве метаязыка использовался диалект Форт -a, что не сделало программы более понятными.(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) ) )
Само решение было в некотором роде хаком с использованием 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 #настольные игры #Дагаз