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

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