source: 2010/31/mimakrja/SeaWar/Peli.cs @ 1666

Revision 1666, 10.5 KB checked in by mimakrja, 10 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Widgets;
5using Jypeli.Assets;
6
7public class LaivanPala : GameObject
8{
9    public bool Ammuttu;
10
11    public LaivanPala(double leveys, double korkeus)
12        : base(leveys, korkeus)
13    {
14        Ammuttu = false;
15    }
16
17    public void Ammu()
18    {
19        this.Ammuttu = true;
20    }
21}
22
23public class Peli : Game
24{
25    const int ruudunLeveys = 50;
26    const int ruudunKorkeus = 50;
27    Vector kursorinAllaOlevaPiste;
28    GameObject kursori;
29    List<LaivanPala> pelaajan1Laivat;
30    List<LaivanPala> pelaajan2Laivat;
31    List<GameObject> pelaajan1AmmututPisteet;
32    List<GameObject> pelaajan2AmmututPisteet;
33
34    int vuorossaOlevaPelaaja = 1;
35    Label vuoroNaytto;
36
37    Image vesiKuva = LoadImage("SeaWarMeri");
38    Image laivaKuva = LoadImage("SeaWarLaiva");
39    Image laivaAmmuttuKuva = LoadImage("SeaWarLaiva_ammuttu");
40
41    protected override void Begin()
42    {
43        LuoKentta();
44        LisaaKontrollit();
45        Camera.ZoomToLevel();
46    }
47
48    void LisaaKontrollit()
49    {
50        kursori = new GameObject(10, 10);
51        kursori.Color = Color.Red;
52        Add(kursori, 1);
53        Mouse.IsCursorVisible = true;
54        Mouse.ListenMovement(0.1, LiikutaTahtainta, "Liikuta tähtäintä");
55        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, Ammu, "Ammu");
56        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
57
58    }
59
60    void LiikutaTahtainta(AnalogState hiirenTila)
61    {
62        double jjX = (Level.Left + Mouse.PositionOnWorld.X) % ruudunLeveys;
63        double lahinX = jjX;
64        double jjY = (Mouse.PositionOnWorld.Y) % ruudunKorkeus;
65        double lahinY = jjY;
66        if (jjX < 25) lahinX = Mouse.PositionOnWorld.X - jjX;
67        if (jjX >= 25) lahinX = Mouse.PositionOnWorld.X + (ruudunLeveys - jjX);
68        if (jjY < 25) lahinY = Mouse.PositionOnWorld.Y - jjY;
69        if (jjY >= 25) lahinY = Mouse.PositionOnWorld.Y + (ruudunKorkeus - jjY);
70        kursori.X = lahinX - 25;
71        kursori.Y = lahinY - 25;
72        kursorinAllaOlevaPiste.X = kursori.X;
73        kursorinAllaOlevaPiste.Y = kursori.Y;
74    }
75
76    void PiilotaKentta(int vuorossaOlevaPelaaja)
77    {
78        switch (vuorossaOlevaPelaaja)
79        {
80            case 1:
81                foreach (LaivanPala pala in pelaajan1Laivat)
82                    pala.IsVisible = false;
83
84                foreach (GameObject ammuttu in pelaajan1AmmututPisteet)
85                    ammuttu.IsVisible = false;
86
87
88                break;
89            case 2:
90                foreach (LaivanPala pala in pelaajan2Laivat)
91                    pala.IsVisible = false;
92
93                foreach (GameObject ammuttu in pelaajan2AmmututPisteet)
94                    ammuttu.IsVisible = false;
95
96                break;
97        }
98    }
99
100    void NaytaKentta(int vuorossaOlevaPelaaja)
101    {
102        switch (vuorossaOlevaPelaaja)
103        {
104            case 1:
105                foreach (LaivanPala pala in pelaajan1Laivat)
106                {
107                    if (pala.Ammuttu)
108                        pala.IsVisible = true;
109                }
110
111                foreach (GameObject ammuttu in pelaajan1AmmututPisteet)
112                    ammuttu.IsVisible = true;
113
114
115                break;
116            case 2:
117                foreach (LaivanPala pala in pelaajan2Laivat)
118                {
119                    if (pala.Ammuttu)
120                        pala.IsVisible = true;
121                }
122
123                foreach (GameObject ammuttu in pelaajan2AmmututPisteet)
124                    ammuttu.IsVisible = true;
125
126                break;
127        }
128    }
129
130    void Ammu()
131    {
132        List<LaivanPala> tutkittavatLaivat = pelaajan1Laivat;
133        List<GameObject> tutkittavatAmmututPisteet = pelaajan1AmmututPisteet;
134
135        if (vuorossaOlevaPelaaja == 2)
136        {
137            tutkittavatLaivat = pelaajan2Laivat;
138            tutkittavatAmmututPisteet = pelaajan2AmmututPisteet;
139        }
140
141        if (OnkoRuutuaAmmuttu(kursorinAllaOlevaPiste, tutkittavatAmmututPisteet, tutkittavatLaivat))
142            return;
143        bool allaOliLaiva = false;
144        LaivanPala allaOlevaLaiva = tutkittavatLaivat[0];
145        foreach (LaivanPala laiva in tutkittavatLaivat)
146        {
147            if (Vector.Distance(kursorinAllaOlevaPiste, laiva.Position) < ruudunKorkeus / 5)
148            { // Osuttiin laivaan
149                MessageDisplay.Add("Osuma!");
150                laiva.Ammu();
151                allaOliLaiva = true;
152                laiva.IsVisible = true;
153                laiva.Image = laivaKuva;
154
155                if (!OnkoLaivassaPalojaJaljella(laiva.Tag.ToString(), tutkittavatLaivat))
156                {
157                    MessageDisplay.Add("Laiva tuhottu!");
158                    KokoLaivaAmmuttu(tutkittavatLaivat, laiva.Tag.ToString());
159                }
160                if (OnkoKaikkiLaivatAmmuttu(tutkittavatLaivat)) PelaajaVoittiPelin(vuorossaOlevaPelaaja);
161
162                return;
163            }
164        }
165
166        if (!allaOliLaiva) // Osuttiin tyhjään ruutuun
167        {
168            GameObject tyhja = new GameObject(ruudunLeveys - 2, ruudunKorkeus - 2);
169            tyhja.Image = vesiKuva;
170            tyhja.Position = kursorinAllaOlevaPiste;
171            Add(tyhja);
172            tutkittavatAmmututPisteet.Add(tyhja);
173        }
174        Mouse.Disable(MouseButton.Left);
175        Timer.SingleShot(1.0, VuoroVaihtuu);
176    }
177
178    void KokoLaivaAmmuttu(List<LaivanPala> laivat, String laivanTagi)
179    {
180        foreach (LaivanPala laiva in laivat)
181        {
182            if (laiva.Tag.ToString() == laivanTagi)
183            {
184                laiva.Image = laivaAmmuttuKuva;
185            }
186        }
187    }
188
189    void VuoroVaihtuu()
190    {
191        Mouse.Enable(MouseButton.Left);
192        PiilotaKentta(vuorossaOlevaPelaaja);
193
194        switch (vuorossaOlevaPelaaja)
195        {
196            case 1:
197                vuorossaOlevaPelaaja = 2;
198                break;
199            case 2:
200                vuorossaOlevaPelaaja = 1;
201                break;
202        }
203        vuoroNaytto.Text = "Vuorossa: Pelaaja " + vuorossaOlevaPelaaja;
204
205        NaytaKentta(vuorossaOlevaPelaaja);
206    }
207
208    bool OnkoKaikkiLaivatAmmuttu(List<LaivanPala> laivat)
209    {
210        foreach (LaivanPala laiva in laivat)
211        {
212            if (!laiva.Ammuttu)
213                return false;
214        }
215        return true;
216    }
217
218    void PelaajaVoittiPelin(int pelaajaNro)
219    {
220        ClearAll();
221        Label teksti = new Label("Pelaaja " + pelaajaNro + " voitti pelin");
222        teksti.Color = Color.White;
223        Add(teksti);
224        Keyboard.Listen(Key.Enter, ButtonState.Pressed, Begin, null);
225        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
226    }
227
228    bool OnkoRuutuaAmmuttu(Vector piste, List<GameObject> tutkittavatAmmututPisteet, List<LaivanPala> tutkittavatLaivat)
229    {
230        foreach (GameObject ammuttuPiste in tutkittavatAmmututPisteet)
231        {
232            if (Vector.Distance(kursorinAllaOlevaPiste, ammuttuPiste.Position) < ruudunKorkeus / 5)
233                return true;
234        }
235
236        foreach (LaivanPala laiva in tutkittavatLaivat)
237        {
238            if (Vector.Distance(kursorinAllaOlevaPiste, laiva.Position) < ruudunKorkeus / 5)
239            {
240                if (laiva.Ammuttu)
241                {
242                    MessageDisplay.Add("Laiva jo ammuttu");
243                    return true;
244                }
245            }
246        }
247
248        return false;
249    }
250
251    bool OnkoLaivassaPalojaJaljella(String tagi, List<LaivanPala> tutkittavatLaivat)
252    {
253        foreach (LaivanPala laiva in tutkittavatLaivat)
254        {
255            if (laiva.Tag.ToString() == tagi && laiva.IsVisible == false)
256                return true;
257        }
258        return false;
259    }
260
261    void LuoKentta()
262    {
263        pelaajan1Laivat = new List<LaivanPala>();
264        pelaajan2Laivat = new List<LaivanPala>();
265        pelaajan1AmmututPisteet = new List<GameObject>();
266        pelaajan2AmmututPisteet = new List<GameObject>();
267        kursorinAllaOlevaPiste = new Vector(0, 0);
268
269        vuoroNaytto = new Label("Vuorossa: Pelaaja 1");
270        vuoroNaytto.Position = new Vector(Screen.Right - 100, Screen.TopSafe - 50);
271        vuoroNaytto.Color = Color.White;
272        Add(vuoroNaytto);
273
274        int kentanNro1 = RandomGen.NextInt(1, 20);
275        int kentanNro2 = RandomGen.NextInt(1, 20);
276
277        while (kentanNro1 == kentanNro2)
278        {
279            kentanNro2 = RandomGen.NextInt(1, 20);
280        }
281
282        TileMap ruudut = TileMap.FromFile("kentta" + kentanNro1 + ".txt");
283        LuoLaivat(ruudut);
284        ruudut.Insert(ruudunLeveys, ruudunKorkeus);
285
286        vuorossaOlevaPelaaja = 2;
287        kentanNro1 = RandomGen.NextInt(1, 20);
288        ruudut = TileMap.FromFile("kentta" + kentanNro2 + ".txt");
289        LuoLaivat(ruudut);
290        ruudut.Insert(ruudunLeveys, ruudunKorkeus);
291
292        vuorossaOlevaPelaaja = 1;
293        Level.CreateBorders();
294    }
295
296    void LuoLaivat(TileMap ruudut)
297    {
298        ruudut['0'] = LuoLaiva0;
299        ruudut['1'] = LuoLaiva1;
300        ruudut['2'] = LuoLaiva2;
301        ruudut['3'] = LuoLaiva3;
302        ruudut['4'] = LuoLaiva4;
303        ruudut['5'] = LuoLaiva5;
304        ruudut['6'] = LuoLaiva6;
305        ruudut['7'] = LuoLaiva7;
306        ruudut['8'] = LuoLaiva8;
307        ruudut['9'] = LuoLaiva9;
308    }
309
310    GameObject LuoLaiva0()
311    {
312        return LuoLaiva("0");
313    }
314    GameObject LuoLaiva1()
315    {
316        return LuoLaiva("1");
317    }
318    GameObject LuoLaiva2()
319    {
320        return LuoLaiva("2");
321    }
322    GameObject LuoLaiva3()
323    {
324        return LuoLaiva("3");
325    }
326    GameObject LuoLaiva4()
327    {
328        return LuoLaiva("4");
329    }
330    GameObject LuoLaiva5()
331    {
332        return LuoLaiva("5");
333    }
334    GameObject LuoLaiva6()
335    {
336        return LuoLaiva("6");
337    }
338    GameObject LuoLaiva7()
339    {
340        return LuoLaiva("7");
341    }
342    GameObject LuoLaiva8()
343    {
344        return LuoLaiva("8");
345    }
346    GameObject LuoLaiva9()
347    {
348        return LuoLaiva("9");
349    }
350
351    GameObject LuoLaiva(String tagi)
352    {
353        LaivanPala laiva = new LaivanPala(ruudunLeveys - 2, ruudunKorkeus - 2);
354        laiva.IsVisible = false;
355        laiva.Tag = tagi;
356        switch (vuorossaOlevaPelaaja)
357        {
358            case 1:
359                pelaajan1Laivat.Add(laiva);
360                break;
361            case 2:
362                pelaajan2Laivat.Add(laiva);
363                break;
364        }
365        return laiva;
366    }
367}
Note: See TracBrowser for help on using the repository browser.