Am terminat recent unul dintre proiectele mele de vară: un motor GUI de șah construit folosind Ren’Py Visual Novel Engine Development Engine si python-șah bibliotecă.

Acest motor va fi integrat într-un nou joc cinetic, Vântul în zori, la finalizarea jocului respectiv.

În această postare, aș dori să vă împărtășesc câteva învățături cheie, tehnice și non-tehnice, pe care le-am adunat de la împingerea acestui proiect de o persoană de la început până la sfârșit într-o lună.

Cum mi am construit proiectul cu o singura persoana un motor
Proiectul meu Chess Engine pe GitHub

Apreciați valoarea de rescriere a vechiului cod

Pentru proiectele CS la școală, rareori am ocazia sau experiența necesității de a revizui codul meu.

Cu toate acestea, acest lucru nu este cazul atunci când lucrez la proiectele mele de pasiune: îmi place să profitez de fiecare ocazie pentru a le îmbunătăți utilizabilitatea și reutilizarea în speranța că codul meu va fi de valoare pentru alți dezvoltatori.

Acest motor de șah se bazează pe un motor de șah pe care l-am creat în Ren’Py și vanilie Python în timp ce mă învățam pe Python în prima mea vacanță de vară la facultate.

Vechiul motor de șah se bazează, la rândul său, pe un proiect din colegiul meu Intro to CS class (un joc GUI de șah scris în Racket, un limbaj de programare funcțional). Adică, mi-am rescris codul de două ori pentru a produce acest motor de șah final.

Pentru prima mea rescriere, am „tradus” pur și simplu logica șahului (pentru a stabili dacă o mutare este legală, condițiile finale ale jocului și așa mai departe) de la Racket la Python. De asemenea, am experimentat cu programarea orientată pe obiecte, am scris un AI de șah minimax în urma tutorialelor online și am implementat GUI în Ren’Py.

Din moment ce știam doar elementele de bază ale șahului și îmi scriau logica șahului conform specificațiilor de notare a proiectului meu școlar, primul meu motor de șah nu suporta mișcări speciale, cum ar fi en passant, castling sau promovare.

Pentru a aborda această problemă în a doua mea rescriere, am cercetat bibliotecile Python open-source și am găsit python-șah, o bibliotecă cu suport complet pentru mișcările de șah și condițiile de finalizare a jocului, cum ar fi revendicarea unei remize atunci când apare repetarea de trei ori.

În plus, s-a integrat și Batog uscat, un AI de șah, iar această integrare va permite motorului meu de șah să configureze puterea AI de șah.

Aceste două caracteristici au adăugat o mare valoare motorului meu de șah versiunea 2.0 și mi-au permis să mă concentrez asupra aspectelor mai importante ale rescrierii mele, pe care le voi descrie mai jos.

Citiți documentația și țineți cont de compatibilitate

A devenit obișnuința mea să parcurg documentația bibliotecilor de care am nevoie pentru proiectul meu înainte de a intra în design și cod. Acest lucru mă ajută să evaluez orice problemă cu dependență și compatibilitate care ar putea apărea.

Acest număr Ren’Py GitHub subliniază faptul că Ren’Py folosește Python 2 și nu a fost încă portat la Python 3. Așa că am recunoscut că aveam nevoie de o versiune de șah python care să susțină Python 2, deoarece ultima versiune acceptă doar Python 3.7+.

Din fericire, versiunea 0.23.10 acceptă atât Python 2.7 cât și Python 3.4+. În cele din urmă m-am stabilit pe versiunea 0.23.11, deoarece este ultima versiune care acceptă în continuare Python 2.7.

După ce am rezolvat problemele de dependență și compatibilitate, am fost gata să trec la proiectare și codificare.

Urmați cele mai bune practici de inginerie software

Notă: O mulțime de termeni menționați în această secțiune provin din Agil / Scrum.

Adunați cerințele de caracteristică pentru proiectarea proiectului

Deși este tentant să sar direct în codificare, nu pot sublinia suficient importanța designului.

Gândiți-vă la proiectare ca la o foaie de parcurs de nivel înalt care delimitează în mod clar punctul de plecare, etapele și punctele finale ale proiectului. Acest lucru le permite dezvoltatorilor să se refere la detaliile complexe de implementare atunci când se află până la nivelul taliei.

Acest lucru este deosebit de important pentru proiectele extracurriculare, deoarece acestea nu au de obicei o specificație detaliată, extrem de tehnică, în timp ce majoritatea proiectelor școlare au.

Pentru motorul meu de șah, am identificat următoarele rescrieri / caracteristici suplimentare:

  • Integrați logica șahului din python-șah
  • În codul meu GUI Ren’Py, înlocuiți logica șahului și AI de șah pe care le-am scris cu logica șahului și API-urile Stockfish din python-șah
  • Suportă diferite moduri de joc: Jucător vs. Jucător, Jucător vs. Calculator (unde Jucătorul poate alege să joace ca negru sau alb), puterea reglabilă a șahului AI prin ajustări la parametrii de configurare ai Stockfish
  • Elaborați un GUI Ren’Py pentru promovarea amanetului
  • Elaborați un GUI Ren’Py pentru a revendica o remiză în cazul repetării de trei ori sau a regulii de cincizeci de mutări

Elaborați un prototip de dovadă a conceptului

Un prototip de dovadă a conceptului (POC) mă ajută să evaluez timpul și efortul necesar implementării caracteristicilor necesare.

