Как изградих своя индивидуален проект: шахматна машина за популярна игра Dev Engine

Наскоро завърших един от летните си проекти: шахматен графичен интерфейс, създаден с помощта на Ren'Py Visual Novel Game Engine Engine и библиотеката на python-chess.

Този двигател ще бъде интегриран в кинетична нова игра, The Wind at Dawn , при завършването на тази игра.

В тази публикация бих искал да споделя някои ключови знания, технически и нетехнически, които събрах от натискането на този проект от един човек от началото до края след месец.

Оценявайте стойността на пренаписването на стария код

За CS проекти в училище рядко имам възможност или опит да преразгледам кода си.

Това обаче не е така, когато работя по моите страстни проекти: Обичам да се възползвам от всяка възможност да подобря тяхната използваемост и многократна употреба с надеждата, че моят код ще бъде от полза за други разработчици.

Този шахматен двигател се основава на шахматен двигател, който създадох в Ren'Py и ванилия Python, докато преподавах себе си на Python по време на първата ми лятна почивка в колежа.

Този стар шахматен двигател от своя страна се основава на проект в моя колеж Intro to CS class (шахматна GUI игра, написана на Racket, функционален език за програмиране). Тоест, два пъти пренаписвах кода си, за да създам този последен шахматен двигател.

За първото ми пренаписване просто „преведох“ шахматната логика (за определяне дали ходът е легален, условията на крайната игра и т.н.) от Racket на Python. Също така експериментирах с обектно-ориентирано програмиране, написах минимакс AI шах след онлайн уроци и внедрих GUI в Ren'Py.

Тъй като знаех само самите основи на шаха и написах своята шахматна логика според моя училищен проект, оценявайки спецификациите, първият ми шахматен двигател не поддържаше специални ходове като en passant, рокада или повишение.

За да отговоря на този проблем при второто ми пренаписване, проучих Python библиотеки с отворен код и открих python-chess, библиотека с пълна поддръжка за шахматни ходове и условия на крайната игра, като заявяване на равенство при трикратно повторение.

На всичкото отгоре, той също така е интегрирал Stockfish, шахматен AI, и тази интеграция ще позволи на моя шахматен двигател да конфигурира силата на AI шах.

Тези две функции добавиха голяма стойност към моята шахматна версия 2.0 и ми позволиха да се съсредоточа върху по-важните аспекти на моето пренаписване, които ще опиша по-долу.

Прочетете документацията и запазете съвместимостта предвид

Стана ми навик да преглеждам документацията на библиотеките, която ми е необходима за моя проект, преди да вляза в дизайна и кода. Това ми помага да оценя всеки проблем със зависимост и съвместимост, които могат да възникнат.

Този проблем с Ren'Py GitHub сочи към факта, че Ren'Py използва Python 2 и все още не е пренесен в Python 3. Така че осъзнах, че имам нужда от версия на python-chess, която поддържа Python 2, като само последната версия поддържа Python 3.7+.

За щастие, версия 0.23.10 поддържа както Python 2.7, така и Python 3.4+. В крайна сметка се спрях на версия 0.23.11, тъй като тя е последната версия, която все още поддържа Python 2.7.

След като подредих проблемите със зависимостта и съвместимостта, бях готов да премина към проектиране и кодиране.

Следвайте най-добрите практики за софтуерно инженерство

Забележка: Много термини, споменати в този раздел, са от Agile / Scrum.

Съберете изискванията към характеристиките за проектиране на проекти

Въпреки че е изкушаващо да се впуснете направо в кодирането, не мога да подчертая достатъчно важността на дизайна.

Мислете за дизайна като пътна карта на високо ниво, която ясно очертава началната точка, етапите и крайните точки на проекта. Това позволява на разработчиците да се позовават, когато са до кръста в сложни подробности за изпълнението.

Това е особено важно за извънкласните проекти, тъй като те обикновено нямат подробни, високотехнически спецификации, докато повечето училищни проекти имат.

За моя шахматен двигател идентифицирах следните пренаписвания / допълнителни функции:

  • Интегрирайте шахматната логика от python-chess
  • В моя Ren'Py GUI код заменете шахматната логика и шахматния AI, който написах, с шахматната логика и API на Stockfish от python-chess
  • Поддържа различни режими на игра: Играч срещу Играч, Играч срещу Компютър (където Играчът може да избере да играе като черно или бяло), регулируема сила на шахматния ИИ чрез корекции на конфигурационните параметри на Stockfish
  • Разработете Ren'Py GUI за промоция на пешките
  • Разработете Ren'Py GUI за заявяване на равенство в случай на трикратно повторение или правилото за петдесет хода

Разработване на доказателство за концепция прототип

