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

Revision 923, 9.0 KB checked in by anlakane, 11 years ago (diff)

Kortteja voi kääntää, enintään kaksi kerrallaan.

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        private int[,] TarkistaKortinNro(int[,] kortinNro)
129        {
130            if (kortinNro[0, 0] >= montakoRivia)
131            {
132                kortinNro[0, 0] = 0;
133            }
134
135            if (kortinNro[1, 0] >= montakoSaraketta)
136            {
137                kortinNro[1, 0] = 0;
138            }
139
140            if (kortinNro[0, 0] < 0)
141            {
142                kortinNro[0, 0] = montakoRivia - 1;
143            }
144
145            if (kortinNro[1, 0] < 0)
146            {
147                kortinNro[1, 0] = montakoSaraketta - 1;
148            }
149
150            if (kortit[kortinNro[0, 0], kortinNro[1, 0]] == null) // Mentiin pelipakan "tyhjälle alueelle"
151            {
152                kortinNro = TultiinNullViitteeseen(kortinNro);
153            }
154
155            return kortinNro;
156        }
157
158        private int[,] TultiinNullViitteeseen(int[,] kortinNro)
159        {
160            if (mihinSuuntaanMenossa == Suunta.Vasen)
161            {
162                return new int[2, 1] { { korostettuKortti[0, 0] }, { (montakoKorttia % montakoSaraketta) - 1 } };
163            }
164            if (mihinSuuntaanMenossa == Suunta.Oikea)
165            {
166                return new int[2, 1] { { korostettuKortti[0, 0] }, { 0 } };
167            }
168            if (mihinSuuntaanMenossa == Suunta.Ylos)
169            {
170                return new int[2, 1] { { montakoRivia - 2 }, { korostettuKortti[1, 0] } };
171
172            }
173
174            // alas
175            return new int[2, 1] { { 0 }, { korostettuKortti[1, 0] } };
176
177        }
178
179        void KortinValinta(Suunta suunta)
180        {
181            mihinSuuntaanMenossa = suunta;
182            if (mihinSuuntaanMenossa == Suunta.Vasen)
183            {
184                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] }, { korostettuKortti[1, 0] - 1 } });
185            }
186            if (mihinSuuntaanMenossa == Suunta.Oikea)
187            {
188                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] }, { korostettuKortti[1, 0] + 1 } });
189            }
190            if (mihinSuuntaanMenossa == Suunta.Ylos)
191            {
192                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] - 1 }, { korostettuKortti[1, 0] } });
193            }
194            if (mihinSuuntaanMenossa == Suunta.Alas)
195            {
196                KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] + 1 }, { korostettuKortti[1, 0] } });
197
198            }
199
200        }
201
202        /// <summary>
203        /// Aliohjelma lisää halutun määrän kortteja
204        /// taulukkoon ja edelleen ruudulle.
205        /// </summary>
206        /// <param name="montakoKorttiaLisataan">Kuinka monta korttia taulukkoon (attribuutti) lisätään.</param>
207        void KortitRuudulle(int montakoKorttiaLisataan)
208        {
209            int montakoKorttiaLisatty = 0;
210
211            for (int r = 0; r < kortit.GetLength(0); r++) // Rivit
212            {
213                for (int s = 0; s < kortit.GetLength(1); s++) // Sarakkeet
214                {
215                    // Jos tarvittava määrä kortteja on lisätty,
216                    // laitetaan loppuihin taulukon alkioihin null-viite
217                    if (montakoKorttiaLisataan == montakoKorttiaLisatty)
218                    {
219                        kortit[r, s] = null;
220                        continue;
221                    }
222
223                    kortit[r, s] = TeeKortti();
224                    Add(kortit[r, s]);
225
226                    kortit[r, s].X = KortinX(s);
227                    kortit[r, s].Y = KortinY(r);
228
229                    montakoKorttiaLisatty++;
230                }
231            }
232        }
233
234        public double KortinX(int sarake)
235        {
236            return (-(montakoSaraketta * (kortinLeveys + korttienVali)) / 2) + (sarake * (kortinLeveys + korttienVali)) + korttienVali;
237        }
238
239        public double KortinY(int rivi)
240        {
241            // Viimeinen termi tulee siitä että viimeisen kortin perässä ei tarvita välistystä
242            return ((montakoRivia) * (kortinKorkeus + korttienVali)) / 2 - rivi * (kortinKorkeus + korttienVali) - korttienVali;
243        }
244
245        public Kortti TeeKortti()
246        {
247            Image kuvaTekstuuri = LoadImage("kortti1");
248            Image takaTekstuuri = LoadImage("taka");
249            return new Kortti(kortinLeveys, kortinKorkeus, false, kuvaTekstuuri, takaTekstuuri);
250        }
251    }
252}
Note: See TracBrowser for help on using the repository browser.