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

Revision 2626, 15.8 KB checked in by hniemi, 8 years ago (diff)

Lisäilty tombstoningia, ei toimi vielä.

RevLine 
[1482]1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Assets;
7
8namespace JyTris
9{
10    /// <summary>
11    /// TetrisPalikka
12    ///
13    /// Olion tarkoitus on toimia pelissä palikkana.
14    ///
15    /// Palikka sisältää neljän palikan yhdistelmän kaikki mahdolliset
16    /// asetelmat.
17    ///
18    /// Esimerkki käytöstä:
19    ///
20    /// TetrisPalikka palikka = new TetrisPalikka(7);
21    /// Luo satunnaisen palikan, joka luulee olevansa paikassa (0,7) pelikentällä.
22    /// </summary>
[2626]23    public class TetrisPalikka 
[1482]24    {
25        private Vector[] sijainnit;
26        private Vector[][] siirrot;
27        private Color vari;
28        private int seuraavaAsento = 0;
29
30        /// <summary>
31        /// Luo satunnaisen tetrispalikan kentän ylälaitaan.
32        ///
33        /// Pelikentän tarvitsee olla vähintään 4x4 kokoinen,
34        /// jotta palikka voi toimia kunnolla
35        ///
36        /// Jos palikan muoto halutaan määritellä itse, käytetään
37        /// LataaPitka, ja vastaavia metodeja.
38        /// </summary>
39        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
40        public TetrisPalikka(int keskikohta)
41        {
42            //Tämä silmukkaa tekee uudet palikat ja laittaa ne järjestykseen
43            sijainnit = new Vector[4];
44            for (int i = 0; i < sijainnit.Length; i++)
45            {
46                sijainnit[i] = new Vector();
47            }
48
49            LataaSatunnainen(keskikohta);
50        }
51
52        /// <summary>
53        /// Lataa satunnaisen tetrispalikan
54        /// </summary>
55        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
56        public void LataaSatunnainen(int keskikohta)
57        {
[1515]58            int satunnainen = RandomGen.NextInt(0, 6);
[1482]59            switch (satunnainen)
60            {
61                case 0: LataaPitka(keskikohta); break;
62                case 1: LataaZigZag(keskikohta); break;
63                case 2: LataaZagZig(keskikohta); break;
64                case 3: LataaNelio(keskikohta); break;
65                case 4: LataaL(keskikohta); break;
66                case 5: LataaJ(keskikohta); break;
[1515]67                case 6: LataaRisti(keskikohta); break;
[1482]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>
[1515]398        /// Lataa J-palikan
399        ///
400        /// o = akseli
401        ///
402        ///  *
403        ///  o
404        /// **
405        /// </summary>
406        /// <param name="keskikohta">Kentän yläreunan keskikohta</param>
407        public void LataaRisti(int keskikohta)
408        {
409            vari = Color.Magenta;
410            sijainnit[2].Y = 0;
411            sijainnit[1].Y = 0;
412            sijainnit[0].Y = 0;
413            sijainnit[3].Y = 1;
414
415            sijainnit[0].X = keskikohta;
416            sijainnit[1].X = keskikohta + 1;
417            sijainnit[2].X = keskikohta - 1;
418            sijainnit[3].X = keskikohta;
419
420            //Tämä luo siirrot, jotta palikkaa voidaan kääntää
421            siirrot = new Vector[4][];
422            for (int i = 0; i < siirrot.Length; i++)
423            {
424                siirrot[i] = new Vector[4];
425            }
426
427            /*
428             *        1
429             * 201 -> 03
430             *  3     2
431             *       
432             */
433            siirrot[0][0] = new Vector(0, 0);
434            siirrot[0][1] = new Vector(-1, -1);
435            siirrot[0][2] = new Vector(1, 1);
436            siirrot[0][3] = new Vector(1, -1);
437
438            /*
439             * 1   ->  3
440             * 03     102
441             * 2
442             */
443            siirrot[1][0] = new Vector(0, 0);
444            siirrot[1][1] = new Vector(-1, 1);
445            siirrot[1][2] = new Vector(1,-1);
446            siirrot[1][3] = new Vector(-1, -1);
447
448            /*
449             *  3   -> 2
450             * 102    30
451             *         1
452             */
453            siirrot[2][0] = new Vector(0, 0);
454            siirrot[2][1] = new Vector(1, 1);
455            siirrot[2][2] = new Vector(-1, -1);
456            siirrot[2][3] = new Vector(-1, 1);
457
458            /*
459             *  2 -> 201
460             * 30     3
461             *  1
462             */
463            siirrot[3][0] = new Vector(0, 0);
464            siirrot[3][1] = new Vector(1, -1);
465            siirrot[3][2] = new Vector(-1, 1);
466            siirrot[3][3] = new Vector(1, 1);
467        }
468
469        /// <summary>
[1482]470        /// Liikuttaa kaikkia palikoita annetun vektorin verran.
471        /// </summary>
472        /// <param name="liike">X- ja Y-arvot oltava kokonaislukuja</param>
473        public void Liikuta(Vector liike)
474        {
475            //Lisää halutun siirron jokaisen palikan sijaintiin
476            for (int i = 0; i < sijainnit.Length; i++)
477            {
478                sijainnit[i] += liike;
479            }
480        }
481
[1515]482
[1482]483        /// <summary>
484        /// Kääntää palikkaa
485        /// </summary>
486        /// <returns>Seuraavan asennon indeksi</returns>
487        public int Kaanna()
488        {
489            for (int i = 0; i < sijainnit.Length; i++)
490            {
491                sijainnit[i] += siirrot[seuraavaAsento][i];
492            }
493
494            seuraavaAsento++;
495            if (seuraavaAsento > siirrot.Length - 1) seuraavaAsento = 0;
496
497            return seuraavaAsento;
498        }
499
500        /// <summary>
501        /// Antaa taulukossa vektorit, jotka ovat palikkojen sijainnit
502        /// kaannon jälkeen.
503        ///
504        /// Tällä voidaan tarkistaa, voidaanko palikkaa kääntää.
505        /// </summary>
506        /// <returns>Sisältää uudet sijainnit</returns>
507        public Vector[] TulevaKaanto()
508        {
509            Vector[] tulevaSijainti = new Vector[4];
510            for (int i = 0; i < tulevaSijainti.Length; i++)
511            {
512                tulevaSijainti[i] = sijainnit[i] + siirrot[seuraavaAsento][i];
513            }
514            return tulevaSijainti;
515        }
516
517        /// <summary>
518        /// Antaa palikan värin
519        /// </summary>
520        /// <returns>Palikan väri</returns>
521        public Color Vari()
522        {
523            return vari;
524        }
525
526        /// <summary>
527        /// Antaa taulukossa vektorit, jotka ovat palikkojen sijainnit.
528        ///
529        /// Tällä palikat voidaan sijoittaa pelikentälle.
530        /// </summary>
531        /// <returns>Palikkojen sijainnit</returns>
532        public Vector[] Sijainti()
533        {
534            return sijainnit;
535        }
536    }
537}
Note: See TracBrowser for help on using the repository browser.