Pentru motorul meu de șah POC, am integrat șahul python cu codul meu original GUI Ren’Py. M-am asigurat că setul său de caracteristici este minim, dar ușor extensibil:

  • Am integrat șahul python cu codul meu original Ren’Py GUI și am putut muta piese
  • Am implementat Player vs. Player doar pentru a amâna integrarea Stockfish pentru AI de șah
  • Am permis mutări fără promovare, astfel încât să amân dezvoltarea dezvoltării interfeței grafice pentru promovarea amanetului

Identificați definiția proiectului de gata și definiția gata

Definiția proiectului meu Ready (DoR) rezultă în mod natural din ancheta mea inițială despre compatibilitatea versiunii de bibliotecă și POC-ul meu.

În paralel, Definiția finalizată a proiectului meu (DoD) rezultă din cerințele de caracteristică pe care le-am identificat din faza de proiectare.

Oferiți un produs minim viabil sau, mai bine spus, un produs minim adorabil

1611966067 970 Cum mi am construit proiectul cu o singura persoana un motor
UI de promovare

Când eram în faza de proiectare, am știut că există o mulțime de obiective întinse în proiectul meu – poate chiar mai mult decât aș putea realiza vreodată.

Așadar, a fost important pentru mine să implementez setul foarte de bază de caracteristici necesare, să livrez un produs minim viabil (MVP) și să adun feedback pentru a itera pe acesta.

Mai bine, aș dori să livrez un produs minim adorabil (MLP) la prima mea iterație. Diferența de minut este că, în timp ce un MVP nu necesită altceva decât caracteristici funcționale, un MLP are o experiență de utilizator plăcută prin design.

De exemplu, pentru a implementa mișcări de promovare a pionului, pentru un MVP aș putea cere utilizatorilor să apese diferite taste pentru a selecta tipul de piesă la care doresc să promoveze (cum ar fi B pentru episcop și K pentru cavaler).

Pentru un MLP, aș implementa o interfață cu butoane în formă de piesă, care schimbă culorile atunci când sunt deplasate sau selectate.

Fii propriul tău manager de proiect

Dacă vi se pare copleșitor să țineți evidența listei de caracteristici (plus lista în continuă creștere de bug-uri și remedieri), nu sunteți singur. Este timpul să fii propriul tău manager de proiect.

am găsit Trello să fii un instrument uimitor atât pentru proiecte cu o singură persoană, cât și pentru proiecte de echipă mare.

Acesta este modul în care îmi organizez de obicei placa Trello pentru un proiect de codare:

Cum mi am construit proiectul cu o singura persoana un motor
Tabloul Trello pentru proiectul My Chess Engine

Aveți patru liste: Restante (pentru caracteristici care trebuie triate), A FACE, Face, și Terminat.

Au etichete codificate prin culori:

  • Gata pentru QA: O etichetă roșie pentru a atrage atenția coechipierilor mei
  • Impact: scăzut (galben) vs. mare (portocaliu), determinat de impactul pe care îl va genera o caracteristică sau o remediere a erorilor. De exemplu, un panou UI ușor nealiniat are un impact redus, în cazul în care un bug care se blochează în mod determinist are un impact mare.
  • O estimare a timpului necesar implementării: trivial (<1 oră, teal), mediu (1-2 ore, albastru deschis) și dificil (2-4 ore, albastru închis).
    Cealaltă regulă a mea este, dacă estimez că o carte va dura mai mult de 4 ore până la implementare, probabil că ar trebui să o împărțesc în mai multe cărți mai fine.
  • Culoarea servește ca un indiciu vizual extraordinar: abordez întotdeauna cărțile cu etichete portocalii și teal (impact ridicat și angajament de timp redus) înainte de a aborda pe cele cu etichete galbene și dificile (impact redus, dar angajament de timp ridicat).

Scrie documentație și reflectează asupra învățării tale

După ce am împins fiecare carte Trello de la TODO la Doing to Done și am remediat fiecare bug urât, este în sfârșit timpul să anunțăm un proiect? Da și nu.

Pentru a-mi maximiza învățarea dintr-un proiect, consider că merită extrem de mult să reflectez la abilitățile mele tehnice sau tehnice:

  1. Scrieți un README clar și concis în depozitul de proiecte GitHub. Acest lucru îi ajută pe alți dezvoltatori să înțeleagă și să devină interesați de proiect.
  2. Scrieți o postare pe blog (cum ar fi cea pe care o scriu acum) despre aspectele de nivel superior, de exemplu, prezentarea generală a arhitecturii, designul caracteristicilor, provocările și soluțiile etc.
1611966067 612 Cum mi am construit proiectul cu o singura persoana un motor
Secțiunea mea README despre integrarea motorului meu de șah în alte proiecte de joc
1611966067 108 Cum mi am construit proiectul cu o singura persoana un motor
Secțiunea mea README Comparând cele două versiuni ale motorului meu de șah

Multe mulțumiri lui Tim Min pentru că m-au îndemnat să lucrez la acest proiect, pentru contribuțiile sale (noi idei de caracteristici + QA) la tabloul Trello și pentru că m-au tras la răspundere. Tim este scriitorul jocului roman cinetic, Vântul în zori.

Să rămânem în legătură! Conectează-te cu mine pe LinkedIn, GitHub, Mediu, sau verificați site-ul meu personal.