Рубрики
Без рубрики

Решение кританского лабиринта

Как реализовать простую линейно-ориентированную команду интерпретатора для игры в игру. Помечено Python, Challenge, Дань, интерфейс.

Недавно Leonora der опубликовал большую работу: решайте критский лабиринт. Этот вызов действительно интересен, потому что это не требует, чтобы вы написали много кода, но все еще интересно решить и подумать об этом. Дополнительное спасибо за дизайн: просто и отлично. Поэтому я решил реализовать базовый интерфейс для этой игры, конечно, написанным в Python. Мое первое намерение было написать что-то подобное:

...
class MazeRunner():

    def __init__(self, username, password):
        # For BasicHTTPAuth
        self.username = username
        self.password = password

    def create_maze(self):
        """POST - /api/mazes

        Will let you start the maze
        """

    def start_loop(self):
        ...
...

И я даже сделал это. Написал дюжину методов, в основном еще не реализован Но они просто заглушки, вы знаете. Он охватил все API. Через несколько дней я начал копать поплы тогда его родитель BDB. , а затем вернуться к поплы . Я заметил что-то интересное: вот кусок исходного кода для PDB Класс, файл Lib/pdb.py.

...

line_prefix = '\n-> '   # Probably a better default

class Pdb(bdb.Bdb, cmd.Cmd):

    _previous_sigint_handler = None

...

Подожди, что это было? Этот второй родительский класс. Это CMD Отказ Таким образом, как обычно, Python Standard Библиотека решила большую часть моих проблем. Я начал читать документы на этом модуле: CMD Отказ Похоже, что я уже использую этот интерфейс более половины десятилетия, даже не замечая, что: отладки Python, как поплы , IPDB , пудб .. Эта общая рент появляется везде.

>>> import pdb
>>> pdb.set_trace()
--Return--
> (1)()->None
(Pdb) ?

Documented commands (type help ):
========================================
EOF    bt         cont      enable  jump  pp       run      unt   
a      c          continue  exit    l     q        s        until 
alias  cl         d         h       list  quit     step     up    
args   clear      debug     help    n     r        tbreak   w     
b      commands   disable   ignore  next  restart  u        whatis
break  condition  down      j       p     return   unalias  where 

Miscellaneous help topics:
==========================
exec  pdb

Undocumented commands:
======================
retval  rv

(Pdb) 

Давайте напишем что-то полезное

Что мы хотим решить (что нам нужно?)

  • Внедрить все API вызовы
  • Документировать их все
  • Понятно сделать для пользователя, что делать (документируйте его снова и предоставьте помощью)

Для реализации CMD Интерфейс мы должны что-то знать:

  • Основная функция – cmdloop Отказ
From the documentation:

Cmd.cmdloop(intro=None)

Repeatedly issue a prompt, accept input,
parse an initial prefix off the received input,
and dispatch to action methods, passing them the
remainder of the line as argument.
  • Обработчики команд – это методы, называемые do_ <имя команды>
An interpreter instance will recognize a command name foo if and only
if it has a method do_foo()
  • Для предоставления помощи для этой команды мы должны реализовать Справка_ <имя команды > метод
  • Стандарт do_help Метод вызывает все Справка_ * методы.
  • Есть предварительные и пост-обработчики для команд: председатель и PostCMD методы.
Cmd.precmd(line)

    Hook method executed just before the command line line is interpreted, but
after the input prompt is generated and issued. This method is a stub in Cmd;
it exists to be overridden by subclasses. The return value is used as
the command which will be executed by the onecmd() method; the precmd()
implementation may re-write the command or simply return line unchanged.

Cmd.postcmd(stop, line)

    Hook method executed just after a command dispatch is finished.
This method is a stub in Cmd; it exists to be overridden by subclasses.
line is the command line which was executed, and stop is a flag which
indicates whether execution will be terminated after the call to postcmd();
this will be the return value of the onecmd() method. The return value of
this method will be used as the new value for the internal flag which
corresponds to stop; returning false will cause interpretation to continue.

Хорошо, так что разговаривает

Поскольку я предпочитаю использовать Python по другим языкам, я собираюсь изменить имя моего CMD Класс до Mazecrawler потому что змеи не бегают, да? Но все же, это немного скучно. Я собираюсь пойти немного дальше и переименовать его (в отношении его всегда солнечно в Филадельфии): Mazekroller.

import cmd                                                                                                                                                                                                   

class MazeKroller(cmd.Cmd):
    """Interface for walking through the maze

    https://coding-challanges.herokuapp.com/challanges/maze
    """                                                                                                                                                  

    intro = "Welcome to Maze shell. Type `?' or `help' to list commands.\n"
    prompt = '~ '  # Because it's a snake!

На данный момент у нас есть только один метод – это init. И мы должны реализовать остаток отдыха. Нам нужно быть в состоянии:

  • Создайте лабиринт С
  • перемещаться по нему
  • и подобрать монеты выиграть (на самом деле выйти из лабиринта). Также следует реализовать пару методов для удобства использования: Получить информацию и отдавайся Отказ Вот заглушки для него:
class MazeKroller(cmd.Cmd):
    """Interface for crawling through the maze

    https://coding-challanges.herokuapp.com/challanges/maze
    """
    intro = "Welcome to Maze shell. Type `?' or `help' to list commands.\n"
    prompt = "~ "

    def do_init(self, user, password):
        """Credentials for BasicHTTPAuth."""
        self.user = user
        self.password = password

    def do_create_maze(self, size):
        """Create a new maze.
        Now you have 3600 seconds to escape.

        POST /api/mazes\n"""

    def do_info(self, maze_id):
        """Get some general data about your maze

        GET - /api/mazes/{id}\n""" 

    def do_get_cells(self, maze_id):
        """See the cells around you.

        GET - /api/mazes/{id}/steps\n"""

    def do_get_coin(self):
        """Pick up a coin.

        POST - /api/mazes/{id}/coins\n"""

    def do_giveup(self):
        """Gives up the game.

        DELETE /api/mazes/{id}\n"""

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

MazeKroller().cmdloop()

Играть немного с ним и в следующем посте я предоставим вам реализацию этих методов.

Следите за обновлениями!

Оригинал: “https://dev.to/alexbender/solving-the-cretan-maze-1p7a”