source: 2010/24/anlakane/Muistipeli/Peli2.cs @ 1020

Revision 1020, 10.2 KB checked in by anlakane, 11 years ago (diff)
Line 
1using System;
2using System.IO;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.ScreenObjects;
6using Jypeli.Assets;
7
8namespace Muistipeli
9{
10    public class Peli2 : Game
11    {
12        int montakoRivia;
13        int montakoSaraketta;
14        bool voikoKaantaa;
15
16        double korttienVali = 20.0;
17
18        double kortinLeveys = 50;
19        double kortinKorkeus = 70;
20        Kortti[,] kortit; // rivit, sarakkeet
21        int[,] korostettuKortti;
22        int montakoKorttia;
23        public enum Suunta { Vasen, Oikea, Ylos, Alas }
24        Suunta mihinSuuntaanMenossa;
25
26        GameObject highlighter;
27        List<Kortti> kaannetyt;
28        Timer piilotusAjastin;
29        double aikaaEnnenPiilottamista = 2;
30        protected override void Begin()
31        {
32            piilotusAjastin = new Timer();
33            piilotusAjastin.Interval = aikaaEnnenPiilottamista;
34            piilotusAjastin.Trigger += PiilotaKaannetyt;
35            Add(piilotusAjastin);
36
37            LisaaKuvat();
38
39            montakoKorttia = 52;
40            kaannetyt = new List<Kortti>();
41
42            // Laitetaan ensin rivejä ja sarakkeita yhtä paljon
43            montakoSaraketta = (int)Math.Sqrt(montakoKorttia);
44            // Sitte laitetaan kortit vähän mukavempaan muotoon kun näytöt on yleensä leveämpiä kuin korkeita
45            montakoSaraketta = (int)Math.Floor((3.0 / 2.0) * montakoSaraketta);
46            // Tarvittavien rivien määrä saadaan korttien määrän ja saadun sarakkeiden määrän suhteesta
47            montakoRivia = (int)Math.Ceiling((double)montakoKorttia / (double)montakoSaraketta);
48            kortit = new Kortti[montakoRivia, montakoSaraketta];
49            KortitRuudulle(montakoKorttia);
50            LisaaHighLighter();
51
52            // Laitetaan kenttä sopivan kokoiseksi että kortit täyttävät aina mahollisimman paljon ruutukapasiteetista
53            Level.Width = montakoSaraketta * (korttienVali + kortinLeveys) + kortinLeveys;
54            Level.Height = montakoRivia * (korttienVali + kortinKorkeus) + kortinKorkeus;
55            Camera.ZoomToLevel();
56
57            AloitaPeli();
58            AsetaNappaimet();
59        }
60
61        private void LisaaKuvat()
62        {
63            List<String> kuvat = new List<string>();
64            String[] kuvatiedostot = Directory.GetFiles("Content");
65            char[] erottimet = new char[] { '\\', '.' };
66            foreach (var kuva in kuvatiedostot)
67            {
68                String[] splitattu = kuva.Split(erottimet);
69                if (splitattu.Length > 1)
70                {
71                    if (splitattu[1] != "highlight" && splitattu[1] != "taka")
72                        kuvat.Add(splitattu[1]);
73                }
74            }
75        }
76
77        /// <summary>
78        /// Korostetaan ensimmäinen kortti.
79        /// </summary>
80        void AloitaPeli()
81        {
82            korostettuKortti = new int[2, 1];
83            KorostaKortti(new int[2, 1] { { 0 }, { 0 } });
84            voikoKaantaa = true;
85        }
86
87        void LisaaHighLighter()
88        {
89            highlighter = new GameObject(kortinLeveys, kortinKorkeus);
90            highlighter.Image = LoadImage("highlight");
91            Add(highlighter);
92        }
93
94        void AsetaNappaimet()
95        {
96            Keyboard.Listen(Key.Left, ButtonState.Pressed, KortinValinta, null, Suunta.Vasen);
97            Keyboard.Listen(Key.Right, ButtonState.Pressed, KortinValinta, null, Suunta.Oikea);
98            Keyboard.Listen(Key.Up, ButtonState.Pressed, KortinValinta, null, Suunta.Ylos);
99            Keyboard.Listen(Key.Down, ButtonState.Pressed, KortinValinta, null, Suunta.Alas);
100            Keyboard.Listen(Key.Space, ButtonState.Pressed, KaannaKortti, null);
101            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, null);
102        }
103
104        void Lopeta()
105        {
106            Exit();
107        }
108
109        void KaannaKortti()
110        {
111            if (voikoKaantaa)
112            {
113                // Ei käännetä kahta kertaa samaa korttia
114                if (kaannetyt.Count == 0 || kortit[korostettuKortti[0, 0], korostettuKortti[1, 0]] != kaannetyt[0])
115                {
116                    kortit[korostettuKortti[0, 0], korostettuKortti[1, 0]].Kaanna();
117                    kaannetyt.Add(kortit[korostettuKortti[0, 0], korostettuKortti[1, 0]]);
118
119                    if (kaannetyt.Count == 2)
120                    {
121                        // Jos kaksi korttia on käännetty niin ajastin lähtee käyntiin eikä sinä aikana voi kääntää kortteja
122                        voikoKaantaa = false;
123                        piilotusAjastin.Start();
124                    }
125                }
126            }
127        }
128
129        void PiilotaKaannetyt(Timer t)
130        {
131            foreach (var item in kaannetyt)
132            {
133                item.Kaanna();
134            }
135            kaannetyt.Clear();
136            piilotusAjastin.Stop();
137            voikoKaantaa = true;
138        }
139
140        void KorostaKortti(int[,] kortinNro)
141        {
142            kortinNro = TarkistaKortinNro(kortinNro);
143            highlighter.Position = new Vector(KortinX(kortinNro[1, 0]), KortinY(kortinNro[0, 0]));
144            Kortti.PuoliEsilla puoliesilla = kortit[kortinNro[0, 0], kortinNro[1, 0]].KumpiPuoliEsilla();
145            korostettuKortti = kortinNro;
146        }
147
148        /// <summary>
149        /// Aliohjelma pitää huolen, että valittu kortti on aina
150        /// rivi- ja sarakeindeksien sisäpuolella. Toisin sanoen
151        /// rivistä/sarakkeesta "yli" hypättäessä kursori palautuu
152        /// oikeaan paikkaan.
153        /// </summary>
154        /// <param name="kortinNro">Kortin rivi, sarake</param>
155        /// <returns>"Korjatut" koordinaatit</returns>
156        private int[,] TarkistaKortinNro(int[,] kortinNro)
157        {
158            // Viimeisen rivin jälkeen palataan ensimmäiselle riville
159            if (kortinNro[0, 0] >= montakoRivia)
160                kortinNro[0, 0] = 0;
161
162            // Viimeisen sarakkeen jälkeen palataan ensimmäiseen sarakkeeseen
163            if (kortinNro[1, 0] >= montakoSaraketta)
164                kortinNro[1, 0] = 0;
165
166            // Ensimmäisestä rivistä "taaksepäin" liikuttaessa
167            // hypätään viimeiselle riville
168            if (kortinNro[0, 0] < 0)
169                kortinNro[0, 0] = montakoRivia - 1;
170
171            // Ensimmäisestä sarakkeesta "taaksepäin" liikuttaessa
172            // hypätään viimeiseen sarakkeeseen
173            if (kortinNro[1, 0] < 0)
174                kortinNro[1, 0] = montakoSaraketta - 1;
175
176            // Mentiin pelipakan "tyhjälle alueelle"
177            if (kortit[kortinNro[0, 0], kortinNro[1, 0]] == null)
178                kortinNro = TultiinNullViitteeseen(kortinNro);
179
180            return kortinNro;
181        }
182
183        private int[,] TultiinNullViitteeseen(int[,] kortinNro)
184        {
185            if (mihinSuuntaanMenossa == Suunta.Vasen)
186                return new int[2, 1] { { korostettuKortti[0, 0] }, { (montakoKorttia % montakoSaraketta) - 1 } };
187            if (mihinSuuntaanMenossa == Suunta.Oikea)
188                return new int[2, 1] { { korostettuKortti[0, 0] }, { 0 } };
189            if (mihinSuuntaanMenossa == Suunta.Ylos)
190                return new int[2, 1] { { montakoRivia - 2 }, { korostettuKortti[1, 0] } };
191
192            // alas
193            return new int[2, 1] { { 0 }, { korostettuKortti[1, 0] } };
194
195        }
196
197        void KortinValinta(Suunta suunta)
198        {
199            mihinSuuntaanMenossa = suunta;
200            if (mihinSuuntaanMenossa == Suunta.Vasen)
201            {
202                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] }, { korostettuKortti[1, 0] - 1 } });
203            }
204            if (mihinSuuntaanMenossa == Suunta.Oikea)
205            {
206                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] }, { korostettuKortti[1, 0] + 1 } });
207            }
208            if (mihinSuuntaanMenossa == Suunta.Ylos)
209            {
210                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] - 1 }, { korostettuKortti[1, 0] } });
211            }
212            if (mihinSuuntaanMenossa == Suunta.Alas)
213            {
214                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] + 1 }, { korostettuKortti[1, 0] } });
215
216            }
217            //KorostaKortti(kortti);
218        }
219
220        /// <summary>
221        /// Aliohjelma lisää halutun määrän kortteja
222        /// taulukkoon ja edelleen ruudulle.
223        /// </summary>
224        /// <param name="montakoKorttiaLisataan">Kuinka monta korttia taulukkoon (attribuutti) lisätään.</param>
225        void KortitRuudulle(int montakoKorttiaLisataan)
226        {
227            int montakoKorttiaLisatty = 0;
228
229            for (int r = 0; r < kortit.GetLength(0); r++) // Rivit
230            {
231                for (int s = 0; s < kortit.GetLength(1); s++) // Sarakkeet
232                {
233                    // Jos tarvittava määrä kortteja on lisätty,
234                    // laitetaan loppuihin taulukon alkioihin null-viite
235                    if (montakoKorttiaLisataan == montakoKorttiaLisatty)
236                    {
237                        kortit[r, s] = null;
238                        continue;
239                    }
240
241                    kortit[r, s] = TeeKortti();
242                    Add(kortit[r, s]);
243
244                    kortit[r, s].X = KortinX(s);
245                    kortit[r, s].Y = KortinY(r);
246
247                    montakoKorttiaLisatty++;
248                }
249            }
250        }
251
252        public double KortinX(int sarake)
253        {
254            return (-(montakoSaraketta * (kortinLeveys + korttienVali)) / 2) + (sarake * (kortinLeveys + korttienVali)) + korttienVali;
255        }
256
257        public double KortinY(int rivi)
258        {
259            // Viimeinen termi tulee siitä että viimeisen kortin perässä ei tarvita välistystä
260            return ((montakoRivia) * (kortinKorkeus + korttienVali)) / 2 - rivi * (kortinKorkeus + korttienVali) - korttienVali;
261        }
262
263        public Kortti TeeKortti()
264        {
265            Image kuvaTekstuuri = LoadImage("kortti1");
266            Image takaTekstuuri = LoadImage("taka");
267            return new Kortti(kortinLeveys, kortinKorkeus, false, kuvaTekstuuri, takaTekstuuri);
268        }
269    }
270}
Note: See TracBrowser for help on using the repository browser.