source: 2010/24/anlakane/Muistipeli/Muistipeli.cs @ 1039

Revision 1039, 23.7 KB checked in by anlakane, 11 years ago (diff)
Line 
1using System;
2using System.IO;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.Widgets;
6using Jypeli.ScreenObjects;
7using Jypeli.Assets;
8using Jypeli.Effects;
9
10/*
11 * Muistipeli.
12 * Author: Antti-Jussi Lakanen, Jyväskylän yliopisto, 2010.
13 * Nuorten peliohjelmointi: https://trac.cc.jyu.fi/projects/npo
14 */
15
16namespace Muistipeli
17{
18    public struct Paikka
19    {
20        public int Rivi;
21        public int Sarake;
22
23        public Paikka(int rivi, int sarake)
24        {
25            Rivi = rivi;
26            Sarake = sarake;
27        }
28    }
29
30    public struct Pelaaja
31    {
32        public int Numero;
33        public String Nimi;
34        public int Pisteet;
35        public Color Vari;
36
37        public Pelaaja(String nimi, int numero, Color vari)
38        {
39            Numero = numero;
40            Nimi = nimi;
41            Pisteet = 0;
42            Vari = vari;
43        }
44    }
45   
46    public class Muistipeli : Game
47    {
48        List<GameObject> valikonKohdat;
49
50        int montakoRivia;
51        int montakoSaraketta;
52
53        double korttienVali = 20.0;
54        double kortinLeveys = 50;
55        double kortinKorkeus = 70;
56
57        Kortti[,] kortit; // rivit, sarakkeet
58        Paikka korostettuKortti;
59        int montakoKorttia;
60        int[] montakoKutakinKorttitunnusta;
61
62        public enum Suunta { Vasen, Oikea, Ylos, Alas }
63        Suunta mihinSuuntaanMenossa;
64
65        GameObject highlighter;
66        List<Kortti> kaannetyt; // Yhdellä vuorolla käännetyt kortit. Tyhjennetään vuoron päätteeksi. Listassa voi olla siis 0, 1 tai 2 alkiota.
67        Timer piilotusAjastin;
68        const double aikaaEnnenPiilottamista = 2;
69
70        String korttisarja;
71
72        Pelaaja pelaaja1;
73        Pelaaja pelaaja2;
74        Pelaaja vuorossaOlevaPelaaja;
75        Label vuoronaytto;
76
77        IntMeter pelaajan1Pisteet;
78        IntMeter pelaajan2Pisteet;
79        IntMeter korttejaLoydetty;
80
81        SoundEffect pariLoytyiAani;
82        SoundEffect kortinKaantoAani;
83        SoundEffect liikkumisAani;
84        SoundEffect vuoroVaihtuuAani;
85        SoundEffect pelaaja1Aani;
86        SoundEffect pelaaja2Aani;
87        SoundEffect voittoAani;
88
89        protected override void Begin()
90        {
91            LisaaPelaajat(2);
92            Valikko();
93        }
94
95        #region Valikko
96
97        public void Valikko()
98        {
99            ClearAll();
100            Level.Width = 2000;
101            Level.Height = 1500;
102            valikonKohdat = new List<GameObject>();
103            Level.BackgroundColor = Color.White;
104
105            GameObject elaimet = new GameObject(538, 256);
106            elaimet.Image = LoadImage("elaimet");
107            elaimet.Tag = "elaimet";
108            elaimet.Y = elaimet.Height / 2 + 10;
109            valikonKohdat.Add(elaimet);
110
111            GameObject ihmiset = new GameObject(538, 256);
112            ihmiset.Image = LoadImage("ihmiset");
113            ihmiset.Tag = "ihmiset";
114            ihmiset.Y = -ihmiset.Height / 2 - 10;
115            valikonKohdat.Add(ihmiset);
116
117            foreach (var valikonKohta in valikonKohdat)
118            {
119                Add(valikonKohta);
120                Mouse.ListenOn(valikonKohta, MouseButton.Left, ButtonState.Pressed, KorttisarjaValittu, null, valikonKohta);
121            }
122
123            ValikonOhjaimet();
124
125            Camera.ZoomToLevel();
126        }
127
128        public void KorttisarjaValittu(GameObject mitaPainettiin)
129        {
130            korttisarja = mitaPainettiin.Tag.ToString();
131            PelinKorttienMaara();
132        }
133
134        public void ValikonOhjaimet()
135        {
136            Mouse.IsCursorVisible = true;
137            Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
138            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
139        }
140
141        public void ValikossaLiikkuminen(AnalogState hiirenTila)
142        {
143            foreach (var kohta in valikonKohdat)
144            {
145                if (Mouse.IsCursorOn(kohta))
146                {
147                    kohta.Image = LoadImage(kohta.Tag.ToString() + "_");
148                }
149                else
150                {
151                    kohta.Image = LoadImage(kohta.Tag.ToString());
152                }
153            }
154        }
155
156        public void PelinKorttienMaara()
157        {
158            int montakoKuvaaSarjassa = LataaKuvat();
159
160            ClearAll();
161            valikonKohdat.Clear();
162
163            Label montako = new Label("Kuinka monta korttia?");
164            montako.Position = new Vector(0, 250);
165            Add(montako);
166
167            GameObject vahan = new GameObject(512, 128);
168            vahan.Tag = "4";
169            valikonKohdat.Add(vahan);
170
171            GameObject sopivasti = new GameObject(512, 128);
172            sopivasti.Tag = "2";
173            valikonKohdat.Add(sopivasti);
174
175            GameObject paljon = new GameObject(512, 128);
176            paljon.Tag = "1";
177            valikonKohdat.Add(paljon);
178
179            int i = 0;
180            foreach (var valikonKohta in valikonKohdat)
181            {
182                Add(valikonKohta);
183                valikonKohta.Position = new Vector(0, valikonKohdat.Count * valikonKohta.Height / 2 - (valikonKohta.Height * i) - 10);
184                Mouse.ListenOn(valikonKohta, MouseButton.Left, ButtonState.Pressed, MaaraValittu, null, valikonKohta, montakoKuvaaSarjassa);
185                i++;
186            }
187            ValikonOhjaimet();
188
189        }
190
191        public void MaaraValittu(GameObject mitaPainettiin, int montakoKuvaaSarjassa)
192        {
193            // jos painettiin "vähän" niin kortteja tulee 1/4 maksimista
194            // esim. jos kortteja on 13, niin pareja tulee floor(1/4 * 13) = 3 ja siten 6 korttia
195            montakoKorttia = 2 * (int)Math.Floor((1.0/(int.Parse(mitaPainettiin.Tag.ToString())) * montakoKuvaaSarjassa));
196            AloitaUusiPeli();
197        }
198
199
200        #endregion
201        public void AloitaUusiPeli()
202        {
203            ClearAll();
204            Level.BackgroundColor = Color.LightCyan;
205            LisaaPiilotusajastin();
206            //montakoKorttia = montakoKuvaa * 2;
207
208            // Laitetaan ensin rivejä ja sarakkeita yhtä paljon
209            montakoSaraketta = (int)Math.Sqrt(montakoKorttia);
210            // Kortit vähän mukavempaan muotoon, koska näytöt on yleensä leveämpiä kuin korkeita
211            montakoSaraketta = (int)Math.Floor((3.0 / 2.0) * montakoSaraketta);
212            // Tarvittavien rivien määrä saadaan korttien määrän ja saadun sarakkeiden määrän suhteesta
213            montakoRivia = (int)Math.Ceiling((double)montakoKorttia / (double)montakoSaraketta);
214            kortit = new Kortti[montakoRivia, montakoSaraketta];
215
216            // kortin tunnusNro indeksistä, alkiot tulkitaan siten että "montako tämän tunnuksen alkiota on lisätty peliin"
217            // Tämä pitää olla ennen kuin kortit lisätään ruudulle
218            montakoKutakinKorttitunnusta = new int[montakoKorttia / 2];
219
220            KortitRuudulle();
221
222            LisaaLaskurit();
223            LisaaVuoronaytto();
224            LisaaHighLighter();
225            LataaAanet();
226
227            // Laitetaan kenttä sopivan kokoiseksi että kortit täyttävät aina mahollisimman paljon ruutukapasiteetista
228            Level.Width = montakoSaraketta * (korttienVali + kortinLeveys) + kortinLeveys;
229            Level.Height = montakoRivia * (korttienVali + kortinKorkeus) + kortinKorkeus;
230            Camera.ZoomToLevel();
231
232            PeliKayntiin();
233            AsetaNappaimet();
234        }
235
236        private void LataaAanet()
237        {
238            pariLoytyiAani = LoadSoundEffect("blim");
239            kortinKaantoAani = LoadSoundEffect("blop");
240            liikkumisAani = LoadSoundEffect("brr");
241            vuoroVaihtuuAani = LoadSoundEffect("kolmisointu");
242        }
243
244        public void LisaaPiilotusajastin()
245        {
246            piilotusAjastin = new Timer();
247            piilotusAjastin.Interval = aikaaEnnenPiilottamista;
248            piilotusAjastin.Trigger += PiilotaKaannetyt;
249            Add(piilotusAjastin);
250        }
251
252        public void LisaaLaskurit()
253        {
254            pelaajan1Pisteet = new IntMeter(0);
255            Label p1teksti = new Label("Pelaaja 1 pisteet: ");
256            Label pisteNaytto1 = new Label();
257            Label p1VoitotTeksti = new Label("Pelaaja 1 voitot: ");
258            Label p1Voitot = new Label(pelaaja1.Pisteet.ToString());
259
260            p1teksti.TextColor = Color.Black;
261            p1teksti.Position = new Vector(Screen.Left + 140, Screen.Bottom + 70);
262            pisteNaytto1.Position = new Vector(p1teksti.X + (p1teksti.Width / 2) + 10, p1teksti.Y);
263            pisteNaytto1.TextColor = Color.Blue;
264            pisteNaytto1.BindTo(pelaajan1Pisteet);
265            p1VoitotTeksti.Position = new Vector(Screen.Left + 140 - ((p1teksti.Width - p1VoitotTeksti.Width) / 2), p1teksti.Y - 30);
266            p1Voitot.Position = new Vector(p1VoitotTeksti.X + (p1VoitotTeksti.Width / 2) + 10, p1VoitotTeksti.Y);
267
268            Add(p1teksti);
269            Add(pisteNaytto1);
270            Add(p1VoitotTeksti);
271            Add(p1Voitot);
272
273            pelaajan2Pisteet = new IntMeter(0);
274            Label p2teksti = new Label("Pelaaja 2 pisteet: ");
275            Label pisteNaytto2 = new Label();
276            Label p2VoitotTeksti = new Label("Pelaaja 2 voitot: ");
277            Label p2Voitot = new Label(pelaaja2.Pisteet.ToString());
278
279            p2teksti.TextColor = Color.Black;
280            p2teksti.X = Screen.Right - 140;
281            p2teksti.Y = Screen.Bottom + 70;
282            pisteNaytto2.X = p2teksti.X + (p2teksti.Width / 2) + 10;
283            pisteNaytto2.Y = p2teksti.Y;
284            pisteNaytto2.TextColor = Color.Red;
285            pisteNaytto2.BindTo(pelaajan2Pisteet);
286            p2VoitotTeksti.X = Screen.Right - 140 + ((p2teksti.Width - p2VoitotTeksti.Width) / 2);
287            p2VoitotTeksti.Y = p2teksti.Y - 30;
288            p2Voitot.Position = new Vector(p2VoitotTeksti.X + (p2VoitotTeksti.Width / 2) + 10, p2VoitotTeksti.Y);
289
290            Add(p2teksti);
291            Add(pisteNaytto2);
292            Add(p2VoitotTeksti);
293            Add(p2Voitot);
294
295            korttejaLoydetty = new IntMeter(0);
296            korttejaLoydetty.MaxValue = montakoKorttia;
297            korttejaLoydetty.UpperLimit += KaikkiLoydetty;
298        }
299
300        /// <summary>
301        /// Korostetaan ensimmäinen kortti.
302        /// </summary>
303        public void PeliKayntiin()
304        {
305            kaannetyt = new List<Kortti>();
306            korostettuKortti = new Paikka(0, 0);
307            KorostaKortti(new Paikka(0, 0));
308            vuorossaOlevaPelaaja = pelaaja1;
309            vuoronaytto.Text = "Pelaaja 1";
310            MessageDisplay.Add("Pelaaja 1 aloittaa pelin!");
311        }
312
313
314        public void KaikkiLoydetty(int arvo)
315        {
316            Mouse.IsCursorVisible = true;
317            String voittoteksti;
318            if (pelaajan1Pisteet > pelaajan2Pisteet)
319            {
320                voittoteksti = "Pelaaja 1 voitti! ";
321                pelaaja1.Pisteet++;
322            }
323            else if (pelaajan2Pisteet > pelaajan1Pisteet)
324            {
325                voittoteksti = "Pelaaja 2 voitti! ";
326                pelaaja2.Pisteet++;
327            }
328            else
329            {
330                voittoteksti = "Tasapeli! ";
331            }
332
333            MessageBox mb = new MessageBox(
334                "Peli päättyi",
335                "" + voittoteksti + "Aloita uusi peli painamalla OK.");
336            mb.Accepted += OKPainettu;
337            Add(mb);
338        }
339
340        public void OKPainettu()
341        {
342            AloitaUusiPeli();
343        }
344
345        public void LisaaVuoronaytto()
346        {
347            Label vuorossaNyt = new Label("Vuorossa nyt");
348            vuorossaNyt.X = 0;
349            vuorossaNyt.Y = Screen.Bottom + 70;
350            vuoronaytto = new Label();
351            vuoronaytto.X = 0;
352            vuoronaytto.Y = vuorossaNyt.Y - 30;
353            Add(vuorossaNyt);
354            Add(vuoronaytto);
355        }
356
357        void LisaaHighLighter()
358        {
359            highlighter = new GameObject(kortinLeveys, kortinKorkeus);
360            highlighter.Image = LoadImage("highlight1");
361            Add(highlighter);
362        }
363
364        private int LataaKuvat()
365        {
366            List<String> kuvat = new List<string>();
367            String[] kuvatiedostot = Directory.GetFiles(korttisarja);
368            return kuvatiedostot.Length;
369        }
370
371        void LisaaPelaajat(int montakoPelaajaa)
372        {
373            // Toistaiseksi tehdään "manuaalisesti" kaksi pelaajaa
374            pelaaja1 = new Pelaaja("", 1, Color.Cyan);
375            pelaaja2 = new Pelaaja("", 2, Color.MediumPurple);
376        }
377
378        void AsetaNappaimet()
379        {
380            Keyboard.Listen(Key.Left, ButtonState.Pressed, KortinValinta, null, Suunta.Vasen);
381            Keyboard.Listen(Key.Right, ButtonState.Pressed, KortinValinta, null, Suunta.Oikea);
382            Keyboard.Listen(Key.Up, ButtonState.Pressed, KortinValinta, null, Suunta.Ylos);
383            Keyboard.Listen(Key.Down, ButtonState.Pressed, KortinValinta, null, Suunta.Alas);
384            Keyboard.Listen(Key.Space, ButtonState.Pressed, KaannaKortti, null);
385            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, null);
386        }
387
388        void Lopeta()
389        {
390            Exit();
391        }
392
393        #region Liikkuminen
394        void KorostaKortti(Paikka korostettavaKortti)
395        {
396            korostettavaKortti = TarkistaKortinNro(korostettavaKortti);
397            highlighter.Position = new Vector(KortinX(korostettavaKortti.Sarake), KortinY(korostettavaKortti.Rivi));
398            Kortti.PuoliEsilla puoliesilla = kortit[korostettavaKortti.Rivi, korostettavaKortti.Sarake].KumpiPuoliEsilla();
399            korostettuKortti = korostettavaKortti;
400            liikkumisAani.Play();
401        }
402
403        /// <summary>
404        /// Aliohjelma pitää huolen, että valittu kortti on aina
405        /// rivi- ja sarakeindeksien sisäpuolella. Toisin sanoen
406        /// rivistä/sarakkeesta "yli" hypättäessä kursori palautuu
407        /// oikeaan paikkaan.
408        /// </summary>
409        /// <param name="kortinNro">Kortin rivi, sarake</param>
410        /// <returns>"Korjatut" koordinaatit</returns>
411        private Paikka TarkistaKortinNro(Paikka paikka)
412        {
413            // Viimeisen rivin jälkeen palataan ensimmäiselle riville
414            if (paikka.Rivi >= montakoRivia)
415                paikka.Rivi = 0;
416
417            // Viimeisen sarakkeen jälkeen palataan ensimmäiseen sarakkeeseen
418            if (paikka.Sarake >= montakoSaraketta)
419                paikka.Sarake = 0;
420
421            // Ensimmäisestä rivistä "taaksepäin" liikuttaessa
422            // hypätään viimeiselle riville
423            if (paikka.Rivi < 0)
424                paikka.Rivi = montakoRivia - 1;
425
426            // Ensimmäisestä sarakkeesta "taaksepäin" liikuttaessa
427            // hypätään viimeiseen sarakkeeseen
428            if (paikka.Sarake < 0)
429                paikka.Sarake = montakoSaraketta - 1;
430
431            // Mentiin pelipakan "tyhjälle alueelle"
432            if (kortit[paikka.Rivi, paikka.Sarake] == null)
433                paikka = TultiinNullViitteeseen(paikka);
434
435            return paikka;
436        }
437
438        private Paikka TultiinNullViitteeseen(Paikka kortinPaikka)
439        {
440            if (mihinSuuntaanMenossa == Suunta.Vasen)
441                return new Paikka(kortinPaikka.Rivi, (montakoKorttia % montakoSaraketta) - 1);
442            if (mihinSuuntaanMenossa == Suunta.Oikea)
443                return new Paikka(kortinPaikka.Rivi, 0);
444            if (mihinSuuntaanMenossa == Suunta.Ylos)
445                return new Paikka(montakoRivia - 2, kortinPaikka.Sarake);
446
447            // alas
448            return new Paikka(0, kortinPaikka.Sarake);
449        }
450
451        void KortinValinta(Suunta suunta)
452        {
453            mihinSuuntaanMenossa = suunta;
454            if (mihinSuuntaanMenossa == Suunta.Vasen)
455                KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake - 1));
456
457            if (mihinSuuntaanMenossa == Suunta.Oikea)
458                KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake + 1));
459
460            if (mihinSuuntaanMenossa == Suunta.Ylos)
461                KorostaKortti(new Paikka(korostettuKortti.Rivi - 1, korostettuKortti.Sarake));
462
463            if (mihinSuuntaanMenossa == Suunta.Alas)
464                KorostaKortti(new Paikka(korostettuKortti.Rivi + 1, korostettuKortti.Sarake));
465        }
466        #endregion
467
468        #region Kääntäminen ja parin löytyminen
469
470        public bool VoikoKorttiaKaantaa(Kortti kortti)
471        {
472            bool onkoKaantymassa = kortti.OnkoLiikkeessa();
473
474            // Jos kortti "on jo löydetty", niin sitä ei voi missään tapauksessa kääntää
475            bool onkoPoistettuPelista = kortit[korostettuKortti.Rivi, korostettuKortti.Sarake].PoistettuPelista;
476
477            // Ei käännetä kahta kertaa samaa korttia
478            if (kaannetyt.Count == 0 || kortit[korostettuKortti.Rivi, korostettuKortti.Sarake] != kaannetyt[0])
479            {
480                if (!onkoPoistettuPelista && !onkoKaantymassa)
481                {
482                    return true;
483                }
484            }
485            return false;
486        }
487
488        void KaannaKortti()
489        {
490            if (VoikoKorttiaKaantaa(kortit[korostettuKortti.Rivi, korostettuKortti.Sarake]))
491            {
492                kortit[korostettuKortti.Rivi, korostettuKortti.Sarake].Kaanna();
493                kaannetyt.Add(kortit[korostettuKortti.Rivi, korostettuKortti.Sarake]);
494                kortinKaantoAani.Play();
495
496                if (kaannetyt.Count == 2) // Tasan kaksi korttia käännetään yhdellä vuorolla
497                {
498                    if (kaannetyt[0].Tunniste == kaannetyt[1].Tunniste) // Käännetyt kortit muodostavat parin
499                    {
500                        foreach (Kortti kaannetty in kaannetyt)
501                        {
502                            RajaytaKortti(kaannetty);
503                            kaannetty.PoistettuPelista = true;
504                        }
505                        PariLoytyi();
506                    }
507                    else
508                    {
509                        // Jos kaksi korttia on käännetty niin ajastin lähtee käyntiin eikä sinä aikana voi kääntää kortteja
510                        Keyboard.Disable(Key.Space);
511                        piilotusAjastin.Start();
512                    }
513                }
514            }
515        }
516
517        void PiilotaKaannetyt(Timer t)
518        {
519            foreach (var item in kaannetyt)
520            {
521                item.Kaanna();
522            }
523            kaannetyt.Clear();
524            piilotusAjastin.Stop();
525            Keyboard.Enable(Key.Space);
526            VuoroVaihtuu();
527        }
528
529        public void PariLoytyi()
530        {
531            pariLoytyiAani.Play();
532            kaannetyt.Clear();
533
534            if (vuorossaOlevaPelaaja.Equals(pelaaja1))
535            {
536                pelaajan1Pisteet.Value++;
537            }
538            else if (vuorossaOlevaPelaaja.Equals(pelaaja2))
539            {
540                pelaajan2Pisteet.Value++;
541            }
542
543            korttejaLoydetty.Value += 2;
544        }
545
546        /// <summary>
547        /// Näpsäkkä korttiin kohdistettu "räjähdys" tai mikä efekti lie.
548        /// </summary>
549        /// <param name="kaannetty">Kortti jonka päälle räjähdys tulee.</param>
550        public void RajaytaKortti(Kortti kortti)
551        {
552            Image i = kortti.KuvaPuoliTekstuuri;
553            ExplosionSystem e = new ExplosionSystem(i, 10);
554            e.MinLifetime = 0.3;
555            e.MaxLifetime = 1.5;
556            e.MinVelocity = 1;
557            e.MaxVelocity = 300;
558            e.MinScale = 0.01;
559            e.MaxScale = 0.05;
560            Add(e);
561            e.AddEffect(kortti.Position.X, kortti.Position.Y, 10);
562        }
563
564        public void VuoroVaihtuu()
565        {
566            vuoroVaihtuuAani.Play();
567
568            if (vuorossaOlevaPelaaja.Equals(pelaaja1))
569            {
570                vuorossaOlevaPelaaja = pelaaja2;
571                highlighter.Image = LoadImage("highlight2");
572                vuoronaytto.Text = "Pelaaja 2";
573                VuoronVaihtumisEfekti("pelaaja2");
574                return;
575            }
576
577            if (vuorossaOlevaPelaaja.Equals(pelaaja2))
578            {
579                vuorossaOlevaPelaaja = pelaaja1;
580                highlighter.Image = LoadImage("highlight1");
581                vuoronaytto.Text = "Pelaaja 1";
582                VuoronVaihtumisEfekti("pelaaja1");
583                return;
584            }
585        }
586
587        public void VuoronVaihtumisEfekti(String kuvanNimi)
588        {
589            ExplosionSystem e = new ExplosionSystem(LoadImage(kuvanNimi), 1, false);
590            Add(e);
591            e.MinAcceleration = 0.0;
592            e.MaxAcceleration = 0.0;
593            e.MinLifetime = 1;
594            e.MaxLifetime = 1;
595            e.MinVelocity = 0.0;
596            e.MaxVelocity = 0.0;
597            e.MinRotationSpeed = 0.0;
598            e.MaxRotationSpeed = 0.0;
599            e.MinRotation = 0.0;
600            e.MaxRotation = 0.0;
601            e.AddEffect(0, 0, 1);
602        }
603
604        #endregion
605
606        #region Kortit ruudulle
607
608        /// <summary>
609        /// Aliohjelma lisää halutun määrän kortteja
610        /// taulukkoon ja edelleen ruudulle.
611        /// </summary>
612        /// <param name="montakoKorttiaLisataan">Kuinka monta korttia taulukkoon (attribuutti) lisätään.</param>
613        void KortitRuudulle()
614        {
615            int montakoKorttiaLisatty = 0;
616
617            for (int r = 0; r < kortit.GetLength(0); r++) // Rivit
618            {
619                for (int s = 0; s < kortit.GetLength(1); s++) // Sarakkeet
620                {
621                    // Jos tarvittava määrä kortteja on lisätty,
622                    // laitetaan loppuihin taulukon alkioihin null-viite
623                    if (montakoKorttia == montakoKorttiaLisatty)
624                    {
625                        kortit[r, s] = null;
626                        continue;
627                    }
628
629                    kortit[r, s] = TeeKortti();
630                    kortit[r, s].KuvaPuoliTekstuuri = Image.FromFile(korttisarja + "/" + kortit[r, s].Tunniste.ToString() + ".jpg");
631                    Add(kortit[r, s]);
632
633                    kortit[r, s].X = KortinX(s);
634                    kortit[r, s].Y = KortinY(r);
635                    montakoKorttiaLisatty++;
636                }
637            }
638        }
639
640        public double KortinX(int sarake)
641        {
642            return (-(montakoSaraketta * (kortinLeveys + korttienVali)) / 2) + (sarake * (kortinLeveys + korttienVali)) + korttienVali;
643        }
644
645        public double KortinY(int rivi)
646        {
647            // Viimeinen termi tulee siitä että viimeisen kortin perässä ei tarvita välistystä
648            return ((montakoRivia) * (kortinKorkeus + korttienVali)) / 2 - rivi * (kortinKorkeus + korttienVali) - korttienVali;
649        }
650
651        public Kortti TeeKortti()
652        {
653            Image takaTekstuuri = LoadImage("taka");
654            int tunniste = AnnaTunniste();
655            return new Kortti(kortinLeveys, kortinKorkeus, false, takaTekstuuri, tunniste);
656        }
657
658        private int AnnaTunniste()
659        {
660            int tunniste;
661            while (true)
662            {
663                tunniste = RandomGen.NextInt(0, montakoKutakinKorttitunnusta.Length - 1);
664                if (montakoKutakinKorttitunnusta[tunniste] < 2)
665                {
666                    montakoKutakinKorttitunnusta[tunniste]++;
667                    break;
668                }
669            }
670            return tunniste;
671        }
672        #endregion
673    }
674}
Note: See TracBrowser for help on using the repository browser.