Regulile Tetris-ului sunt destul de simple:
- Jocul începe cu apariția unui element care se încadrează aleator în partea centrală superioară a câmpului de joc. Acest element poate fi controlat de către jucător;
- Când elementul activ atinge partea sa de jos a fundului câmpului de joc sau a blocului ocupat, atunci în mai mulți pași ai jocului este fixat și poziția sa nu mai este supusă playerului;
- Dacă în câmpul de joc se formează complet rânduri de blocuri care nu sunt goale, ele dispar și rândurile superioare se mișcă în jos;
- După fiecare fixare a elementului de joc, apare unul nou, la fel ca la începutul jocului;
- Dacă elementul nou apărut are imediat coliziuni, adică este într-o stare incorectă, atunci jocul se termină;
- Pentru a câștiga în Tetris, din păcate, este imposibil.
Și acum, să vedem cum pot fi scrise toate aceste verificări folosind codul C ++.
Apariția unui element nou
Când modelul este inițializat, elementul activ al jocului este în stare neutră cu o matrice internă goală (a se vedea modelul de obiect nul). Această verificare este efectuată utilizând funcția membru isNull ():
Crearea unui nou element se face la începutul funcției membre doStep (). care este numit pentru fiecare pas de joc (prin cronometru de la controler):
Elementul aleator se formează în funcția TetrisItem :: generateRandom ():
Verificarea jocului
În funcția doStep () este convenabil să adăugați și să verificați sfârșitul jocului:
Întrebați modelul dacă jocul sa terminat, puteți folosi isGameOver ():
Element activ pe fund
Când partea inferioară a elementului activ este în ceva, atunci îl lăsăm să "crawleze" puțin:
Pentru a susține funcția de mutare în partea de jos, a trebuit să adăugăm un contor touch. De fiecare dată când un element atinge un bloc care nu este gol cu partea inferioară, valoarea contorului este incrementată cu o valoare. De îndată ce valoarea contorului atinge o anumită limită, elementul este fix (mai exact, pentru moment dispare pur și simplu). Dacă playerul deplasează elementul (stânga sau dreapta) astfel încât să înceapă din nou să cadă, valoarea contorului este resetată.
Fixarea elementului activ
Nu suntem mulțumiți că acum elementul activ dispare pur și simplu după cădere. Vom face toate blocurile sale să devină parte a câmpului de joc:
Codul este destul de evident. Observ doar că funcționează deoarece elementul activ este garantat să fie situat pe grila câmpului de joc. Ca rezultat, împărțirea coordonatelor pentru fiecare dintre blocurile sale în puncte de dimensiunea blocului dă coordonatele necesare ale câmpului de joc.
Ștergerea rândurilor umplut și sporirea complexității
Modelul este aproape finalizat. Rămâne doar să adăugăm câteva atingeri finale. Iată algoritmul pentru ștergerea câmpului de joc din rândurile umplute:
Ar trebui să apelați curat () imediat după codul de fixare a elementului:
Pentru fiecare rând recoltat, numărul de puncte câștigate este mărit cu unul. Pentru fiecare 10 puncte marcate, dificultatea jocului crește (prin creșterea vitezei pe unitate):
De fapt, funcția incScore () nu a fost cea mai reușită (a se vedea Principiul responsabilității unice): are un efect secundar (crește viteza). Cu toate acestea, pentru un astfel de joc simplu nu a fost critică. Este posibil ca într-un proiect mai complex să fie reciclat.
Ultima fleacă
Rata de cădere a elementului se poate schimba nu numai ca urmare a apelării incSpeed (). dar și la voința jucătorului. Pentru a face acest lucru, ne îmbunătățim modelul după cum urmează:
concluzie
Aceasta conchide introducerea noastră în Modelul de joc Tetris. Data viitoare vom trece la o scurtă trecere în revistă a implementărilor vizualizării și a controlerului.