Изначально я хотел назвать этот пост «игра в 0 строк HTML, JS и CSS», вдохновлённый этим постом, но это было бы слишком громко. Так или иначе, сильно ухудшив UX, я получил крестики-нолики, работающие исключительно силой DNS протокола.



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

Для того, чтобы зайти в игру, необходимо выполнить такую команду, которая подразумевает обращение к моему 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)


  1. eirnym
    06.08.2018 00:08

    Интересно, спасибо, напомнило морской бой на BGP )


  1. Sirion
    06.08.2018 00:16
    +1

    Сильно, снимаю шляпу.


    1. Babayka_od
      06.08.2018 10:48

      Сильно снимаю шляпу!


      1. Vigogne
        06.08.2018 22:33

        Сильно снимаю, шляпу…


        1. forumrulez
          06.08.2018 23:35

          Сильно снимаю, шляпу…


          1. MaxVetrov
            07.08.2018 00:21

            Strongly take off my hat!


  1. berezuev
    06.08.2018 00:25
    +1

    Занятная штука. Жаль, нельзя никак обыграть сервер)

    Может на досуге попробую форкнуть сервер и сделать на его основе 5х5 версию (только, не хардкодить ходы, а прикрутить полноценный алгоритм).


    1. Firemoon Автор
      06.08.2018 00:30

      Тогда поднимается вопрос о том, как хранить ход для конкретного юзера х)


      1. Prototik
        06.08.2018 00:39

        Ну, можно просто при старте игры выдавать id и добавить его в начало имени, а-ля 8.5.2.IDDQD.game.com


      1. berezuev
        06.08.2018 00:49

        Prototik опередил меня.
        В дополнение к его комментарию скажу, что в этом случае отпадает необходимость передавать всю цепочку. Достаточно будет только текущую цифру. Либо что-то вроде A1.id.domain.com


        1. Firemoon Автор
          06.08.2018 00:53

          Да, выглядят неплохо.


      1. eirnym
        06.08.2018 01:22
        +1

        Можно сделать с двумя серверами, которые следят за обновлениями друг друга, добавляя ходы.


  1. KvanTTT
    06.08.2018 02:12

    Думаю можно залить запись игры на asciinema.org


  1. Prototik
    06.08.2018 02:57
    +3

    btw с +short играть удобнее:


    $ dig +short TXT @ns.f1remoon.com 9.4.5.game.f1remoon.com.
    "o" "_" "x"
    "x" "x" "o"
    "o" "_" "_"


    1. Firemoon Автор
      06.08.2018 08:58

      Добавил в статью, спасибо!


  1. denis-19
    06.08.2018 07:11

    Под виндой (7) не потестировать, если bind и dig не установлены?
    Только nslookup есть штатно жешь.


    1. Prototik
      06.08.2018 07:18

      Винды под рукой нет, но что-то такое должно сработать:


      nslookup -type=txt 9.4.5.game.f1remoon.com ns.f1remoon.com


      1. Prototik
        06.08.2018 07:23

        Собственно, оно и работает, но хреновенько


        1. ingwiz
          06.08.2018 21:50
          +1

          Можно использовать командлет Resolve-DnsName:


      1. denis-19
        06.08.2018 07:30

        Вот так вывод получается кусочками 1*3, а не сразу 3*3:
        image


        1. Prototik
          06.08.2018 07:39

          Ну либо просите автора переделать вывод в одну строчку в записи, а не в три, либо ищите правосланый dig под винду. Больше ничем не могу помочь :D


          1. aram_pakhchanian
            06.08.2018 08:44

            А его особо искать не надо: nil.uniza.sk/linux-howto/how-install-dig-dns-tool-windows-10


            1. denis-19
              06.08.2018 09:34

              Этот путь то ясен, но не всегда доступен. Есть штатные средства только, например, на ноуте, а потестировать функционал после прочтения интересно.


              1. POS_troi
                06.08.2018 12:08

                Эээ.
                Идём сюда: www.isc.org/downloads/bind
                Качаем дистр, унзипим и дастаём dig.exe, радуемся.

                P.S. нужен vcredist_x86.exe


          1. hapylestat
            06.08.2018 12:35

            для 10й винды просто ставим любой дистрибутив из маркета для wsl и не паримся


  1. stack_overphlow
    06.08.2018 09:28

    Мне эти статьи напомнили зарисовку, вроде где-то на Хабре видел. Там парень таскал камни по острову. И вот он ставит последний камень на место, картинка отдаляется, видно огромные хитросплетения из глыб и он говорит, что-то типа «Вот и готов процессор», и далее испаряется
    Описал я конечно ужасно, но что помниться


    1. Sirion
      06.08.2018 09:41
      +1

      Возможно, вы говорите об этом?


  1. MaxVetrov
    06.08.2018 12:06

    Интересно.
    Только с шахматами такого не делайте.)


    1. Firemoon Автор
      06.08.2018 12:14

      Если Sirion сделает генератор состояний (искусственный интеллект?), а berezuev — подходящий dns-сервер, то нас уже ничего не остановит. :D


  1. markenstein
    06.08.2018 14:13

    Не робит
    image


    1. Firemoon Автор
      06.08.2018 14:14

      >connection timed out
      Сервер с игрушкой стоит на vps от digital ocean. Не повезло, твой провайдер блокирует этот ip'шник.


      1. markenstein
        06.08.2018 14:19

        Да, есть такое. Из дома попробую ещё.


  1. WNeZRoS
    06.08.2018 14:18
    +1

    Подумалось сделать крестики-нолики на ftp, но нет подходящего сервера. Поэтому сделал zip (ссылка).

    Скриншот
    image


    1. MaxVetrov
      06.08.2018 14:27

      Максимум поле 16х16?


  1. amarao
    06.08.2018 15:32

    Тут надо добавить, что это не просто "крестики-нолики" на DNS, а статические крестики-нолики без вычислительной части.


    Потому что в общем случае на DNS можно реализовать любое RPC...


    Кстати, интересная идея. Как насчёт dig -t TXT news.example.com, который отвечает заголовками текущих новостей в TXT?


    1. nuclight
      07.08.2018 21:35

      Дойдёт до того, что NNTP воскресят!


      1. Firemoon Автор
        07.08.2018 22:40

        А потом и на нём в крестики-нолики сыграют?


  1. Griboks
    06.08.2018 15:51

    Какая увлекательная игра. Лучше могут быть только крестики-нолики на boot menu. Завтра напишу пост, как сделать крестики-нолики в 0 системных блоков, сетевых адаптеров и устройств ввода.


    1. forefinger
      07.08.2018 21:29

      Старое, конечно, 2011 год всё-таки, но вот тетрис в бутлоадере для HD2 — https://www.xda-developers.com/magldr-1-13-for-hd2-released/


      1. Firemoon Автор
        07.08.2018 22:40

        Я не уверен, но кажется он пытался в сарказм. х)


  1. uscr
    06.08.2018 16:48

    Не могу перестать думать об этом: github.com/asweigart/my_first_tic_tac_toe


    1. MaxVetrov
      06.08.2018 17:07

      Жесть.) 18205 строк в одном файле.


    1. ivahaev
      07.08.2018 14:56

      Шедеврально!


  1. Shallowsunny
    06.08.2018 20:06

    Мсье знает толк в извращениях!