Для неподготовленного пользователя выглядит, конечно, страшно, зато даже браузер не нужен для игры.
Для того, чтобы зайти в игру, необходимо выполнить такую команду, которая подразумевает обращение к моему dns-серверу:
$ dig @ns.f1remoon.com game.f1remoon.com. TXT
Так же я сделал небольшую справку, которая доступна в TXT-записях по домену
help.game.f1remoon.com
:Как это работает?
Сначала я пытался просто правильно настроить bind9, но был сильно огорчён: порядок выдачи TXT-записей был случайный. Это, конечно, приносило некоторую экзотику в игру, но было абсолютно неприемлемо. Пришлось отбросить идею и смотреть в сторону самописного DNS-сервера. Вооружившись желанием изучить что-то новое, я взял golang и библиотеку Go DNS и получился простой, не сильно отличающийся от примеров, сервер.
Следующей сложностью были все комбинации игры. Тут большая благодарность Sirion: я взял его html-файлы и транслировал в угодный мне формат.
Так как команда dig, в отличие от браузера, не хранит url и не даёт тыкать по полю, придётся оставить это пользователю. Для игры поле было размечено как numpad:
7 8 9
4 5 6
1 2 3
При запросе хода всегда нужно отдавать полную историю ходов в обратном, например, команда на третий ход в клеточку «9» будет выглядеть так:
$ dig @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
$ dig @ns.f1remoon.com 5.game.f1remoon.com. TXT
; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 5.game.f1remoon.com. TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12656
;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;5.game.f1remoon.com. IN TXT
;; ANSWER SECTION:
5.game.f1remoon.com. 0 IN TXT "o" "_" "_"
5.game.f1remoon.com. 0 IN TXT "_" "x" "_"
5.game.f1remoon.com. 0 IN TXT "_" "_" "_"
;; Query time: 135 msec
;; SERVER: 159.65.145.145#53(159.65.145.145)
;; WHEN: Sun Aug 05 20:16:16 UTC 2018
;; MSG SIZE rcvd: 148
$ dig @ns.f1remoon.com 4.5.game.f1remoon.com. TXT
; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 4.5.game.f1remoon.com. TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9301
;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;4.5.game.f1remoon.com. IN TXT
;; ANSWER SECTION:
4.5.game.f1remoon.com. 0 IN TXT "o" "_" "_"
4.5.game.f1remoon.com. 0 IN TXT "x" "x" "o"
4.5.game.f1remoon.com. 0 IN TXT "_" "_" "_"
;; Query time: 131 msec
;; SERVER: 159.65.145.145#53(159.65.145.145)
;; WHEN: Sun Aug 05 20:16:23 UTC 2018
;; MSG SIZE rcvd: 156
$ dig @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40450
;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;9.4.5.game.f1remoon.com. IN TXT
;; ANSWER SECTION:
9.4.5.game.f1remoon.com. 0 IN TXT "o" "_" "x"
9.4.5.game.f1remoon.com. 0 IN TXT "x" "x" "o"
9.4.5.game.f1remoon.com. 0 IN TXT "o" "_" "_"
;; Query time: 131 msec
;; SERVER: 159.65.145.145#53(159.65.145.145)
;; WHEN: Sun Aug 05 20:16:30 UTC 2018
;; MSG SIZE rcvd: 164
$
Репозиторий с кодом: github.com/Firemoon777/tic-tac-toe-dns
UPD: Prototik предлагает использовать более удобный для игры вариант с ключом +short:
$ dig +short TXT @ns.f1remoon.com 9.4.5.game.f1remoon.com.
"o" "_" "x"
"x" "x" "o"
"o" "_" "_"
Комментарии (44)
Sirion
06.08.2018 00:16+1Сильно, снимаю шляпу.
berezuev
06.08.2018 00:25+1Занятная штука. Жаль, нельзя никак обыграть сервер)
Может на досуге попробую форкнуть сервер и сделать на его основе 5х5 версию (только, не хардкодить ходы, а прикрутить полноценный алгоритм).Firemoon Автор
06.08.2018 00:30Тогда поднимается вопрос о том, как хранить ход для конкретного юзера х)
Prototik
06.08.2018 00:39Ну, можно просто при старте игры выдавать id и добавить его в начало имени, а-ля 8.5.2.IDDQD.game.com
eirnym
06.08.2018 01:22+1Можно сделать с двумя серверами, которые следят за обновлениями друг друга, добавляя ходы.
denis-19
06.08.2018 07:11Под виндой (7) не потестировать, если bind и dig не установлены?
Только nslookup есть штатно жешь.Prototik
06.08.2018 07:18Винды под рукой нет, но что-то такое должно сработать:
nslookup -type=txt 9.4.5.game.f1remoon.com ns.f1remoon.com
Prototik
06.08.2018 07:23Собственно, оно и работает, но хреновенькоingwiz
06.08.2018 21:50+1Можно использовать командлет Resolve-DnsName:denis-19
06.08.2018 07:30Вот так вывод получается кусочками 1*3, а не сразу 3*3:
Prototik
06.08.2018 07:39Ну либо просите автора переделать вывод в одну строчку в записи, а не в три, либо ищите правосланый dig под винду. Больше ничем не могу помочь :D
aram_pakhchanian
06.08.2018 08:44А его особо искать не надо: nil.uniza.sk/linux-howto/how-install-dig-dns-tool-windows-10
denis-19
06.08.2018 09:34Этот путь то ясен, но не всегда доступен. Есть штатные средства только, например, на ноуте, а потестировать функционал после прочтения интересно.
POS_troi
06.08.2018 12:08Эээ.
Идём сюда: www.isc.org/downloads/bind
Качаем дистр, унзипим и дастаём dig.exe, радуемся.
P.S. нужен vcredist_x86.exe
hapylestat
06.08.2018 12:35для 10й винды просто ставим любой дистрибутив из маркета для wsl и не паримся
stack_overphlow
06.08.2018 09:28Мне эти статьи напомнили зарисовку, вроде где-то на Хабре видел. Там парень таскал камни по острову. И вот он ставит последний камень на место, картинка отдаляется, видно огромные хитросплетения из глыб и он говорит, что-то типа «Вот и готов процессор», и далее испаряется
Описал я конечно ужасно, но что помниться
markenstein
06.08.2018 14:13Не робит
Firemoon Автор
06.08.2018 14:14>connection timed out
Сервер с игрушкой стоит на vps от digital ocean. Не повезло, твой провайдер блокирует этот ip'шник.
WNeZRoS
06.08.2018 14:18+1Подумалось сделать крестики-нолики на ftp, но нет подходящего сервера. Поэтому сделал zip (ссылка).
amarao
06.08.2018 15:32Тут надо добавить, что это не просто "крестики-нолики" на DNS, а статические крестики-нолики без вычислительной части.
Потому что в общем случае на DNS можно реализовать любое RPC...
Кстати, интересная идея. Как насчёт
dig -t TXT news.example.com
, который отвечает заголовками текущих новостей в TXT?
Griboks
06.08.2018 15:51Какая увлекательная игра. Лучше могут быть только крестики-нолики на boot menu. Завтра напишу пост, как сделать крестики-нолики в 0 системных блоков, сетевых адаптеров и устройств ввода.
forefinger
07.08.2018 21:29Старое, конечно, 2011 год всё-таки, но вот тетрис в бутлоадере для HD2 — https://www.xda-developers.com/magldr-1-13-for-hd2-released/
eirnym
Интересно, спасибо, напомнило морской бой на BGP )