OurGamesForCourse
215 строк · 3.8 Кб
1namespace PauchiaUkladka;
2
3public class GameState
4{
5private Block currentBlock;
6
7public Block CurrentBlock
8{
9get
10{
11return currentBlock;
12}
13private set
14{
15currentBlock = value;
16currentBlock.Reset();
17
18for (int i = 0; i < 2; i++)
19{
20currentBlock.Move(1, 0);
21
22if (BlockFits() == false)
23{
24currentBlock.Move(-1, 0);
25}
26}
27}
28}
29
30public GameGrid GameGrid
31{
32get;
33}
34
35public BlockQueue BlockQueue
36{
37get;
38}
39
40public bool GameOver
41{
42get;
43private set;
44}
45
46public int Score
47{
48get;
49private set;
50}
51
52public Block HeldBlock
53{
54get;
55private set;
56}
57
58public bool CanHold
59{
60get;
61private set;
62}
63
64public GameState()
65{
66GameGrid = new GameGrid(22, 10);
67BlockQueue = new BlockQueue();
68CurrentBlock = BlockQueue.GetAndUpdate();
69CanHold = true;
70}
71
72public void HoldBlock()
73{
74if (CanHold == false)
75{
76return;
77}
78
79if (HeldBlock == null)
80{
81HeldBlock = CurrentBlock;
82CurrentBlock = BlockQueue.GetAndUpdate();
83}
84else
85{
86Block tmp = CurrentBlock;
87CurrentBlock = HeldBlock;
88HeldBlock = tmp;
89}
90
91CanHold = false;
92}
93
94private bool BlockFits()
95{
96foreach (Position p in CurrentBlock.TilePositions())
97{
98if (GameGrid.IsEmpty(p.Row, p.Column) == false)
99{
100return false;
101}
102}
103
104return true;
105}
106
107public void RotateBlockCW()
108{
109CurrentBlock.RoatateCW();
110
111if (BlockFits() == false)
112{
113CurrentBlock.RoatateCCW();
114}
115}
116
117public void RotateBlockCCW()
118{
119CurrentBlock.RoatateCCW();
120
121if (BlockFits() == false)
122{
123CurrentBlock.RoatateCW();
124}
125}
126
127public void MoveBlockLeft()
128{
129CurrentBlock.Move(0, -1);
130
131if (BlockFits() == false)
132{
133CurrentBlock.Move(0, 1);
134}
135}
136
137public void MoveBlockRight()
138{
139CurrentBlock.Move(0, 1);
140
141if (BlockFits() == false)
142{
143CurrentBlock.Move(0, -1);
144}
145}
146
147private bool IsGameOver()
148{
149if (GameGrid.IsRowEmpty(0) == false || GameGrid.IsRowEmpty(1) == false)
150return true;
151else
152return false;
153}
154
155private void PlaceBlock()
156{
157foreach (Position p in CurrentBlock.TilePositions())
158{
159GameGrid[p.Row, p.Column] = CurrentBlock.Id;
160}
161
162Score += GameGrid.ClearFullRows();
163
164if (IsGameOver())
165{
166GameOver = true;
167}
168else
169{
170CurrentBlock = BlockQueue.GetAndUpdate();
171CanHold = true;
172}
173}
174
175public void MoveBlockDown()
176{
177CurrentBlock.Move(1, 0);
178
179if (BlockFits() == false)
180{
181CurrentBlock.Move(-1, 0);
182PlaceBlock();
183}
184}
185
186private int TileDropDistance(Position p)
187{
188int drop = 0;
189
190while (GameGrid.IsEmpty(p.Row + drop + 1, p.Column))
191{
192drop++;
193}
194
195return drop;
196}
197
198public int BlockDropDistance()
199{
200int drop = GameGrid.Rows;
201
202foreach (Position p in CurrentBlock.TilePositions())
203{
204drop = Math.Min(drop, TileDropDistance(p));
205}
206
207return drop;
208}
209
210public void DropBlock()
211{
212CurrentBlock.Move(BlockDropDistance(), 0);
213PlaceBlock();
214}
215}