FACULTATEA MATEMATICĂ-INFORMATICĂ
SPECIALIZAREA TEHNOLOGIA INFORMAŢIEI
Bucureşti
2012
Cuprins
1. Introducere ……………………………………………………………. 3
1.1 Medii de Programare Vizuală ………………………………….3
1.2 Microsoft Visual Studio ………………………………………..3
2. Tetris – Microsoft Visual Studio 2010 …………………………………4
2.1 Conceptul de bază ……………………………………………...5
2.2 Traducerea conceptului în program ……………………………6
2.3 TetrisCell …………………………………………………….....7
2.4 TetrisBoard ……………………………………………………..7
2.5 TetrisBlock ……………………………………………………..7
2.6 Crearea de Game Board ………………………………………..8
2.7 Creare Blocks …………………………………………………..8
2.8 Rotirea Blocurilor ………………………………………………9
2.9 Efectuarea Blocks Fall ………………………………………....12
2.10 Controlarea Blocks Fall din tastatură ………………………...13
2.11 Fixarea blocurilor şi eliminarea liniilor complete …………....13
2.12 Scorul ………………………………………………………...14
2.13 Întreruperea jocului …………………………………………..15
2.14 Sfârşitul jocului ………………………………………………15
3. Codul aplicaţiei Tetris …………………………………………………16
2
1. Introducere
3
2. Tetris – Microsoft Visual Studio 2010
4
2.1 Conceptul de bază
Imaginea de mai sus arată cele 7 forme de bază, precum şi alte variante
fiecare dintre ele rotite in sensul acelor de ceasornic.
5
moment ce următoarele două rotaţii sunt nesemnificative. Acest lucru face ca
de 2 × 2 celule ca o alegere ideală pentru centrul de toate formele.
6
2.3 TetrisCell
2.4 TetrisBoard
Un TetrisBoard nu este nimic mai mult decât o colecţie (în fapt, matrice 2D)
din TetrisCells aranjate în rânduri şi coloane, cu câteva proprietăţi
suplimentare.
2.5 TetrisBlock
7
Rotate). Ea stie cum sa se picteze atunci când este nevoie (Refresh and
RefreshBackGround methods).
Vom crea un bloc nou care se încadrează doar o singură dată. Pentru blocul 2
şi ulterior vrem să ”pice”, vom repoziţiona doar celula de centrul nostru de
bloc existente şi vom atribui o forma PreviewBlock. Şi PreviewBlock se
atribuie o formă nouă la întâmplare.
8
GameBoard.Columns \ 2)
FallingBlock.Shape = PreviewBlock.Shape
PreviewBlock.Shape = GetRandomShape()
PreviewBlock.RefreshBackGround()
PreviewBlock.Refresh()
End Sub
9
Private Sub UpdateShape()
Cells = GetShapeCells(Shape, CenterCell)
Refresh()
End Sub
10
Case Shapes.L2
theCells = GetCells(referenceCell, 0, 1, 0, 0,
0, -1, 1, -1)
…
…
End Select
Return theCells
End Function
Pentru a obţine acele coordonate ale celulelor în formă, vom lua doar celula
de referinţă (celulă centru), ca punct de 0,0 şi marca celelalte relative la
celulă.
Figura de mai jos prezintă un exemplu de a lua blocuri J-în formă de:
11
2.9 Efectuarea Blocks Fall
12
2.10 Controlarea Blocks Fall din tastatura
With FallingBlock
Select Case e.KeyCode
Case Keys.Left
If .CanMove(MoveDirection.Left) Then .Move(MoveD
irection.Left)
Case Keys.Right
If .CanMove(MoveDirection.Right) Then .Move(Move
Direction.Right)
Case Keys.Down
If .CanMove(MoveDirection.Down) Then .Move(MoveD
irection.Down)
Case Keys.Up
If .CanRotate Then .Rotate()
End Select
End With
Atunci când un bloc a atins punctul în care nu poate merge în jos mai
departe, avem nevoie pentru a-l bloca acolo. Tot ce trebuie să facem pentru
aceste celule este de a stabili proprietatea IsEmpty la fals, astfel încât să nu
poate fi mutat. Pentru a elimina rânduri completate vom verifica dacă este
complet rând (pentru fiecare rând care intră sub bloc ocupat), şi, dacă este,
am eliminat.
13
Dim checkRows = From cell In FallingBlock.Cells _
Order By cell.Row _
Select cell.Row Distinct
Dim rowsRemoved As Integer = 0
For Each row In checkRows
If GameBoard.IsRowComplete(row) Then
GameBoard.RemoveRow(row)
rowsRemoved += 1
End If
Next
2.12 Scorul
Vom aplica un concept simplu aici. Am mai multe puncte de atribuit pentru
îndepărtarea mai multor rânduri într-un singur start.
Acesta este modul in care se poate obtine scorul:
Premiul 100 pentru o singura linie eliminate, 400 pentru doua linii
eliminate, 900 pentru trei linii şi 1600 pentru patru linii eliminate.
Pentru fiecare 10 linii eliminate, creşte viteza la 1.
Pentru fiecare 10 viteze, creşte nivelul la 1.
” Update Statistics
Score += Math.Pow(rowsRemoved, 2) * 100
Lines += rowsRemoved
Speed = 1 + Lines \ 10
If Speed Mod 10 = 0 Then Level += 1 : Speed = 1
Timer1.Interval = (10 – Speed) * 100
UpdateStatistics();
14
2.13 Intreruperea jocului
Pentru a întrerupe jocul ne oprim pur şi simplu “timerul” care este în scădere
de blocuri.
Acest lucru este simplu. De îndată ce vom face blocul sa apara pe bord şi
vom descoperi că nu este posibil să-l mutaţi, ştim că jocul sa încheiat.
15
3. Codul aplicatiei Tetris
16