Прототипът на Proof of Concept (POC) ми помага да преценя времето и усилията, необходими за внедряване на необходимите функции.

За моя шахматен двигател POC, аз интегрирах python-chess с моя оригинален Ren'Py GUI код. Уверих се, че наборът от функции е минимален, но лесно разширяем:

  • Интегрирах python-chess с оригиналния си Ren'Py GUI код и успях да премествам фигури наоколо
  • Приложих само Player срещу Player, за да отложа интегрирането на Stockfish за шах AI
  • Разреших само непромоционални ходове, за да отложа разработването на GUI за промоция на пешките

Определете дефиницията на проекта за готовност и дефиницията за свършено

Определението на готовността на моя проект (DoR) естествено произтича от първоначалното ми проучване относно съвместимостта на версиите на библиотеката и моя POC.

Успоредно с това определението за готовност на моя проект (DoD) следва от изискванията за функции, които определих от фазата на проектиране.

Доставете минимално жизнеспособен продукт, или още по-добре, минимален привлекателен продукт

Когато бях във фаза на проектиране, събирайки изисквания, знаех, че има много разтегнати цели в моя проект - може би дори повече, отколкото някога бих могъл да постигна.

Така че за мен беше важно да приложа съвсем основния набор от необходими функции, да доставя минимално жизнеспособен продукт (MVP) и да събера обратна връзка, за да го повторя.

Още по-добре, бих искал да доставя минимално привлекателен продукт (MLP) при първата ми итерация. Малката разлика е, че докато MVP не изисква нищо повече от функционални функции, MLP има симпатичен потребителски опит по дизайн.

Например, за да приложа ходове за промоция на пионки, за MVP бих могъл да помоля потребителите да натискат различни клавиши, за да изберат типа на фигурата, към която искат да промотират (като B за епископ и K за рицар).

За MLP бих внедрил потребителски интерфейс с бутони с форма на парче, които променят цветовете, когато се навеждат или избират.

Бъдете собствени мениджъри на проекти

Ако откриете, че проследяването на списъка с функции (плюс непрекъснато нарастващия списък с грешки и поправки) е огромно, не сте сами. Време е да бъдете свой собствен ръководител на проекти.

Открих, че Trello е невероятен инструмент както за проекти за едно лице, така и за проекти с голям екип.

Ето как обикновено организирам дъската си Trello за проект за кодиране:

Имате четири списъка: Натрупване (за функции, които трябва да бъдат използвани), TODO , Doing и Done

Имате етикети с цветен код:

  • Готов за QA: Червен етикет, за да привлече вниманието на съотборниците ми
  • Въздействие: ниско (жълто) срещу високо (оранжево), определено от степента на въздействие, което ще генерира функция или корекция на грешка. Например, леко неправилно подравнен панел на потребителския интерфейс има слабо въздействие, когато детерминирано сриваща грешка е с голямо въздействие.
  • Оценка на времето, необходимо за изпълнението: тривиално (<1 час, тийл), средно (1-2 часа, светло синьо) и трудно (2–4 часа, тъмно синьо).

    Другото ми правило е, че ако преценя, че дадена карта ще отнеме повече от 4 часа, вероятно ще трябва да я разбия на няколко по-фини карти.

  • Цветът служи като чудесна визуална реплика: Винаги се справям с карти с оранжеви и тигъл етикети (силно въздействие и ангажираност с малко време), преди да се справя с тези с жълти и трудни етикети (слабо въздействие, но ангажиране с голямо време).

Напишете документация и размислете върху своето обучение

След като избутахте всяка една карта на Trello от TODO на Doing to Done и поправихте всяка неприятна грешка, най-накрая ли е време да извикате готов проект? Да и не.

За да максимизирам своето обучение от даден проект, ми се струва изключително полезно да разсъждавам върху моите заведения, технически или меки умения:

  1. Напишете ясен, кратък README в хранилището на проекти на GitHub. Това помага на други разработчици да разберат и да се заинтересуват от проекта.
  2. Напишете публикация в блог (като тази, която пиша сега) за аспектите на по-високо ниво, например, общ преглед на архитектурата, дизайн на функции, предизвикателства и решения и т.н.

Кредити и връзки

Много благодаря на Тим Мин, че ме подтикна да работя по този проект, за неговия принос (идеи за нови функции + QA) в борда на Trello и за това, че ме държи отговорен. Тим е автор на кинетичната роман игра „Вятърът в зората“ .

  • Моето хранилище за шахмат GitHub
  • Публичната дъска на Trello за този проект за шахматни двигатели
  • Ren'Py: Визуален роман за разработка на игри
  • python-chess: чиста библиотека за шах на Python

Нека поддържаме връзка! Свържете се с мен в LinkedIn, GitHub, Medium или разгледайте моя личен уебсайт.