source: 2010/23/hniemi/JyTris/JyTris/TetrisPalikka.cs @ 1482

Revision 1482, 13.7 KB checked in by hniemi, 10 years ago (diff)

Tiedostoja karsittu, toteutusta yksinkertaistettu.
Lisätty intro, ja mahdollisuus lopettaa peli kesken ja aloittaa alusta. (Escape ja F2)

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.ScreenObjects;
7using Jypeli.Assets;
8
9namespace JyTris
10{
11    /// <summary>
12    /// TetrisPalikka
13    ///
14    /// Olion tarkoitus on toimia pelissä palikkana.
15    ///
16    /// Palikka sisältää neljän palikan yhdistelmän kaikki mahdolliset
17    /// asetelmat.
18    ///
19    /// Esimerkki käytöstä:
20    ///
21    /// TetrisPalikka palikka = new TetrisPalikka(7);
22    /// Luo satunnaisen palikan, joka luulee olevansa paikassa (0,7) pelikentällä.
23    /// </summary>
24    class TetrisPalikka 
25    {
26        private Vector[] sijainnit;
27        private Vector[][] siirrot;
28        private Color vari;
29        private int seuraavaAsento = 0;
30
31        /// <summary>
32        /// Luo satunnaisen tetrispalikan kentän ylälaitaan.
33        ///
34        /// Pelikentän tarvitsee olla vähintään 4x4 kokoinen,
35        /// jotta palikka voi toimia kunnolla
36        ///
37        /// Jos palikan muoto halutaan määritellä itse, käytetään
38        /// LataaPitka, ja vastaavia metodeja.
39        /// </summary>
40        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
41        public TetrisPalikka(int keskikohta)
42        {
43            //Tämä silmukkaa tekee uudet palikat ja laittaa ne järjestykseen
44            sijainnit = new Vector[4];
45            for (int i = 0; i < sijainnit.Length; i++)
46            {
47                sijainnit[i] = new Vector();
48            }
49
50            LataaSatunnainen(keskikohta);
51        }
52
53        /// <summary>
54        /// Lataa satunnaisen tetrispalikan
55        /// </summary>
56        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
57        public void LataaSatunnainen(int keskikohta)
58        {
59            int satunnainen = RandomGen.NextInt(0, 5);
60            switch (satunnainen)
61            {
62                case 0: LataaPitka(keskikohta); break;
63                case 1: LataaZigZag(keskikohta); break;
64                case 2: LataaZagZig(keskikohta); break;
65                case 3: LataaNelio(keskikohta); break;
66                case 4: LataaL(keskikohta); break;
67                case 5: LataaJ(keskikohta); break;
68                default: break;
69            }
70        }
71
72        /// <summary>
73        /// Lataa pitkan palikan
74        ///
75        /// o = akseli
76        ///
77        /// *
78        /// o
79        /// *
80        /// *
81        /// </summary>
82        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
83        public void LataaPitka(int keskikohta)
84        {
85            vari = Color.Red;
86            sijainnit[3].Y = 0;
87            sijainnit[0].Y = 1;
88            sijainnit[1].Y = 2;
89            sijainnit[2].Y = 3;
90
91            for (int i = 0; i < sijainnit.Length; i++)
92            {
93                sijainnit[i].X = keskikohta;
94            }
95
96            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
97            siirrot = new Vector[2][];
98            siirrot[0] = new Vector[4];
99            siirrot[1] = new Vector[4];
100
101            /*
102             * 3
103             * 0 -> 3012
104             * 1
105             * 2
106             */
107            siirrot[0][0] = new Vector(0, 0);
108            siirrot[0][1] = new Vector(1, -1);
109            siirrot[0][2] = new Vector(2, -2);
110            siirrot[0][3] = new Vector(-1, 1);
111
112            /*
113             * 3
114             * 0 <- 3012
115             * 1
116             * 2
117             */
118            siirrot[1][0] = new Vector(0, 0);
119            siirrot[1][1] = new Vector(-1, 1);
120            siirrot[1][2] = new Vector(-2, 2);
121            siirrot[1][3] = new Vector(1, -1);
122        }
123
124        /// <summary>
125        /// Lataa siksakssipalikan
126        ///
127        /// o = akseli
128        ///
129        ///  o*
130        /// **
131        /// </summary>
132        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
133        public void LataaZigZag(int keskikohta)
134        {
135            vari = Color.Orange;
136            sijainnit[3].Y = 1;
137            sijainnit[2].Y = 1;
138            sijainnit[1].Y = 0;
139            sijainnit[0].Y = 0;
140
141            sijainnit[0].X = keskikohta;
142            sijainnit[1].X = keskikohta + 1;
143            sijainnit[2].X = keskikohta - 1;
144            sijainnit[3].X = keskikohta;
145
146            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
147            siirrot = new Vector[2][];
148            for (int i = 0; i < siirrot.Length; i++)
149            {
150                siirrot[i] = new Vector[4];
151            }
152
153            /*
154             *  01 -> 1
155             * 23     03
156             *         2
157             */
158            siirrot[0][0] = new Vector(0, 0);
159            siirrot[0][1] = new Vector(-1, -1);
160            siirrot[0][2] = new Vector(2, 0);
161            siirrot[0][3] = new Vector(1, -1);
162
163            /*
164             *  01 <- 1
165             * 23     03
166             *         2
167             */
168            siirrot[1][0] = new Vector(0, 0);
169            siirrot[1][1] = new Vector(1, 1);
170            siirrot[1][2] = new Vector(-2, 0);
171            siirrot[1][3] = new Vector(-1, 1);
172        }
173
174        /// <summary>
175        /// Lataa käänteisen siksakkipalikan
176        ///
177        /// o = akseli
178        ///
179        /// *o
180        ///  **
181        /// </summary>
182        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
183        public void LataaZagZig(int keskikohta)
184        {
185            vari = Color.Green;
186            sijainnit[3].Y = 1;
187            sijainnit[2].Y = 1;
188            sijainnit[1].Y = 0;
189            sijainnit[0].Y = 0;
190
191            sijainnit[0].X = keskikohta;
192            sijainnit[1].X = keskikohta - 1;
193            sijainnit[2].X = keskikohta + 1;
194            sijainnit[3].X = keskikohta;
195
196            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
197            siirrot = new Vector[2][];
198            for (int i = 0; i < siirrot.Length; i++)
199            {
200                siirrot[i] = new Vector[4];
201            }
202
203            /*
204             * 10  ->  1
205             *  32    30
206             *        2
207             */
208            siirrot[0][0] = new Vector(0, 0);
209            siirrot[0][1] = new Vector(1, -1);
210            siirrot[0][2] = new Vector(-2, 0);
211            siirrot[0][3] = new Vector(-1, -1);
212
213            /*
214             * 10  <-  1
215             *  32    30
216             *        2
217             */
218            siirrot[1][0] = new Vector(0, 0);
219            siirrot[1][1] = new Vector(-1, 1);
220            siirrot[1][2] = new Vector(2, 0);
221            siirrot[1][3] = new Vector(1, 1);
222        }
223
224        /// <summary>
225        /// Lataa nelipalikan
226        ///
227        /// o = akseli
228        ///
229        /// o*
230        /// **
231        /// </summary>
232        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
233        public void LataaNelio(int keskikohta)
234        {
235            vari = Color.Black;
236            sijainnit[2].Y = 1;
237            sijainnit[3].Y = 1;
238            sijainnit[1].Y = 0;
239            sijainnit[0].Y = 0;
240
241            sijainnit[0].X = keskikohta;
242            sijainnit[1].X = keskikohta + 1;
243            sijainnit[2].X = keskikohta;
244            sijainnit[3].X = keskikohta + 1;
245
246            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
247            siirrot = new Vector[4][];
248            for (int i = 0; i < siirrot.Length; i++)
249            {
250                siirrot[i] = new Vector[4];
251            }
252        }
253
254        /// <summary>
255        /// Lataa L-palikan
256        ///
257        /// o = akseli
258        ///
259        /// *
260        /// o
261        /// **
262        /// </summary>
263        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
264        public void LataaL(int keskikohta)
265        {
266            vari = Color.Blue;
267            sijainnit[3].Y = 1;
268            sijainnit[1].Y = 0;
269            sijainnit[0].Y = 0;
270            sijainnit[2].Y = 0;
271
272            sijainnit[0].X = keskikohta;
273            sijainnit[1].X = keskikohta + 1;
274            sijainnit[2].X = keskikohta - 1;
275            sijainnit[3].X = keskikohta - 1;
276
277            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
278            siirrot = new Vector[4][];
279            for (int i = 0; i < siirrot.Length; i++)
280            {
281                siirrot[i] = new Vector[4];
282            }
283
284            /*
285            * 201 -> 1
286            * 3      0
287            *        23
288            */
289            siirrot[0][0] = new Vector(0, 0);
290            siirrot[0][1] = new Vector(-1, -1);
291            siirrot[0][2] = new Vector(1, 1);
292            siirrot[0][3] = new Vector(2, 0);
293
294            /*
295             * 1  ->   3
296             * 0     102
297             * 23
298             */
299            siirrot[1][0] = new Vector(0, 0);
300            siirrot[1][1] = new Vector(-1, 1);
301            siirrot[1][2] = new Vector(1, -1);
302            siirrot[1][3] = new Vector(0, -2);
303
304            /*
305             *   3 -> 32
306             * 102     0
307             *         1
308             */
309            siirrot[2][0] = new Vector(0, 0);
310            siirrot[2][1] = new Vector(1, 1);
311            siirrot[2][2] = new Vector(-1, -1);
312            siirrot[2][3] = new Vector(-2, 0);
313
314            /*
315             * 32 -> 201
316             *  0    3
317             *  1
318             */
319            siirrot[3][0] = new Vector(0, 0);
320            siirrot[3][1] = new Vector(1, -1);
321            siirrot[3][2] = new Vector(-1, 1);
322            siirrot[3][3] = new Vector(0, 2);
323        }
324
325        /// <summary>
326        /// Lataa J-palikan
327        ///
328        /// o = akseli
329        ///
330        ///  *
331        ///  o
332        /// **
333        /// </summary>
334        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
335        public void LataaJ(int keskikohta)
336        {
337            vari = Color.Brown;
338            sijainnit[2].Y = 1;
339            sijainnit[1].Y = 0;
340            sijainnit[0].Y = 0;
341            sijainnit[3].Y = 0;
342
343            sijainnit[0].X = keskikohta;
344            sijainnit[1].X = keskikohta + 1;
345            sijainnit[2].X = keskikohta + 1;
346            sijainnit[3].X = keskikohta - 1;
347
348            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
349            siirrot = new Vector[4][];
350            for (int i = 0; i < siirrot.Length; i++)
351            {
352                siirrot[i] = new Vector[4];
353            }
354
355            /*
356             *        12
357             * 301 -> 0
358             *   2    3
359             *       
360             */
361            siirrot[0][0] = new Vector(0, 0);
362            siirrot[0][1] = new Vector(-1, -1);
363            siirrot[0][2] = new Vector(0, -2);
364            siirrot[0][3] = new Vector(1, 1);
365
366            /*
367             * 12  -> 2
368             * 0      103
369             * 3
370             */
371            siirrot[1][0] = new Vector(0, 0);
372            siirrot[1][1] = new Vector(-1, 1);
373            siirrot[1][2] = new Vector(-2, 0);
374            siirrot[1][3] = new Vector(1, -1);
375
376            /*
377             * 2   ->  3
378             * 103     0
379             *        21
380             */
381            siirrot[2][0] = new Vector(0, 0);
382            siirrot[2][1] = new Vector(1, 1);
383            siirrot[2][2] = new Vector(0, 2);
384            siirrot[2][3] = new Vector(-1, -1);
385
386            /*
387             *  3 -> 301
388             *  0      2
389             * 21
390             */
391            siirrot[3][0] = new Vector(0, 0);
392            siirrot[3][1] = new Vector(1, -1);
393            siirrot[3][2] = new Vector(2, 0);
394            siirrot[3][3] = new Vector(-1, 1);
395        }
396
397        /// <summary>
398        /// Liikuttaa kaikkia palikoita annetun vektorin verran.
399        /// </summary>
400        /// <param name="liike">X- ja Y-arvot oltava kokonaislukuja</param>
401        public void Liikuta(Vector liike)
402        {
403            //Lisää halutun siirron jokaisen palikan sijaintiin
404            for (int i = 0; i < sijainnit.Length; i++)
405            {
406                sijainnit[i] += liike;
407            }
408
409        }
410
411        /// <summary>
412        /// Kääntää palikkaa
413        /// </summary>
414        /// <returns>Seuraavan asennon indeksi</returns>
415        public int Kaanna()
416        {
417            for (int i = 0; i < sijainnit.Length; i++)
418            {
419                sijainnit[i] += siirrot[seuraavaAsento][i];
420            }
421
422            seuraavaAsento++;
423            if (seuraavaAsento > siirrot.Length - 1) seuraavaAsento = 0;
424
425            return seuraavaAsento;
426        }
427
428        /// <summary>
429        /// Antaa taulukossa vektorit, jotka ovat palikkojen sijainnit
430        /// kaannon jälkeen.
431        ///
432        /// Tällä voidaan tarkistaa, voidaanko palikkaa kääntää.
433        /// </summary>
434        /// <returns>Sisältää uudet sijainnit</returns>
435        public Vector[] TulevaKaanto()
436        {
437            Vector[] tulevaSijainti = new Vector[4];
438            for (int i = 0; i < tulevaSijainti.Length; i++)
439            {
440                tulevaSijainti[i] = sijainnit[i] + siirrot[seuraavaAsento][i];
441            }
442            return tulevaSijainti;
443        }
444
445        /// <summary>
446        /// Antaa palikan värin
447        /// </summary>
448        /// <returns>Palikan väri</returns>
449        public Color Vari()
450        {
451            return vari;
452        }
453
454        /// <summary>
455        /// Antaa taulukossa vektorit, jotka ovat palikkojen sijainnit.
456        ///
457        /// Tällä palikat voidaan sijoittaa pelikentälle.
458        /// </summary>
459        /// <returns>Palikkojen sijainnit</returns>
460        public Vector[] Sijainti()
461        {
462            return sijainnit;
463        }
464    }
465}
Note: See TracBrowser for help on using the repository browser.