Kako sam izgradio svoj projekt za jednu osobu: šahovski motor za popularnu igru ​​Dev Engine

Nedavno sam završio jedan od svojih ljetnih projekata: šahovski GUI motor izrađen pomoću Ren'Py Visual Novel Game Development Enginea i python-šahovske knjižnice.

Ovaj će motor biti integriran u kinetičku novu igru The Wind at Dawn , po završetku te igre.

U ovom postu želio bih podijeliti neka ključna učenja, tehnička i netehnička, koja sam prikupio gurajući ovaj projekt jedne osobe od početka do kraja za mjesec dana.

Cijenite vrijednost prepisivanja starog koda

Za CS projekte u školi rijetko imam priliku ili iskustvo da moram ponovno posjetiti svoj kôd.

Međutim, to nije slučaj kada radim na svojim strastvenim projektima: volim iskoristiti svaku priliku da poboljšam njihovu iskoristivost i ponovnu upotrebu u nadi da će moj kôd biti vrijedan za druge programere.

Ovaj šahovski motor temelji se na šahovskom stroju koji sam stvorio u Ren'Pyu i vanilin Pythonu dok sam predavao sebe Pythonu tijekom moje prve ljetne pauze na fakultetu.

Taj se stari šahovski motor, pak, temelji na projektu iz mog koledža Intro to CS class (šahovska GUI igra napisana u Racketu, funkcionalnom programskom jeziku). To će reći, dvaput sam prepisivao svoj kod kako bih proizveo ovaj posljednji šahovski motor.

Za svoje prvo prepisivanje, jednostavno sam "preveo" šahovsku logiku (za utvrđivanje je li potez legalan, uvjeti završne igre itd.) S Reketa na Python. Također sam eksperimentirao s objektno orijentiranim programiranjem, napisao minimax šahovski AI nakon mrežnih vodiča i implementirao GUI u Ren'Py.

Budući da sam poznavao samo osnovne temelje šaha i napisao sam svoju šahovsku logiku prema školskom projektu ocjenjivanja, moj prvi šahovski motor nije podržavao posebne poteze poput en passant, kastelinga ili promocije.

Da bih se pozabavio tim problemom u svom drugom prepisivanju, istražio sam Python biblioteke s otvorenim kodom i pronašao python-chess, knjižnicu s punom podrškom za šahovske poteze i uvjete završnice, poput zahtjeva za izvlačenjem kada se dogodi trostruko ponavljanje.

Povrh toga, također je integrirao Stockfish, šahovski AI, i ta će integracija omogućiti mom šahovskom stroju da konfigurira snagu šahovskog AI.

Ove dvije značajke dodale su veliku vrijednost mom šahovskom motoru verzije 2.0 i omogućile mi da se usredotočim na važnije aspekte mog prepisivanja, koje ću opisati u nastavku.

Pročitajte dokumentaciju i imajte na umu kompatibilnost

Postala mi je navika pregledavati dokumentaciju knjižnica koja mi treba za moj projekt prije nego što uskočim u dizajn i kod. To mi pomaže procijeniti bilo koji problem s ovisnošću i kompatibilnošću koji bi se mogao pojaviti.

Ovo izdanje Ren'Py GitHub ukazuje na činjenicu da Ren'Py koristi Python 2 i još nije prebačen na Python 3. Stoga sam prepoznao da mi treba verzija python-šaha koja podržava Python 2, kao samo najnovija verzija podržava Python 3.7+.

Srećom, verzija 0.23.10 podržava i Python 2.7 i Python 3.4+. Na kraju sam se odlučio za verziju 0.23.11 jer je to zadnja verzija koja i dalje podržava Python 2.7.

Nakon što sam sredio probleme ovisnosti i kompatibilnosti, bio sam spreman prijeći na dizajn i kodiranje.

Slijedite najbolje primjere iz prakse softverskog inženjerstva

Napomena: Mnogo pojmova spomenutih u ovom odjeljku potječu od Agile / Scrum.

Prikupite značajke značajke za dizajn projekata

Iako je primamljivo uskočiti izravno u kodiranje, ne mogu dovoljno naglasiti važnost dizajna.

Zamislite dizajn kao putokaz na visokoj razini koji jasno ocrtava početnu točku, prekretnice i završne točke projekta. To razvojnim programerima omogućuje upućivanje na detalje u složenim detaljima implementacije.

To je posebno važno za izvannastavne projekte jer oni obično nemaju detaljne, visokotehničke specifikacije, dok većina školskih projekata to ima.

Za svoj šahovski motor prepoznao sam sljedeće prepravke / dodatne značajke:

  • Integrirajte šahovsku logiku iz python-šaha
  • U svom Ren'Py GUI kodu zamijenite šahovsku logiku i šahovsku AI koju sam napisao šahovskom logikom i Stockfish API-jem iz python-chess
  • Podržava razne načine igranja: igrač protiv igrača, igrač protiv računala (gdje igrač može odabrati igrati crno ili bijelo), podesiva snaga šahovskog inteligencije prilagodbama konfiguracijskih parametara Stockfish-a
  • Razviti Ren'Py GUI za promociju pijuna
  • Razviti Ren'Py GUI za polaganje prava na remi u slučaju trostrukog ponavljanja ili pravila pedeset poteza

Razviti dokaz prototipa koncepta

