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

Revision 1515, 15.8 KB checked in by hniemi, 10 years ago (diff)

Lisätty viimeinen puuttuva palikka ja tekstejä

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, 6);
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                case 6: LataaRisti(keskikohta); break;
69                default: break;
70            }
71        }
72
73        /// <summary>
74        /// Lataa pitkan palikan
75        ///
76        /// o = akseli
77        ///
78        /// *
79        /// o
80        /// *
81        /// *
82        /// </summary>
83        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
84        public void LataaPitka(int keskikohta)
85        {
86            vari = Color.Red;
87            sijainnit[3].Y = 0;
88            sijainnit[0].Y = 1;
89            sijainnit[1].Y = 2;
90            sijainnit[2].Y = 3;
91
92            for (int i = 0; i < sijainnit.Length; i++)
93            {
94                sijainnit[i].X = keskikohta;
95            }
96
97            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
98            siirrot = new Vector[2][];
99            siirrot[0] = new Vector[4];
100            siirrot[1] = new Vector[4];
101
102            /*
103             * 3
104             * 0 -> 3012
105             * 1
106             * 2
107             */
108            siirrot[0][0] = new Vector(0, 0);
109            siirrot[0][1] = new Vector(1, -1);
110            siirrot[0][2] = new Vector(2, -2);
111            siirrot[0][3] = new Vector(-1, 1);
112
113            /*
114             * 3
115             * 0 <- 3012
116             * 1
117             * 2
118             */
119            siirrot[1][0] = new Vector(0, 0);
120            siirrot[1][1] = new Vector(-1, 1);
121            siirrot[1][2] = new Vector(-2, 2);
122            siirrot[1][3] = new Vector(1, -1);
123        }
124
125        /// <summary>
126        /// Lataa siksakssipalikan
127        ///
128        /// o = akseli
129        ///
130        ///  o*
131        /// **
132        /// </summary>
133        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
134        public void LataaZigZag(int keskikohta)
135        {
136            vari = Color.Orange;
137            sijainnit[3].Y = 1;
138            sijainnit[2].Y = 1;
139            sijainnit[1].Y = 0;
140            sijainnit[0].Y = 0;
141
142            sijainnit[0].X = keskikohta;
143            sijainnit[1].X = keskikohta + 1;
144            sijainnit[2].X = keskikohta - 1;
145            sijainnit[3].X = keskikohta;
146
147            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
148            siirrot = new Vector[2][];
149            for (int i = 0; i < siirrot.Length; i++)
150            {
151                siirrot[i] = new Vector[4];
152            }
153
154            /*
155             *  01 -> 1
156             * 23     03
157             *         2
158             */
159            siirrot[0][0] = new Vector(0, 0);
160            siirrot[0][1] = new Vector(-1, -1);
161            siirrot[0][2] = new Vector(2, 0);
162            siirrot[0][3] = new Vector(1, -1);
163
164            /*
165             *  01 <- 1
166             * 23     03
167             *         2
168             */
169            siirrot[1][0] = new Vector(0, 0);
170            siirrot[1][1] = new Vector(1, 1);
171            siirrot[1][2] = new Vector(-2, 0);
172            siirrot[1][3] = new Vector(-1, 1);
173        }
174
175        /// <summary>
176        /// Lataa käänteisen siksakkipalikan
177        ///
178        /// o = akseli
179        ///
180        /// *o
181        ///  **
182        /// </summary>
183        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
184        public void LataaZagZig(int keskikohta)
185        {
186            vari = Color.Green;
187            sijainnit[3].Y = 1;
188            sijainnit[2].Y = 1;
189            sijainnit[1].Y = 0;
190            sijainnit[0].Y = 0;
191
192            sijainnit[0].X = keskikohta;
193            sijainnit[1].X = keskikohta - 1;
194            sijainnit[2].X = keskikohta + 1;
195            sijainnit[3].X = keskikohta;
196
197            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
198            siirrot = new Vector[2][];
199            for (int i = 0; i < siirrot.Length; i++)
200            {
201                siirrot[i] = new Vector[4];
202            }
203
204            /*
205             * 10  ->  1
206             *  32    30
207             *        2
208             */
209            siirrot[0][0] = new Vector(0, 0);
210            siirrot[0][1] = new Vector(1, -1);
211            siirrot[0][2] = new Vector(-2, 0);
212            siirrot[0][3] = new Vector(-1, -1);
213
214            /*
215             * 10  <-  1
216             *  32    30
217             *        2
218             */
219            siirrot[1][0] = new Vector(0, 0);
220            siirrot[1][1] = new Vector(-1, 1);
221            siirrot[1][2] = new Vector(2, 0);
222            siirrot[1][3] = new Vector(1, 1);
223        }
224
225        /// <summary>
226        /// Lataa nelipalikan
227        ///
228        /// o = akseli
229        ///
230        /// o*
231        /// **
232        /// </summary>
233        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
234        public void LataaNelio(int keskikohta)
235        {
236            vari = Color.Black;
237            sijainnit[2].Y = 1;
238            sijainnit[3].Y = 1;
239            sijainnit[1].Y = 0;
240            sijainnit[0].Y = 0;
241
242            sijainnit[0].X = keskikohta;
243            sijainnit[1].X = keskikohta + 1;
244            sijainnit[2].X = keskikohta;
245            sijainnit[3].X = keskikohta + 1;
246
247            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
248            siirrot = new Vector[4][];
249            for (int i = 0; i < siirrot.Length; i++)
250            {
251                siirrot[i] = new Vector[4];
252            }
253        }
254
255        /// <summary>
256        /// Lataa L-palikan
257        ///
258        /// o = akseli
259        ///
260        /// *
261        /// o
262        /// **
263        /// </summary>
264        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
265        public void LataaL(int keskikohta)
266        {
267            vari = Color.Blue;
268            sijainnit[3].Y = 1;
269            sijainnit[1].Y = 0;
270            sijainnit[0].Y = 0;
271            sijainnit[2].Y = 0;
272
273            sijainnit[0].X = keskikohta;
274            sijainnit[1].X = keskikohta + 1;
275            sijainnit[2].X = keskikohta - 1;
276            sijainnit[3].X = keskikohta - 1;
277
278            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
279            siirrot = new Vector[4][];
280            for (int i = 0; i < siirrot.Length; i++)
281            {
282                siirrot[i] = new Vector[4];
283            }
284
285            /*
286            * 201 -> 1
287            * 3      0
288            *        23
289            */
290            siirrot[0][0] = new Vector(0, 0);
291            siirrot[0][1] = new Vector(-1, -1);
292            siirrot[0][2] = new Vector(1, 1);
293            siirrot[0][3] = new Vector(2, 0);
294
295            /*
296             * 1  ->   3
297             * 0     102
298             * 23
299             */
300            siirrot[1][0] = new Vector(0, 0);
301            siirrot[1][1] = new Vector(-1, 1);
302            siirrot[1][2] = new Vector(1, -1);
303            siirrot[1][3] = new Vector(0, -2);
304
305            /*
306             *   3 -> 32
307             * 102     0
308             *         1
309             */
310            siirrot[2][0] = new Vector(0, 0);
311            siirrot[2][1] = new Vector(1, 1);
312            siirrot[2][2] = new Vector(-1, -1);
313            siirrot[2][3] = new Vector(-2, 0);
314
315            /*
316             * 32 -> 201
317             *  0    3
318             *  1
319             */
320            siirrot[3][0] = new Vector(0, 0);
321            siirrot[3][1] = new Vector(1, -1);
322            siirrot[3][2] = new Vector(-1, 1);
323            siirrot[3][3] = new Vector(0, 2);
324        }
325
326        /// <summary>
327        /// Lataa J-palikan
328        ///
329        /// o = akseli
330        ///
331        ///  *
332        ///  o
333        /// **
334        /// </summary>
335        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
336        public void LataaJ(int keskikohta)
337        {
338            vari = Color.Brown;
339            sijainnit[2].Y = 1;
340            sijainnit[1].Y = 0;
341            sijainnit[0].Y = 0;
342            sijainnit[3].Y = 0;
343
344            sijainnit[0].X = keskikohta;
345            sijainnit[1].X = keskikohta + 1;
346            sijainnit[2].X = keskikohta + 1;
347            sijainnit[3].X = keskikohta - 1;
348
349            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
350            siirrot = new Vector[4][];
351            for (int i = 0; i < siirrot.Length; i++)
352            {
353                siirrot[i] = new Vector[4];
354            }
355
356            /*
357             *        12
358             * 301 -> 0
359             *   2    3
360             *       
361             */
362            siirrot[0][0] = new Vector(0, 0);
363            siirrot[0][1] = new Vector(-1, -1);
364            siirrot[0][2] = new Vector(0, -2);
365            siirrot[0][3] = new Vector(1, 1);
366
367            /*
368             * 12  -> 2
369             * 0      103
370             * 3
371             */
372            siirrot[1][0] = new Vector(0, 0);
373            siirrot[1][1] = new Vector(-1, 1);
374            siirrot[1][2] = new Vector(-2, 0);
375            siirrot[1][3] = new Vector(1, -1);
376
377            /*
378             * 2   ->  3
379             * 103     0
380             *        21
381             */
382            siirrot[2][0] = new Vector(0, 0);
383            siirrot[2][1] = new Vector(1, 1);
384            siirrot[2][2] = new Vector(0, 2);
385            siirrot[2][3] = new Vector(-1, -1);
386
387            /*
388             *  3 -> 301
389             *  0      2
390             * 21
391             */
392            siirrot[3][0] = new Vector(0, 0);
393            siirrot[3][1] = new Vector(1, -1);
394            siirrot[3][2] = new Vector(2, 0);
395            siirrot[3][3] = new Vector(-1, 1);
396        }
397
398        /// <summary>
399        /// Lataa J-palikan
400        ///
401        /// o = akseli
402        ///
403        ///  *
404        ///  o
405        /// **
406        /// </summary>
407        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
408        public void LataaRisti(int keskikohta)
409        {
410            vari = Color.Magenta;
411            sijainnit[2].Y = 0;
412            sijainnit[1].Y = 0;
413            sijainnit[0].Y = 0;
414            sijainnit[3].Y = 1;
415
416            sijainnit[0].X = keskikohta;
417            sijainnit[1].X = keskikohta + 1;
418            sijainnit[2].X = keskikohta - 1;
419            sijainnit[3].X = keskikohta;
420
421            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
422            siirrot = new Vector[4][];
423            for (int i = 0; i < siirrot.Length; i++)
424            {
425                siirrot[i] = new Vector[4];
426            }
427
428            /*
429             *        1
430             * 201 -> 03
431             *  3     2
432             *       
433             */
434            siirrot[0][0] = new Vector(0, 0);
435            siirrot[0][1] = new Vector(-1, -1);
436            siirrot[0][2] = new Vector(1, 1);
437            siirrot[0][3] = new Vector(1, -1);
438
439            /*
440             * 1   ->  3
441             * 03     102
442             * 2
443             */
444            siirrot[1][0] = new Vector(0, 0);
445            siirrot[1][1] = new Vector(-1, 1);
446            siirrot[1][2] = new Vector(1,-1);
447            siirrot[1][3] = new Vector(-1, -1);
448
449            /*
450             *  3   -> 2
451             * 102    30
452             *         1
453             */
454            siirrot[2][0] = new Vector(0, 0);
455            siirrot[2][1] = new Vector(1, 1);
456            siirrot[2][2] = new Vector(-1, -1);
457            siirrot[2][3] = new Vector(-1, 1);
458
459            /*
460             *  2 -> 201
461             * 30     3
462             *  1
463             */
464            siirrot[3][0] = new Vector(0, 0);
465            siirrot[3][1] = new Vector(1, -1);
466            siirrot[3][2] = new Vector(-1, 1);
467            siirrot[3][3] = new Vector(1, 1);
468        }
469
470        /// <summary>
471        /// Liikuttaa kaikkia palikoita annetun vektorin verran.
472        /// </summary>
473        /// <param name="liike">X- ja Y-arvot oltava kokonaislukuja</param>
474        public void Liikuta(Vector liike)
475        {
476            //Lisää halutun siirron jokaisen palikan sijaintiin
477            for (int i = 0; i < sijainnit.Length; i++)
478            {
479                sijainnit[i] += liike;
480            }
481        }
482
483
484        /// <summary>
485        /// Kääntää palikkaa
486        /// </summary>
487        /// <returns>Seuraavan asennon indeksi</returns>
488        public int Kaanna()
489        {
490            for (int i = 0; i < sijainnit.Length; i++)
491            {
492                sijainnit[i] += siirrot[seuraavaAsento][i];
493            }
494
495            seuraavaAsento++;
496            if (seuraavaAsento > siirrot.Length - 1) seuraavaAsento = 0;
497
498            return seuraavaAsento;
499        }
500
501        /// <summary>
502        /// Antaa taulukossa vektorit, jotka ovat palikkojen sijainnit
503        /// kaannon jälkeen.
504        ///
505        /// Tällä voidaan tarkistaa, voidaanko palikkaa kääntää.
506        /// </summary>
507        /// <returns>Sisältää uudet sijainnit</returns>
508        public Vector[] TulevaKaanto()
509        {
510            Vector[] tulevaSijainti = new Vector[4];
511            for (int i = 0; i < tulevaSijainti.Length; i++)
512            {
513                tulevaSijainti[i] = sijainnit[i] + siirrot[seuraavaAsento][i];
514            }
515            return tulevaSijainti;
516        }
517
518        /// <summary>
519        /// Antaa palikan värin
520        /// </summary>
521        /// <returns>Palikan väri</returns>
522        public Color Vari()
523        {
524            return vari;
525        }
526
527        /// <summary>
528        /// Antaa taulukossa vektorit, jotka ovat palikkojen sijainnit.
529        ///
530        /// Tällä palikat voidaan sijoittaa pelikentälle.
531        /// </summary>
532        /// <returns>Palikkojen sijainnit</returns>
533        public Vector[] Sijainti()
534        {
535            return sijainnit;
536        }
537    }
538}
Note: See TracBrowser for help on using the repository browser.