Găsiți aici un link de Google Drive pentru versiunea de Windows, iar aici un link pentru versiunea de Linux a aplicației Sireum, dezvoltată de mine după un concept propriu – primul meu joc. Am pus în arhivă atît versiunea de distribuție, executabilă, cît și codul sursă, împreună cu fișierele necesare pentru a reconstitui distribuția creată de mine. În fișierul requirements.txt se găsesc modulele de Python folosite în scriptul meu, iar fișierul Sireum.spec este destinat a fi utilizat împreună cu pyinstaller pentru a genera distribuția creată de mine. Am folosit Python 3.9.5 și pyinstaller 4.7, deoarece cu o versiune mai nouă de Python nu funcționa comanda -w a pyinstaller prin care faci să nu apară fereastra de consolă sub Windows.
Pentru a porni aplicația în Windows trebuie să rulați fișierul Sireum.exe aflat în folderul Sireum, după ce dezarhivați fișierul Sireum.dist. Pentru linuxari nu cred că este nevoie să ofer explicații. 🙂
Pe virustotal.com distribuția mea a dat cîteva fals pozitive, dacă vreți să verificați onestitatea mea puteți să vă creați propria distribuție pornind de la scriptul sursă, aveți la dispoziție toate cele necesare. Veți obține exact aceleași fals pozitive pe virustotal.com. Dacă nu aveți timp sau chef să faceți propria distribuție și să mă verificați, vă rog frumos să mă credeți pe cuvînt – nu v-am dat un virus sau un malware.
Ar fi ideal dacă ați avea aplicația Sireum deschisă în momentul în care citiți aceste rînduri. Jocul este local, hotseat, și se controlează exclusiv cu mouse-ul.
Aș vrea să postez aici un link către aplicația mea aflată pe ceva site de jocuri indie, iar distribuția jocului meu să fie frumos acoperită de mai știu eu ce licență open source gnuștiucum. Nu mai am energie să mă ocup de așa ceva, orice chestiune administrativă, ce nu ține strict de funcționalitatea aplicației dezvoltate de mine, mă lasă perfect indiferent în acest moment. Tot ce pot să fac este să vă rog să nu modificați codul aplicației Sireum fără a obține în prealabil acordul meu. De distribuit, îl puteți distribui după cum doriți – mi-ar fi util și trebuie să vă mulțumesc pentru asta – dar menționați întotdeauna atît pe autorul codului, cît și pe cel al jocului, anume Marius-Mihai Ghinea. Adică al nuștiucîtelea Mihai de la Level.
De-a lungul timpului în care am scris despre jocuri create de alții, pivnițele minții mele au învechit cu relativă rodnicie ideea de a face jocuri, la rîndul meu. De altfel, în ultimii ani de Level, începuse a mă roade bine de tot această nevoie, dar de apucat, propriu-zis, de munca necesară, nu am început decît după ce iubita noastră revistă de jocuri a trecut în supraființă. Dat fiind că habar nu aveam de programare (în afară de ceva Pascal și LISP de pe vremea celor doi ani de facultate pe care m-am învrednicit să-i termin), m-am apucat de învățat și lucrat pe cont propriu. Am creat o aplicație destul de complexă, multiplayer cu client-server și o bază de date în mySQL pentru gestiunea jucătorilor și a statisticilor acestora, dar lucrurile, din naivitatea ignorantului începător, erau prea mari pentru un buget inexistent, așa că am fost nevoit să abandonez proiectul cu numai vreo 3 luni înainte de finalizarea lui. Lucrul ăsta încă mă bîntuie, cu atît mai mult cu cît partea de server a fost realizată de un prieten mai mult decît binevoitor, căruia i-am rămas dator.
Jocul pe care îl creasem mi-a lăsat, totuși, ancore în minte, iar acum, ajuns la capătul multor lucruri, între care includ bugetul, am reușit să mai adun atîta energie și determinare cît să fac o nouă aplicație, dedicată unui joc derivat din acel prim joc abandonat, din care se trage ca un subset restrîns de reguli. Am considerat necesar să abordez un limbaj de programare mai flexibil și mai potrivit portabilității și extinderii, care să-mi fie de folos și dacă, cine știe, oi ajunge cumva să-mi găsesc de lucru – deși CV-ul meu pare a fi unul de ciumat, atît de exotic încît nu corespunde niciunei cerințe din anunțurile de angajări publicate pe diversele pagini dedicate celor care caută să-și cîștige traiul…
Așa că, în ultimele două săptămîni ale lui august, m-am apucat să învăț Python, limbaj complet nou pentru mine. La începutul lui septembrie am pornit a scrie aplicația, descoperind, pe această cale, în continuare, limbajul Python și modulele acestuia. Planul meu era ca într-o lună să termin funcționalitatea aplicației, iar în octombrie să mă ocup de finisajul vizual, de partea de grafică. Bineînțeles, lucrurile nu au mers după cum am plănuit, astfel că am reușit abia acum cîteva zile să termin funcționalitatea completă (mă rog, mai am un „Ok” de pus text la un buton), motiv pentru care grafica a rămas în versiunea „de șantier”, în care culorile sînt alese la repezeală, în așa fel încît să facă contrast cît mai mare și să fie ușor de ținut minte (as in (255, 0, 0)). Fie vorba între noi, nici partea de fonturi nu am șlefuit-o, inadecvarea fontului fără antialiasing folosit în aplicație fiind oarecum evidentă. Ba, mai mult, în momentul în care scriu aceste rînduri încă nu știu dacă vă voi putea pune la dispoziție o distribuție cu arhiva aplicației mele, sau dacă vă voi ruga frumos, cu ochii umezi, să rulați scriptul „*.py” în Linux și în Windows din linia de comandă, ca niște vajnici ce sînteți. Dar sînt nevoit să public acum, indiferent de stadiul dezvoltării aplicației, pentru că timpul este doar unul dintre cele multe pe care nu le mai am.
[Update 1] Cu prețul unei întîrzieri semnificative a publicării aplicației și articolelor aferente, am pus antialiasing la fonturi și am reușit să dau o față prezentabilă aplicației. Acum învăț cum să o fac fișier executabil.
[Update 2] Am reușit să fac aplicația executabilă și am creat o distribuție sub forma unui folder ce conține toate cele necesare. Am învățat și cum să fac în așa fel încît aplicația să aibă iconiță care să apară peste tot unde trebuie – ceva ce mi-a luat timp, așa că am mai întîrziat un pic.
[Update 3] După ce am realizat un studiu extensiv pe un focus grup semnificativ din punct de vedere statistic, alcătuit din jumătatea mea, am aflat că este o problemă cu piesele colorate în roșu și albastru. Se pare că se realizează un contrast neplăcut, astfel că m-am văzut nevoit să modific culorile, revenind la combinația clasică de negru cu alb, în care albastrul și roșul rămîn reprezentate prin simbolul Taegeuk, aflat pe piesa Om. Această problemă există, însă, numai pe ecranele monitoarelor, iar dacă jocul este realizat fizic, cu tablă de joc și piese reale, culorile trebuie să fie albastru și roșu. În situația în care piesele sînt realizate în culorile roșu și albastru nu mai este necesară prezența Taegeuk-ului pe piesa Om, deoarece simbolistica acestuia este implicit reprezentată de culorile albastru și roșu ale pieselor de joc. Dacă, totuși, se folosesc piese albe și negre de Go (/Baduk), piesa Om trebuie să fie tot în alb și negru, dar pe ea trebuie să se afle obligatoriu simbolul Taegeuk.
Un joc în două stiluri
Jocul, pe care sper că îl aveți în față acum într-o formă rulabilă sub Linux și Windows, este unul abstract, de strategie – cum sînt șahul, Go-ul sau „X și 0”. El abstractizează ceva existent în viața reală, un ceva de la care își trage și numele. Este vorba despre Ssireum, o formă de luptă coreeană tradițională, de care sînt foarte interesat. Gîndiți-vă că eu sînt unul dintre puținii români care regretă dispariția Sumo-ului de pe Eurosport, la care mă uitam în anii ‘90 fără să ratez vreo competiție – and then I found Ssireum… and here, too… Sport care mi se pare extrem de atractiv, inclusiv pornind de la premiza sa fundamentală: cei doi luptători au fiecare un fel de centură în jurul mijlocului și al unui picior, fiind obligați să facă o priză permanentă pe respectiva centură. Practic, oponenții sînt „legați” unul de celălalt prin acest element fundamental de regulament, ceea ce m-a izbit din prima secundă în care am văzut o luptă de Ssireum. Iar asta pentru că Ssireumul se potrivea uluitor de bine cu ceea ce aveam eu în minte, cu lucruri, imagini și concepte care mă urmăreau deja de zeci de ani.
De aici a pornit lucrul la Sireum, un titlu ce aduce un tribut civilizației coreene, modelînd pe o tablă de joc o luptă de Ssireum. Veți vedea, însă, că primul ecran al aplicației „Sireum” vă oferă două opțiuni: „Push” și „Flip”. Acestea sînt cele două stiluri de joc ale Sireumului, „împins” și „răsturnat”, ce au, fiecare, reguli proprii, reprezentînd, practic, două jocuri diferite, dar care pornesc de la premize similare și modelează, din două perspective distincte, același lucru – lupta de Ssireum.
Ideea este aceea că, dacă doi jucători vor să joace un meci de Sireum, pot să-l conceapă ca pe o serie de partide, în număr de 3 sau 5, spre exemplu, în care, alternativ, unul dintre jucători hotărăște ce stil de joc se va adopta în partida curentă – Push sau Flip – după cum simte că îi va fi mai avantajos, după cum se simte puternic într-unul dintre aceste stiluri, ori îl consideră mai slab pe oponent.
Stilul împins
Cred că este bine să încep prin a vă prezenta stilul Push de joc, după care, cînd vă voi vorbi despre stilul Flip, veți sesiza foarte ușor elementele comune celor două stiluri de Sireum, dar și diferențele dintre acestea.
În primul rînd, Sireum se joacă pe o tablă de joc pătrată, alcătuită dintr-un număr impar de linii orizontale și verticale. Veți găsi în al doilea ecran al aplicației variantele de table de joc disponibile, în funcție de numărul de linii verticale și orizontale – 5 pe 5, 7 pe 7, 9 pe 9 și 11 pe 11.
Înainte de începerea partidei, pe tabla de joc se așează aleator un număr egal de piese albe și negre, în așa fel încît singura poziție liberă de pe tabla de joc să rămînă cea din centrul acesteia, în care se așează piesa Om. La începutul jocului, în cazul stilului Push, piesa Om trebuie să expună laturile negre către cei doi jucători, aflați față în față, cu tabla de joc între ei.
În situația în care jucați Sireum fizic, pe o tablă de joc și cu piese reale, puteți obține dispunerea aleatorie a pieselor albe și negre (pe care le voi numi de acum încolo piesele colorate, deși albul și negrul nu sînt culori, dar mă gîndesc la albastru și roșu, pe care albul și negrul le înlocuiesc numai pe monitor; Sireum se joacă cu piesa Om și cu piesele colorate) pe tablă astfel: puneți toate piesele colorate într-un săculeț netransparent și extrageți cîte o piesă din săculeț, fără să o vedeți, la întîmplare, după care o așezați în prima poziție a primei linii orizontale, apoi pe a doua, pe a treia, pînă ocupați toate pozițiile liniei, moment în care treceți la linia următoare, și tot așa, pînă cînd ocupați toate pozițiile de pe tabla de joc, mai puțin pe cea centrală, rezervată piesei Om.
Priviți tabla de joc, înainte de a începe partida – aplicația a generat automat o configurație aleatorie a pieselor colorate și a amplasat corect piesa Om. Trebuie să înțelegeți un concept fundamental al jocului de Sireum, care îl distinge de orice alt joc abstract de strategie: jucătorii nu joacă cu roșul sau cu albastrul (cu „albele” sau cu „negrele”, precum în Go sau șah). Jucătorii nu dețin niciuna dintre piesele de culoare de pe tablă, nici piesa Om. Repet, nu există în Sireum jucător cu albastrul sau cu roșul, cu negrul sau cu albul. Iar asta se reflectă atît în felul în care se mută în Sireum, cît și în felul în care se cîștigă o partidă de Sireum.
Om
Singura piesă de pe tablă care este mișcată într-o partidă de Sireum este piesa Om. Ea este mutată alternativ de fiecare dintre cei doi jucători, în tura în care acestuia îi vine rîndul – primul jucător mută piesa Om în prima tură, al doilea în a doua și așa mai departe. Singura acțiune posibilă într-o tură de Sireum este deplasarea piesei Om sau rotirea piesei Om.
În stilul Push, piesa Om poate fi deplasată numai pe o poziție adiacentă ortogonal celei pe care o ocupă la începutul turului, cu condiția ca această poziție să fie ocupată de o piesă de aceeași culoare cu latura pe care piesa Om o expune către ea. Piesa colorată este luată de pe tabla de joc iar piesa Om este așezată în locul ei. După ce piesa Om se deplasează dintr-o poziție, poziția respectivă rămîne vacantă, goală. Piesa Om nu se poate deplasa pe o poziție vacantă. Detaliez aici și faptul că pozițiile adiacente ortogonal pe tabla de joc sînt cele aflate sus/jos și stînga/dreapta față de piesa Om, adică pozițiile aflate pe verticala sau orizontala tablei de joc.
Al doilea fel de acțiune posibil cu piesa Om este rotirea cu 90° a acesteia. Rotirea piesei Om este permisă exclusiv în situația în care există cel puțin o piesă adiacentă piesei Om în tura în care se execută rotirea, iar după executarea rotirii există cel puțin o poziție adiacentă piesei Om pe care aceasta poate fi deplasată. Nu se poate executa rotirea piesei Om dacă nu există cel puțin o piesă adiacentă acesteia în tura rotirii și dacă rotirea nu poate fi urmată de o deplasare a piesei Om în tura următoare.
În tura ce urmează unei rotiri a piesei Om nu se poate executa din nou rotirea piesei Om, ci numai deplasarea acesteia pe o poziție adiacentă. Cum ar veni, nu se poate executa rotirea piesei Om în două tururi consecutive. Rotirea piesei Om este considerată a fi o acțiune de inflexiune, o acțiune intermediară între două deplasări ale piesei Om. Nu poate exista o rotire a piesei Om fără ca aceasta să poată fi executată între două deplasări ale piesei Om. Din acest motiv o partidă nu poate avea ca ultimă mutare o rotire a piesei Om.
Într-o tură, un jucător poate executa numai o singură acțiune cu piesa Om, adică poate executa o deplasare a acesteia pe o poziție adiacentă sau o rotire a piesei Om.
No, apoi, acestea sînt regulile după care se desfășoară un tur al jocului de Sireum Push. Rămîne să vă spun și cum poate fi cîștigată o partidă de Sireum Push. Haios e faptul că este mai ușor de explicat cum se pierde o partidă de Sireum Push: pierzător este jucătorul care, în tura sa, are la dispoziție numai acțiuni ale piesei Om care închid jocul, adică numai acțiuni care aduc piesa Om pe o poziție de pe care aceasta nu mai poate fi mutată.
Spectacolul trebuie să continue
Există un principiu fundamental care trebuie respectat într-o tură de Sireum Push, anume principiul continuității. Principiul continuității spune că nu poate fi executată o acțiune care închide imediat jocul de Sireum, făcînd imposibilă orice mutare în turul următor, dacă există cel puțin încă o acțiune ce poate fi executată în turul curent ce permite continuarea jocului cu o mutare în turul următor. Cu alte cuvinte: jocul nu poate fi închis voluntar în turul curent dacă există o variantă de a-l continua, de a avea o mutare în turul următor. Jocul se încheie numai atunci cînd absolut toate acțiunile posibile într-un tur nu mai pot fi continuate într-un tur următor.
Pentru a înțelege foarte ușor logica criteriului de stabilire a jucătorului care pierde și a principiului continuității, gîndiți-vă la lupta de Ssireum. Aceasta încetează în momentul în care un luptător atinge solul cu orice parte a corpului aflată deasupra genunchiului. La această situație se ajunge numai atunci cînd unul dintre oponenți, învingătorul, nu îi mai oferă celuilalt altă posibilitate de mișcare decît către sol, prin diverse tehnici de împingere, răsturnare șamd. Niciun luptător cinstit nu se aruncă la sol ca să piardă confruntarea, fiecare face tot posibilul ca aceasta să continuie, dacă există cel puțin o manevră prin care poate asigura continuarea luptei. De aceea, ultima mutare posibilă din jocul de Sireum este echivalentul căderii în spațiul de luptă a celui care nu mai are altă variantă decît căderea, în pofida tuturor străduințelor sale din timpul desfășurării luptei. În jocul de Sireum învingătorul îi lasă celui care pierde numai posibilitatea de a executa acțiuni care duc la echivalentul căderii acestuia în lupta de Ssireum. Pierzătorul în jocul de Sireum este cel rămas fără alte opțiuni decît „căderea” simbolică în spațiul de luptă, pe tabla de joc.
Stilul răsturnat – faza primă
Acum că ați înțeles stilul Push de Sireum, este foarte ușor de explicat stilul Flip. În primul rînd, tabla de joc este la fel precum în Push, iar piesele colorate se așează exact în aceeași manieră. Singura diferență în ce privește piesele de joc o face piesa Om, care este albastră/neagră pe o parte și roșie/albă pe cealaltă. Piesa Om se așează întotdeauna cu partea albastră/neagră în sus la începutul unei partide de Sireum Flip.
Mutările în stilul Sireum Flip, sînt, însă, diferite de cele din stilul Push. În primul rînd, trebuie menționat faptul că un tur într-o partidă în stilul Flip este alcătuit din două faze. În prima fază, jucătorul aflat la mutare trebuie să acționeze asupra piesei Om, care poate fi deplasată sau răsturnată în prima fază a unui tur.
Piesa Om poate fi deplasată pe oricare poziție adiacentă pe care se află o piesă de aceeași culoare cu cea expusă de piesa Om. În stilul Flip nu există limitarea la deplasarea pe orizontală sau verticală a piesei Om, aceasta poate fi deplasată și diagonal, pe o poziție adiacentă. Evident, după ce piesa Om este deplasată, poziția ocupată anterior de către aceasta rămîne vacantă pînă la sfîrșitul jocului, întocmai precum în stilul Push.
Piesa Om poate fi răsturnată (de unde numele stilului – Flip), cu condiția respectării unei reguli similare cu cea de la rotirea din stilul Push. Răsturnarea piesei Om este permisă exclusiv în situația în care există cel puțin o piesă adiacentă piesei Om în tura în care se execută răsturnarea, iar după executarea răsturnării există cel puțin o poziție adiacentă piesei Om pe care aceasta poate fi deplasată. Nu se poate executa răsturnarea piesei Om dacă nu există cel puțin o piesă adiacentă acesteia în tura răsturnării și dacă răsturnarea nu poate fi urmată de o deplasare a piesei Om în tura următoare.
În tura ce urmează unei răsturnări a piesei Om nu se poate executa din nou răsturnarea piesei Om, ci numai deplasarea acesteia pe o poziție adiacentă. Cum ar veni, nu se poate executa răsturnarea piesei Om în două tururi consecutive. Răsturnarea piesei Om este considerată a fi o acțiune de inflexiune, o acțiune intermediară între două deplasări ale piesei Om. Nu poate exista o răsturnare a piesei Om fără ca aceasta să poată fi executată între două deplasări ale piesei Om. Din acest motiv o partidă nu poate avea ca ultimă mutare o răsturnare a piesei Om.
În prima fază a unui tur al unei partide de Sireum Flip, un jucător poate executa numai o singură acțiune cu piesa Om, adică poate executa o deplasare a acesteia pe o poziție adiacentă sau o răsturnare a piesei Om. Dacă într-un tur s-a executat o răsturnare a piesei Om, nu se mai ajunge la o a doua fază a turului, ci se trece direct la turul următor.
Răsturnat – a doua fază
Ce se întîmplă, însă, în a doua fază a unui tur de Sireum Flip? Un singur lucru: se ia o piesă colorată de pe tabla de joc. Atît. Există, însă, o regulă care stabilește ce piese pot fi luate de pe tabla de joc în a doua fază a unui tur de Sireum Flip.
Pentru a putea fi luată de pe tabla de joc în a doua fază a turului, o piesă trebuie să fie de culoare „opusă” piesei aflate pe poziția ocupată de piesa Om în prima fază a respectivului tur și să nu se afle pe o poziție adiacentă poziției pe care piesa Om se află la finalul primei faze a acelui tur. Astfel, dacă piesa Om a ocupat poziția unei piese albastre/negre în prima fază a turului, în a doua fază se poate lua de pe tabla de joc numai o piesă roșie/albă, dar care să nu se afle pe o poziție adiacentă celei ocupate de piesa Om la finalul fazei întîi a turului curent.
Pe lîngă această regulă simplă de stabilire a pieselor ce pot fi luate de pe tabla de joc în faza a doua a unui tur de Sireum Flip, este necesar să acopăr regulamentar și situațiile de joc ce țin de respectarea principiului continuității și a felului în care acesta se aplică în cazul unei partide de Sireum Flip.
Răsturnat, dar continuat
Și în jocul de Sireum Flip este valabil principiul continuității. Astfel, dacă într-un tur se pot executa acțiuni ce permit continuarea jocului, atunci nu este admisă executarea unor acțiuni ce nu ar permite continuarea jocului. Simplu. Dar, ce înseamnă exact acest lucru în stilul Flip de Sireum?
De fapt, ce înseamnă continuarea jocului după terminarea unui tur? Înseamnă faptul că în turul următor se poate deplasa piesa Om și lua o piesă de culoare opusă de pe tabla de joc. Sau că se poate executa o răsturnare a piesei Om, după care, în turul imediat următor răsturnării, se poate executa o deplasare a piesei Om și o luare a unei piese de culoare opusă de pe tabla de joc. Atît.
Dacă după un tur „x” nu se poate continua cu un tur „x + 1” în care se pot executa ambele faze ale turului, ori în care se poate executa o răsturnare a piesei Om, înseamnă că turul „x” nu are o continuare.
Acest principiu al continuității specific stilului Flip are repercusiuni și asupra pieselor ce pot fi selectate pentru a fi luate de pe tabla de joc în faza a doua a unui tur. Astfel, nu poate fi luată de pe tabla de joc acea piesă care ar duce la un conflict cu principiul continuității, adică acea piesă fără de care nu mai este posibilă continuarea jocului, atunci cînd există cel puțin o altă piesă ce poate fi luată de pe tabla de joc iar jocul poate continua după luarea aceleia.
În ce privește situația în care un jucător pierde o partidă de Sireum Flip, aceasta poate fi foarte simplu descrisă astfel: partida de Sireum Flip este pierdută de acel jucător în al cărui tur există numai variante de acțiuni care închid jocul. Să explic. Dat fiind principiul continuității, este cert că în fiecare tur se pot executa ambele faze ale turului sau o răsturnare a piesei Om. Ultimul tur al unui joc este cel în care, oricare ar fi acțiunile executate în cele două faze ale turului, nu mai este posibilă continuarea jocului, nu mai este posibil un tur următor în care să poată fi executate ambele faze sau o răsturnare a piesei Om. Jucătorul aflat la mutare în acel ultim tur este cel care pierde partida. Reamintesc aici faptul că o răsturnare a piesei Om nu poate fi ultima acțiune dintr-un joc de Sireum Flip.
Profesorul Interfață (cu utilizatorul)
Dacă nu înțelegeți în întregime felul în care se joacă o partidă de Sireum Flip, folosiți aplicația Sireum și selectați o partidă de Flip. Am conceput în așa fel interfața cu utilizatorul, atît pentru Push, cît și pentru Flip, încît elementele de comandă ale jocului vă oferă posibilitatea de a face numai mutări „legale”. Astfel, aplicația permite exclusiv deplasările valide ale piesei Om, iar în faza a doua pot fi selectate pentru a fi luate de pe tabla de joc numai piesele care nu intră în conflict cu principiul continuității. Vă puteți folosi de situațiile de joc și de interfața de comandă pentru a înțelege mai bine regulile.
Bănuiesc că partea de deplasare/rotire/răsturnare a piesei Om este clar cum se comandă în aplicație. Nu sînt active decît butoanele mutărilor valide. La apăsarea unui buton încă neselectat, este selectată comanda respectivă și aceasta este executată pe tabla de joc. Totodată apare încă un buton, care cred că acum este galben sau portocaliu, care este butonul de „next turn”.
Dacă apăsați un buton de comandă deja selectat, acesta se deselectează iar execuția comenzii corespunzătoare este anulată pe tabla de joc. Cînd niciun buton de comandă nu este selectat, butonul de „next turn” dispare. Dacă, în timp ce este selectat un buton de comandă, este apăsat un alt buton de comandă, pe tabla de joc apare mutarea corespunzătoare butonului nou apăsat. Evident, la turul următor se trece apăsînd butonul de „next turn”, pe care nu vreau să scriu „next turn” pentru că ar fi redundant, deja știți la ce folosește, nu este necesar să mai încarc interfața cu text inutil, urăsc textul în interfețele cu utilizatorul – dar nu și în mult prea lungile mele articole, după cum se pare 🙂 .
Mai este de spus cum se execută în aplicație a doua fază a unui tur de Sireum Flip. După executarea primei faze, adică după deplasarea piesei Om, piesele colorate care nu se pot lua de pe tabla de joc, piesele „blocate”, apar sub forma unor pătrate de aceeași culoare cu piesa din poziția respectivă. Piesele colorate care se pot lua de pe tabla de joc arată la fel ca pînă acum, dar, dacă veți trece cu cursorul mouse-ului peste ele, veți observa că acum sînt highlight-abile, evidențiabile, că se schimbă culoarea poziției peste care treceți cu mouse-ul. Dacă dați click pe o piesă colorată evidențiată, aceasta va fi selectată, deasupra ei va apărea un „X” și se va activa butonul de „next turn”. Dacă apăsați butonul de „next turn”, piesa colorată selectată va dispărea de pe tabla de joc, faza a doua a turului curent se încheie și se trece la turul următor.
Vreau să vă atrag atenția asupra faptului că libertatea de a acționa asupra comenzilor de interfață ale jocului este totală, în ideea în care orice ați apăsa nu veți face o greșeală sub aspect regulamentar, ci doar puteți pierde partida mai ușor.
Practic, puteți anula oricînd o comandă prin apăsarea din nou a butonului corespunzător comenzii respective. Puteți trece direct de la o comandă la alta, iar tabla de joc se va reconfigura corespunzător noii comenzi. Iar la Sireum Flip, puteți reveni din faza a doua a jocului la prima fază prin simpla deselectare a butonului de comandă selectat sau prin selectarea directă a unui alt buton de comandă – tabla de joc se va reseta și se va reconfigura automat corespunzător comenzii noi, intrînd tot automat în a doua fază a turului și configurînd tabla de joc în acord cu aceasta, inclusiv în ce privește piesele colorate selectabile și cele blocate.
O piesă colorată selectată în faza a doua a turului de Flip poate fi deselectată, sau se poate selecta direct o alta, situație în care cea selectată anterior se deselectează automat.
La o adică, dacă nu v-am lămurit deja, vă veți lămuri în toate privințele prin experiment – am făcut interfața jocului în așa fel încît nicio acțiune, clic, selecție, nu este fără sens, ori derutantă. Totul are o logică simplă.
Cu lămîia în parbriz
Celor fluenți în Python le cer clemență dacă își vor arunca ochiul critic asupra sărmanului cod scris de mine. După 2 săptămîni de amușinat documentații de Python am purces direct la scrierea scriptului Sireum, trecînd cu inadmisibilă frugalitate peste etapa „Hello World!”. Din acest motiv, codul conține etape ale aventurilor mele prin Python, dovezi ale micilor pași înainte pe care i-am făcut în înțelegerea acestui limbaj de programare. Ce mergea nu am mai refăcut, dar am perfecționat din mers ce s-a putut. La fel am procedat și cu logica algoritmilor, funcțiilor și claselor pe care le-am creat – sînt în evoluție naivă, înregistrată necruțător în cele peste 3000 de linii ale scriptului.
Știu că aș fi putut abstractiza mai mult codul, că puteam transforma în clase anumite etape, că ar fi trebuit să folosesc pe alocuri list splitting și list comprehensions, că prea multe variabile sînt de instanță („self.”), dar nu am avut timp să caut prea insistent în coarne codului, pentru că printre coarne se află cornițe mai mici, între care se află cornițe și mai mici și mai multe și uite-așa ajungi să nu mai faci de teamă că ai făcut ca un novice de două parale ca mine. Ori, pentru mine codul este o unealtă, pe care o folosesc cu un scop. Scopul contează, nu codul, atîta vreme cît nu simt că acesta ajunge să dăuneze scopului. Iar în aplicația mea consumul de resurse este mult prea mic pentru a fi nevoie de optimizări la sînge sau de estetică a frazei abstracte. Există o linie pe care a trebuit să o trag între a scrie cod plăcut Celui de Sus, dar în permanentă stare de șantier, sau cod care să facă, totuși, ceea ce vreau eu să facă.
Deoarece sînt complet autodidact și solitar în această muncă – lucru care se întîmplă din necesitate, nu din dorința mea – nu am de la cine învăța, pe calea bunului model de urmat și a sfaturilor. Acelora dintre voi care sînt familiarizați cu Python-ul și simt că mă pot ajuta în vreun fel să-mi fac aplicațiile mai bine, le mulțumesc încă de pe acum și îi asigur de maxima mea atenție.
Finis Coronat Opus
Ce aș mai face cu aplicația Sireum dacă aș mai avea resurse/timp/energie? În primul rînd i-aș pune sunet, că, na, sînt Marius Ghinea și nu am sunet la primul meu joc, mai mare rușinea. Apoi aș porta aplicația pe Android, să poată fi jucat Sireum simplu, cu un smartphone pus între cei doi jucători. Aș face un server online, în așa fel încît să poată fi jucat Sireum și între doi jucători aflați la distanță – vreau să învăț Flask sau Django.
Bineînțeles că nu îmi doresc să mă opresc aici. Am o idee de joc casual, de genul care poate căpăta mare popularitate, derivat din Sireum, ceva original și oarecum surprinzător, mai ales că poate fi „gameificat” la modul atractiv, inclusiv comercial, și poate fi jucat și singleplayer. Am în minte și două jocuri de tip arcade, la rîndul lor originale, neobișnuite, interesante, dar simple – cred că deja vă dați seama că de la mine nu vă puteți aștepta la ceva care să nu fie absolut nou și chiar nițel revoluționar. Ce se va alege de toate astea? Nu știu. Nu, nu am energie să mă ocup de crowdfunding, eu sînt doar omul cu ideile și producția.
Acum vă rog frumos să treceți la lectura celui de-al doilea articol dedicat jocului de Sireum, cel intitulat Sireum – argument.
Mulțumesc.