Prototip Proof of Concept (POC) pomaže mi da izmjerim vrijeme i napor potrebne za implementaciju potrebnih značajki.

Za svoj šahovski motor POC integrirao sam pitonski šah sa svojim originalnim Ren'Py GUI kodom. Pobrinuo sam se da njegov skup značajki bude minimalan, ali lako proširiv:

  • Integrirao sam python-šah sa svojim originalnim Ren'Py GUI kodom i mogao sam premještati figure
  • Primijenio sam samo Player vs. Player kako bih odgodio integriranje Stockfish-a za šahovski AI
  • Dopustio sam samo nepromovirajuće poteze kako bih odgodio razvoj GUI-a za promociju pijuna

Utvrdite definiciju projekta spremno i definiciju gotovog

Definicija spremnosti (DoR) mog projekta prirodno slijedi iz mog početnog istraživanja o kompatibilnosti verzije knjižnice i mog POC-a.

Paralelno s tim, definicija mog projekta (DoD) slijedi iz zahtjeva za značajkama koje sam identificirao u fazi dizajniranja.

Dostavite najmanje održiv proizvod, ili još bolje, minimalni proizvod koji vam se sviđa

Kad sam bio u fazi dizajniranja i sakupljao zahtjeve, znao sam da moj projekt ima puno nategnutih ciljeva - možda čak i više nego što sam ikad mogao postići.

Stoga mi je bilo važno implementirati vrlo osnovni skup potrebnih značajki, isporučiti minimalno održivi proizvod (MVP) i prikupiti povratne informacije kako bih ga ponovio.

Još bolje, želio bih na svojoj prvoj iteraciji dostaviti Minimum Lovable Product (MLP). Minuta je razlika u tome što iako MVP ne zahtijeva ništa više od funkcionalnih značajki, MLP po svom dizajnu ima simpatično korisničko iskustvo.

Na primjer, za provedbu poteza za promociju pješaka, za MVP-a bih mogao zatražiti od korisnika da pritisnu različite tipke za odabir vrste djela u koji žele promovirati (poput B za biskupa i K za viteza).

Za MLP implementirao bih korisničko sučelje s tipkama u obliku komada koje mijenjaju boju kad se zadrže ili odaberu.

Budite vlastiti voditelj projekta

Ako smatrate da je praćenje popisa značajki (plus stalno rastući popis programskih pogrešaka i popravaka) neodoljivo, niste sami. Vrijeme je da postanete vlastiti voditelj projekta.

Smatrao sam da je Trello nevjerojatan alat kako za projekte s jednom osobom, tako i za projekte s velikim timom.

Evo kako obično organiziram svoju Trello ploču za kodiranje:

Imati četiri popisa: Zaostatak (za značajke koje će se trijažirati), TODO , Doing i Gotovo.

Imaju oznake u boji:

  • Spreman za QA: Crvena etiketa za privlačenje pažnje mojih suigrača
  • Učinak: nizak (žuti) u odnosu na visoki (narančasti), određen količinom utjecaja koji će značajka ili ispravak programske pogreške generirati. Na primjer, malo neusklađena ploča korisničkog sučelja slabog je utjecaja tamo gdje je deterministički rušiva buga snažna.
  • Procjena vremena koje će biti potrebno za provedbu: trivijalno (<1 sat, teal), srednje (1-2 sata, svijetloplavo) i teško (2-4 sata, tamnoplavo).

    Moje drugo osnovno pravilo je da, ako pretpostavim da će kartici trebati više od 4 sata da je implementiram, vjerojatno bih je trebao rastaviti na nekoliko sitnozrnatih karata.

  • Boja služi kao izvrstan vizualni znak: Uvijek se borim s kartama s narančastim i teal oznakama (snažan udarac i kraća vremenska obveza) prije nego što se borim s onima sa žutim i teškim oznakama (slab utjecaj, ali dugotrajna obveza).

Napišite dokumentaciju i razmislite o svom učenju

Nakon što smo prebacili svaku pojedinu Trello karticu s TODO na Doing to Done i ispravili svaku gadnu grešku, je li konačno vrijeme da se projekt pozove? Da i ne.

Kako bih maksimalizirao svoje učenje iz projekta, neizmjerno mi se isplati razmisliti o svojim mogućnostima za poneti, tehničkim ili soft vještinama:

  1. Napišite jasan, sažet README u spremište projekata GitHub. To pomaže ostalim programerima da razumiju i zainteresiraju se za projekt.
  2. Napišite članak na blogu (poput ovog koji sada pišem) o aspektima više razine, na primjer, pregledu arhitekture, dizajnu značajki, izazovima i rješenjima itd.

Zasluge i veze

Veliko hvala Timu Minu što me ponukao da radim na ovom projektu, za njegove doprinose (ideje za nove značajke + QA) na ploči Trello i što me pozvao na odgovornost. Tim je pisac kinetičke igre romana Vjetar u zoru .

  • Moje spremište GitHub šahovskog stroja
  • Javna Trello ploča za ovaj projekt šahovskog motora
  • Ren'Py: Vizualni motor za razvoj igara
  • python-chess: čista Python šahovnica

Ostanimo u kontaktu! Povežite se sa mnom na LinkedIn-u, GitHub-u, Mediumu ili pogledajte moju osobnu web stranicu.