on the verge of extinction... again

name the game

Acum cateva zile nopti m-am trezit ca am ramas fara internet. Teoretic, exista numere de telefon non-stop pentru sesizari. Practic, experienta m-a invatat ca, daca sun dupa miezul noptii, oricum nu se rezolva inainte de ora 8-9. Asa ca m-am apucat sa lucrez local la o chestie.

Prima incercare a fost un esec total. A doua n-a mers prea departe. Dar cred ca pana in stadiul in care am dus-o acum am gandit-o mai bine decat prima data. Este vorba de un joc JavaScript inspirat de fruitix. Diferenta e data de faptul ca nu ma duce creierul sa fac ceva exact la fel pentru ca inca nu mi-e clar cum calculez calea minima (daca exista!) intre doua celule de pe grila. Si de faptul ca m-a scarpinat sa-l fac cu o grila de dimensiuni variabile si cu o multime extinsa de simboluri, din care sa aleg o submultime pentru fiecare joc.

Nici nu stiu cum sa-l numesc. De fapt, nici nu stiu daca ma va duce creierul sa-l fac sa functioneze. Sau daca nu-l voi lasa balta asa cum las balta totul.

Jocul "curge" cam in felul urmator: la fiecare pas (nu stiu cum sa-i spun altfel) apar pe grila floor(grid_size/3) simboluri aleatoare (se poate sa se nimereasca sa fie mai multe identice) dintr-o submultime (determinata aleator sau de catre utilizator) de round(2*grid_size/3) + 1 a multimii de simboluri. Utilizatorul trebuie sa mute un simbol inainte de pasul urmator. In momentul in care completeaza o secventa de ceiling(grid_size/2) simboluri (pe orizontala, verticala, sau diagonala), celulele care au format secventa sunt eliberate si utilizatorul mai muta inca un simbol inainte de urmatorul pas.

Mutarea se efectueaza prin click pe celula cu simbolul care se vrea mutat (asta selecteaza celula) si apoi click pe celula in care trebuie mutat. Un simbol nu poate fi mutat intr-o celula deja ocupata. Si o celula goala nu poate fi selectata.

Ceea ce inseamna ca la fiecare click pe grila am patru situatii:

  • celula este goala si nu am selectata nici o celula ocupata din care sa mut simbolul; in cazul asta... nu se intampla nimic! return, utilizatorul trebuie sa dea click pe o celula continand un simbol;
  • celula este ocupata si am deja selectata o celula ocupata din care sa mut simbolul; in cazul acesta, celula pe care am dat click devine noua celula selectata;
  • celula este ocupata si nu am nici o celula ocupata selectata; celula pe care am dat click devine celula mea selectata;
  • celula este libera si am o celula ocupata selectata; pur si simplu fac mutarea.

Dupa fiecare mutare si fiecare simbol nou aparut pe grila la fiecare pas, verific sa vad daca s-a completat o secventa suficient de lunga. Verific in ordine pe orizontala, pe verticala si pe diagonala pornind de la simbolul mutat/ nou aparut pe grila. Functia este aceeasi, difera doar pasul (1 pentru orizontala, grid_size pentru verticala si grid_size + 1 pentru diagonala).

Verific intai inapoi (tot scazand valoarea pasului) pana cand se intampla una din urmatoarele: ajung la marginea grilei sau ajung la o celula goala sau ajung la o celula ocupata de alt simbol. Verific apoi inainte. Daca secventa obtinuta este cel putin egala cu secventa minima, atunci eliberez celulele si cresc punctajul.

Desigur, la fiecare pas, inainte sa pun un nou simbol la intamplare pe grila, trebuie sa verific daca mai exista spatii libere. Pentru ca am acolo un while unde testez daca celula aleasa aleator este ocupata sau nu. Iar daca toate celulele sunt ocupate... si nu exista conditia ca se put pune simboluri pe grila doar atata timp cat mai exista locuri libere... atunci ajung la o bucla infinita.

Bineinteles, jocul se termina atunci cand nu mai sunt locuri libere pe grila. Si cam asta ar fi...

7 pareri

cine
Cristi
cand
miercuri, 12 septembrie 2012, 00:12:00 EEST
De ce trebuie sa calculezi calea minima la fruitix? Trebuie doar sa numeri cate sunt in grupul din care face parte celula selectata.
Pentru testul de celule libere, poti sa pui toate celulele libere intr-o lista si sa alegi aleator intre 0 si lungimea listei.
Nu vreau sa te descurajez, dar problema cu acest joc este ca jucatorul pierde intotdeauna si satisfactia sa tinde catre zero.
cine
brontozaurel
cand
miercuri, 12 septembrie 2012, 00:26:00 EEST
Nu trebuie calculata neaparat calea minima (dar asa ar fi ideal). Trebuie calculat daca exista o cale minima (formata din celule libere) pe care as putea muta simbolul din celula in care este pana in cea in care vreau sa-l mut.

Pana in stadiul in care l-am dus acum - live demo - mutarile pot fi efectuate indiferent daca exista o cale libera sau nu.

Nu stiu ce sa spun la partea cu satisfactia. Mie fruitix imi place tocmai pentru ca mi se pare dificil. Si e tocmai chestia asta, ca stiu ca n-o sa castig, dar incerc de fiecare data sa obtin un punctaj cat mai mare. Tom & Jerry Refriger-raiders mi se pare mult mai simplu si din cauza asta nu chiar asa interesant, in ciuda faptului ca imi plac personajele.
cine
brontozaurel
cand
miercuri, 12 septembrie 2012, 00:29:00 EEST
Mai mult, nu stiu ce altceva sa fac. M-am apucat de asta pentru ca toata lumea spune "you get better at [insert whatever] by writing code". Dar alte idei ce as putea sa fac in JavaScript n-am...
cine
Cristi
cand
miercuri, 12 septembrie 2012, 21:15:00 EEST
Poate ai dreptate. Am mai jucat acum demo-ul si mi s-a parut mult mai usor decat prima versiune (probabil din cauza grid-ului mai mare), poate chiar prea usor. Cred ca daca adaugi si restrictia de cale libera ar fi ok.
cine
brontozaurel
cand
joi, 13 septembrie 2012, 23:41:00 EEST
Da, de asta intentionez sa ma apuc maine. Azi mi-am spart creierii cu o dracie de CSS pe care am botezat-o Gridify. In mare, e o galerie de imagini care pot fi mutate in asa fel incat sa formeze un grid unde afiseze fiecare cate o bucata din imaginea mai mare.
cine
MikeSw
cand
duminic─â, 16 septembrie 2012, 09:08:00 EEST
Apropos, nu stiu ce editor folosesti dar pt ceva light (e facut pt beginners) poti folosi webmatrix 2
cine
brontozaurel
cand
duminic─â, 16 septembrie 2012, 09:11:00 EEST
Notepad++ sau direct in browser.

Da-ti si tu cu parerea!

Mai jos se pot scrie tampenii. Nu mai mari ca alea de mai sus...
Insa inainte de orice altceva, vezi cum se comenteaza: indrumar tehnic si reguli!
HTML acceptat: <b>, <i>, <a href=""> (fara alte atribute)