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

Revision 1038, 23.9 KB checked in by anlakane, 11 years ago (diff)

Vähän kivoja efektejä ja ääniä. Korttien määrän voi "valita" alussa.

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