Недавно 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”