source: 2010/23/hniemi/JyTris/JyTris/Peli.cs @ 1479

Revision 1479, 10.1 KB checked in by hniemi, 11 years ago (diff)

Palikan kääntö lisätty, pistenäytön teko aloitettu.

Line 
1using System;
2using Jypeli;
3using Jypeli.Widgets;
4using Jypeli.Assets;
5
6namespace JyTris
7{
8
9    /// <summary>
10    /// JyTris
11    ///
12    /// Peli on tetrisklooni, joka on tarkoituksena toteuttaa JyPelillä
13    /// mahdollisimman yksinkertaisesti.
14    ///
15    /// Seuraavana tulossa:
16    /// - Lisääntyvät pisteet
17    /// - Loput palikat
18    /// </summary>
19    public class Peli : Game
20    {
21        const int leveys = 10;
22        const int korkeus = 26;
23        const int palikkojenSivu = 30;
24
25        GameObject[][] pelikentta;
26        ITetrispalikka aktiivinenPalikka;
27
28        Timer tiputusajastin;
29        double vaikeusaste = 0.2;
30
31        IntMeter pisteet = new IntMeter(0);
32        Label pistenaytto;
33
34        protected override void Begin()
35        {
36            LuoPelikentta();
37            //LuoHud();
38            AsetaNappaimet();
39            KaynnistaPeli();
40        }
41
42        /// <summary>
43        /// Käynnistää pelin
44        ///
45        /// Luo ensimmäisen palikan ja tekee ajastimen.
46        /// </summary>
47        void KaynnistaPeli()
48        {
49            LuoPalikka();
50
51            tiputusajastin = new Timer();
52            tiputusajastin.Interval = vaikeusaste;
53            tiputusajastin.Trigger += Laske;
54            tiputusajastin.Start();
55        }
56
57        /// <summary>
58        /// Tuhoaa täydet rivit kentältä
59        /// </summary>
60        void TuhoaTaydet()
61        {
62            bool tyhjia;
63
64            for (int i = 0; i < pelikentta.Length; i++)
65            {
66                tyhjia = false;
67                for (int j = 0; j < pelikentta[i].Length; j++)
68                {
69                    if (pelikentta[i][j].Color == Color.TransparentWhite) tyhjia = true;
70                }
71
72                if (!tyhjia)
73                {
74                    TuhoaRivi(i);
75                }
76            }
77        }
78
79        /// <summary>
80        /// Tuhoaa kaikki palikat kentältä.
81        /// </summary>
82        void TuhoaKaikki()
83        {
84            //Tässä käydään lävitse kaikki laatikot ja asetetaan ne läpinäkyviksi.
85            for (int i = 0; i < pelikentta.Length; i++)
86            {
87                for (int j = 0; j < pelikentta[i].Length; j++)
88                {
89                    pelikentta[i][j].Color = Color.TransparentWhite;
90                }
91            }
92        }
93
94        /// <summary>
95        /// Tuhoaa indeksiä vastaavan rivin ja tiputtaa sen päällä olevia rivejä.
96        /// </summary>
97        /// <param name="rivinIndeksi">Tiputettavan rivin indeksi</param>
98        void TuhoaRivi(int rivinIndeksi)
99        {
100            if (rivinIndeksi > pelikentta.Length || rivinIndeksi < 0) return;
101
102            for (int i = rivinIndeksi; i > 0; i--)
103            {
104                for (int j = 0; j < pelikentta[i].Length; j++)
105                {
106                    pelikentta[i][j].Color = pelikentta[i - 1][j].Color;
107                }
108            }
109
110            for (int i = 0; i < pelikentta[0].Length; i++)
111            {
112                pelikentta[0][i].Color = Color.TransparentWhite;
113            }
114        }
115
116        void LuoHud()
117        {
118            pistenaytto = new Label(80, 20);
119            pistenaytto.BindTo(pisteet);
120            Add(pistenaytto);
121
122            //pistenaytto.Position.X = Screen.RightSafe - 40;
123        }
124
125        /// <summary>
126        /// Luo pelikentän ylhäällä määrätyistä vakioista
127        /// </summary>
128        void LuoPelikentta()
129        {
130            //Tässä säädetään pelialueen koko, jotta seinät tulevat oikeille kohdille
131            Level.Width = leveys * palikkojenSivu;// + leveys;
132            Level.Height = korkeus * palikkojenSivu;// + korkeus;
133            Level.CreateBorders(true);
134
135            /*
136             * Koska pelikenttä on kaksiulotteinen taulukko, joudumme luomaan
137             * ensiksi taulukon sarakkeet, jotta voimme luoda rivit.
138             */
139            pelikentta = new GameObject[korkeus][];
140            for (int i = 0; i < pelikentta.Length; i++)
141            {
142                pelikentta[i] = new GameObject[leveys];
143            }
144
145            //Tässä luodaan pelikentän "laatiko" ja sijoitetaan ne oikeille kohdilleen.
146            for (int i = 0; i < pelikentta.Length; i++)
147            {
148                for (int j = 0; j < pelikentta[i].Length; j++)
149                {
150                    pelikentta[i][j] = new GameObject(palikkojenSivu, palikkojenSivu, Shapes.Rectangle);
151                    pelikentta[i][j].Color = Color.TransparentWhite;
152                    pelikentta[i][j].X = Level.Left + (palikkojenSivu / 2) + j * (palikkojenSivu);
153                    pelikentta[i][j].Y = Level.Top - (palikkojenSivu / 2) - i * (palikkojenSivu);
154                    Add(pelikentta[i][j]);
155                }
156            }
157        }
158
159        /// <summary>
160        /// Asettaa näppäimet.
161        /// </summary>
162        void AsetaNappaimet()
163        {
164            Vector vasemmalle = new Vector(-1, 0);
165            Vector oikealle = new Vector(1, 0);
166            Vector alas = new Vector(0, 1);
167
168            Keyboard.Listen(Key.Left, ButtonState.Pressed, Liikuta, "Liikuttaa palikkaa vasemmalle", vasemmalle);
169            Keyboard.Listen(Key.Right, ButtonState.Pressed, Liikuta, "Liikuttaa palikkaa oikealle", oikealle);
170            Keyboard.Listen(Key.Down, ButtonState.Down, Laske, "Liikuttaa palikkaa alas", tiputusajastin);
171            Keyboard.Listen(Key.Up, ButtonState.Pressed, Kaanna, "Kääntää palikkaa");
172            Keyboard.Listen(Key.Space, ButtonState.Pressed, Tiputa, "Tiputtaa palikan");
173        }
174
175        /// <summary>
176        /// Liikuttaa palikkaa halutun verran.
177        /// </summary>
178        /// <param name="suunta">X ja Y oltava kokonaislukuja.</param>
179        void Liikuta(Vector suunta)
180        {
181            PaivitaPalikka(aktiivinenPalikka, Color.TransparentWhite);
182
183            if (VoikoSiirtaa(suunta, aktiivinenPalikka))
184            {
185                aktiivinenPalikka.Liikuta(suunta);
186            }
187           
188            PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
189        }
190
191        /// <summary>
192        /// Kääntää palikkaa
193        /// </summary>
194        void Kaanna()
195        {
196            PaivitaPalikka(aktiivinenPalikka, Color.TransparentWhite);
197
198            //Tämä kohta tarkistaa, voiko palikkaa kääntää
199            //Jos ei voi, niin poistutaan.
200            Vector[] tulevaSijainti = aktiivinenPalikka.TulevaKaanto();
201            for (int i = 0; i < tulevaSijainti.Length; i++)
202            {
203                if (!OnkoTyhja(tulevaSijainti[i])) 
204                {
205                    PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
206                    return;
207                } 
208            }
209
210            aktiivinenPalikka.Kaanna();
211            PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
212        }
213
214        /// <summary>
215        /// Laskee palikkaa yhdellä. Jos palikkaa ei voi laskea,
216        /// lähettää uuden palikan.
217        /// </summary>
218        /// <param name="timer">Ei käytössä</param>
219        void Laske(Timer timer)
220        {
221            PaivitaPalikka(aktiivinenPalikka, Color.TransparentWhite);
222
223            if (!VoikoSiirtaa(new Vector(0,1), aktiivinenPalikka))
224            {
225                PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
226                TuhoaTaydet();
227                LuoPalikka();
228                return;
229            }
230            aktiivinenPalikka.Liikuta(new Vector(0, 1));
231            PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
232
233        }
234
235        /// <summary>
236        /// Tiputtaa palikkan kokonaan alas.
237        /// </summary>
238        void Tiputa()
239        {
240            ITetrispalikka palikka = aktiivinenPalikka;
241            while (aktiivinenPalikka == palikka) Laske(tiputusajastin);
242        }
243
244        bool VoikoSiirtaa(Vector[] siirrot, ITetrispalikka palikka)
245        {
246            Vector[] sijainnit = palikka.Sijainti();
247
248            for (int i = 0; i < siirrot.Length; i++)
249            {
250                if (!OnkoTyhja(sijainnit[i] + siirrot[i])) return false;
251            }
252            return true;
253        }
254
255        bool VoikoSiirtaa(Vector siirto, ITetrispalikka palikka)
256        {
257            Vector[] siirrot = new Vector[4];
258            for (int i = 0; i < siirrot.Length; i++)
259            {
260                siirrot[i] = siirto;
261            }
262            return VoikoSiirtaa(siirrot, palikka);
263        }
264
265        /// <summary>
266        /// Tarkistaa, onko annetut paikka tyhjä
267        ///
268        /// Paikka on tyhjä, jos sen väri on Color.TransparentWhite
269        /// </summary>
270        /// <param name="paikka">X ja Y oltava kokonaislukuja</param>
271        /// <returns>true, jos paikka on tyhjä</returns>
272        bool OnkoTyhja(Vector paikka)
273        {
274            if (paikka.X > leveys-1 || paikka.X < 0) return false;
275            if (paikka.Y > korkeus-1 || paikka.Y < 0) return false;
276
277            if (pelikentta[(int)paikka.Y][(int)paikka.X].Color == Color.TransparentWhite) return true;
278            return false;
279        }
280
281        /// <summary>
282        /// Värittää paikkaa vastaavat laatikot annetulla värillä
283        /// </summary>
284        /// <param name="palikka">Tämän sijainti väritetään</param>
285        /// <param name="vari">Väri, jolla väritetään</param>
286        void PaivitaPalikka(ITetrispalikka palikka, Color vari)
287        {
288            Vector[] sijainnit = palikka.Sijainti();
289
290            for (int i = 0; i < sijainnit.Length; i++)
291            {
292                pelikentta[(int)sijainnit[i].Y][(int)sijainnit[i].X].Color = vari;
293            }
294        }
295
296        /// <summary>
297        /// Luo palikan keskelle ylälaitaa
298        ///
299        /// Tulee antamaan satunnaisen palikan
300        /// </summary>
301        void LuoPalikka()
302        {
303            aktiivinenPalikka = new Pitka(leveys / 2);
304            PaivitaPalikka(aktiivinenPalikka, aktiivinenPalikka.Vari());
305        }
306
307    }
308}
Note: See TracBrowser for help on using the repository browser.