- Timestamp:
- 2010-06-30 13:10:11 (13 years ago)
- Location:
- 2010/24/anlakane/Muistipeli
- Files:
-
- 32 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
2010/24/anlakane/Muistipeli/Kortti.cs
r1028 r1030 3 3 using System.Linq; 4 4 using Jypeli; 5 using Microsoft.Xna.Framework;6 using Microsoft.Xna.Framework.Graphics;5 //using Microsoft.Xna.Framework; 6 //using Microsoft.Xna.Framework.Graphics; 7 7 8 8 namespace Muistipeli … … 42 42 43 43 44 public Kortti(double width, double height, bool kuvapuoliEsilla, Image kuvapuoliTekstuuri, Image takapuoliTekstuuri, int tunnus)45 : base( width, height, Shapes.Rectangle)44 public Kortti(double leveys, double korkeus, bool kuvapuoliEsilla, Image kuvapuoliTekstuuri, Image takapuoliTekstuuri, int tunnus) 45 : base(leveys, korkeus, Shapes.Rectangle) 46 46 { 47 47 this.kuvapuoliTekstuuri = kuvapuoliTekstuuri; 48 48 this.takapuoliTekstuuri = takapuoliTekstuuri; 49 this.Image = kuvapuoliTekstuuri;49 //this.Image = kuvapuoliTekstuuri; //Tarvitaanko tätä? 50 50 this.liikkeenTila = Liikkeentila.Pysahtynyt; 51 51 this.poistettuPelista = false; … … 57 57 58 58 IsUpdated = true; 59 this.alkuperainenKoko = new Vector( width, height);59 this.alkuperainenKoko = new Vector(leveys, korkeus); 60 60 this.tunniste = tunnus; 61 } 61 62 63 public Kortti(double leveys, double korkeus, bool kuvapuoliEsilla, Image takapuoliTekstuuri, int tunnus) 64 : base(leveys, korkeus, Shapes.Rectangle) 65 { 66 this.kuvapuoliTekstuuri = Image.FromColor((int)Math.Floor(leveys), (int)Math.Floor(korkeus), Color.White); 67 this.takapuoliTekstuuri = takapuoliTekstuuri; 68 //this.Image = kuvapuoliTekstuuri; 69 this.liikkeenTila = Liikkeentila.Pysahtynyt; 70 this.poistettuPelista = false; 71 72 if (kuvapuoliEsilla) 73 AsetaPuoli(PuoliEsilla.Kuva); 74 else 75 AsetaPuoli(PuoliEsilla.Taka); 76 77 IsUpdated = true; 78 this.alkuperainenKoko = new Vector(leveys, korkeus); 79 this.tunniste = tunnus; 62 80 } 63 81 -
2010/24/anlakane/Muistipeli/Muistipeli.cs
r1029 r1030 8 8 using Jypeli.Effects; 9 9 10 using Texture2D = Microsoft.Xna.Framework.Graphics.Texture2D; 11 10 12 11 13 namespace Muistipeli … … 60 62 const double aikaaEnnenPiilottamista = 2; 61 63 64 String korttisarja; 65 62 66 Pelaaja pelaaja1; 63 67 Pelaaja pelaaja2; … … 73 77 montakoKorttia = 16; // Pitää olla ennen laskureiden lisäämistä 74 78 LisaaPelaajat(2); 75 76 79 AloitaUusiPeli(); 77 78 80 } 79 81 … … 82 84 ClearAll(); 83 85 LisaaPiilotusajastin(); 84 //LisaaKuvat(); 85 LisaaLaskurit(); 86 LisaaVuoronaytto(); 87 88 montakoKutakinKorttitunnusta = new int[montakoKorttia / 2]; // kortin tunnusNro indeksistä, alkiot tulkitaan siten että "montako tämän tunnuksen alkiota on lisätty peliin" 89 kaannetyt = new List<Kortti>(); 86 korttisarja = "elaimet"; 87 int montakoKuvaa = LataaKuvat(); 88 montakoKorttia = montakoKuvaa * 2; 90 89 91 90 // Laitetaan ensin rivejä ja sarakkeita yhtä paljon … … 96 95 montakoRivia = (int)Math.Ceiling((double)montakoKorttia / (double)montakoSaraketta); 97 96 kortit = new Kortti[montakoRivia, montakoSaraketta]; 98 KortitRuudulle(montakoKorttia); 97 98 // kortin tunnusNro indeksistä, alkiot tulkitaan siten että "montako tämän tunnuksen alkiota on lisätty peliin" 99 // Tämä pitää olla ennen kuin kortit lisätään ruudulle 100 montakoKutakinKorttitunnusta = new int[montakoKorttia / 2]; 101 102 KortitRuudulle(); 103 //LisaaKuvat(); // Pitää olla ennen laskureiden lisäämistä 104 105 LisaaLaskurit(); 106 LisaaVuoronaytto(); 99 107 LisaaHighLighter(); 100 108 … … 106 114 PeliKayntiin(); 107 115 AsetaNappaimet(); 108 109 116 } 110 117 … … 127 134 p1teksti.TextColor = Color.Black; 128 135 p1teksti.Position = new Vector(Screen.Left + 140, Screen.Bottom + 70); 129 pisteNaytto1.Position = new Vector(p1teksti.X + (p1teksti.Width /2) + 10, p1teksti.Y);136 pisteNaytto1.Position = new Vector(p1teksti.X + (p1teksti.Width / 2) + 10, p1teksti.Y); 130 137 pisteNaytto1.TextColor = Color.Blue; 131 138 pisteNaytto1.BindTo(pelaajan1Pisteet); 132 p1VoitotTeksti.Position = new Vector(Screen.Left + 140 - ((p1teksti.Width - p1VoitotTeksti.Width) /2), p1teksti.Y - 30);139 p1VoitotTeksti.Position = new Vector(Screen.Left + 140 - ((p1teksti.Width - p1VoitotTeksti.Width) / 2), p1teksti.Y - 30); 133 140 p1Voitot.Position = new Vector(p1VoitotTeksti.X + (p1VoitotTeksti.Width / 2) + 10, p1VoitotTeksti.Y); 134 141 … … 138 145 Add(p1Voitot); 139 146 140 pelaajan2Pisteet = new IntMeter(0); 147 pelaajan2Pisteet = new IntMeter(0); 141 148 Label p2teksti = new Label("Pelaaja 2 pisteet: "); 142 149 Label pisteNaytto2 = new Label(); … … 145 152 146 153 p2teksti.TextColor = Color.Black; 147 p2teksti.X = Screen.Right - 140;154 p2teksti.X = Screen.Right - 140; 148 155 p2teksti.Y = Screen.Bottom + 70; 149 156 pisteNaytto2.X = p2teksti.X + (p2teksti.Width / 2) + 10; … … 165 172 } 166 173 174 /// <summary> 175 /// Korostetaan ensimmäinen kortti. 176 /// </summary> 177 public void PeliKayntiin() 178 { 179 kaannetyt = new List<Kortti>(); 180 korostettuKortti = new Paikka(0, 0); 181 KorostaKortti(new Paikka(0, 0)); 182 vuorossaOlevaPelaaja = pelaaja1; 183 vuoronaytto.Text = "Pelaaja 1"; 184 MessageDisplay.Add("Pelaaja 1 aloittaa pelin!"); 185 } 186 187 167 188 public void KaikkiLoydetty(int arvo) 168 189 { … … 185 206 186 207 MessageBox m = new MessageBox( 187 "Peli päättyi", 208 "Peli päättyi", 188 209 "" + voittoteksti + "Aloita uusi peli painamalla OK."); 189 210 m.OkButton.Clicked += OKPainettu; … … 203 224 vuoronaytto = new Label(); 204 225 vuoronaytto.X = 0; 205 vuoronaytto.Y = vuorossaNyt.Y - 30; 226 vuoronaytto.Y = vuorossaNyt.Y - 30; 206 227 Add(vuorossaNyt); 207 228 Add(vuoronaytto); 208 }209 210 /// <summary>211 /// Korostetaan ensimmäinen kortti.212 /// </summary>213 public void PeliKayntiin()214 {215 korostettuKortti = new Paikka(0, 0);216 KorostaKortti(new Paikka(0, 0));217 vuorossaOlevaPelaaja = pelaaja1;218 vuoronaytto.Text = "Pelaaja 1";219 MessageDisplay.Add("Pelaaja 1 aloittaa pelin!");220 229 } 221 230 … … 227 236 } 228 237 229 private void LisaaKuvat()238 private int LataaKuvat() 230 239 { 231 240 List<String> kuvat = new List<string>(); 232 String[] kuvatiedostot = Directory.GetFiles("Content"); 233 char[] erottimet = new char[] { '\\', '.' }; 234 foreach (var kuva in kuvatiedostot) 235 { 236 String[] splitattu = kuva.Split(erottimet); 237 if (splitattu.Length > 1) 238 { 239 if (splitattu[1] != "highlight" && splitattu[1] != "taka") 240 kuvat.Add(splitattu[1]); 241 } 242 } 241 String[] kuvatiedostot = Directory.GetFiles(korttisarja); 242 return kuvatiedostot.Length; 243 243 } 244 244 … … 263 263 { 264 264 Exit(); 265 } 266 267 #region Liikkuminen 268 void KorostaKortti(Paikka korostettavaKortti) 269 { 270 korostettavaKortti = TarkistaKortinNro(korostettavaKortti); 271 highlighter.Position = new Vector(KortinX(korostettavaKortti.Sarake), KortinY(korostettavaKortti.Rivi)); 272 Kortti.PuoliEsilla puoliesilla = kortit[korostettavaKortti.Rivi, korostettavaKortti.Sarake].KumpiPuoliEsilla(); 273 korostettuKortti = korostettavaKortti; 274 } 275 276 /// <summary> 277 /// Aliohjelma pitää huolen, että valittu kortti on aina 278 /// rivi- ja sarakeindeksien sisäpuolella. Toisin sanoen 279 /// rivistä/sarakkeesta "yli" hypättäessä kursori palautuu 280 /// oikeaan paikkaan. 281 /// </summary> 282 /// <param name="kortinNro">Kortin rivi, sarake</param> 283 /// <returns>"Korjatut" koordinaatit</returns> 284 private Paikka TarkistaKortinNro(Paikka paikka) 285 { 286 // Viimeisen rivin jälkeen palataan ensimmäiselle riville 287 if (paikka.Rivi >= montakoRivia) 288 paikka.Rivi = 0; 289 290 // Viimeisen sarakkeen jälkeen palataan ensimmäiseen sarakkeeseen 291 if (paikka.Sarake >= montakoSaraketta) 292 paikka.Sarake = 0; 293 294 // Ensimmäisestä rivistä "taaksepäin" liikuttaessa 295 // hypätään viimeiselle riville 296 if (paikka.Rivi < 0) 297 paikka.Rivi = montakoRivia - 1; 298 299 // Ensimmäisestä sarakkeesta "taaksepäin" liikuttaessa 300 // hypätään viimeiseen sarakkeeseen 301 if (paikka.Sarake < 0) 302 paikka.Sarake = montakoSaraketta - 1; 303 304 // Mentiin pelipakan "tyhjälle alueelle" 305 if (kortit[paikka.Rivi, paikka.Sarake] == null) 306 paikka = TultiinNullViitteeseen(paikka); 307 308 return paikka; 309 } 310 311 private Paikka TultiinNullViitteeseen(Paikka kortinPaikka) 312 { 313 if (mihinSuuntaanMenossa == Suunta.Vasen) 314 return new Paikka(kortinPaikka.Rivi, (montakoKorttia % montakoSaraketta) - 1); 315 if (mihinSuuntaanMenossa == Suunta.Oikea) 316 return new Paikka(kortinPaikka.Rivi, 0); 317 if (mihinSuuntaanMenossa == Suunta.Ylos) 318 return new Paikka(montakoRivia - 2, kortinPaikka.Sarake); 319 320 // alas 321 return new Paikka(0, kortinPaikka.Sarake); 322 } 323 324 void KortinValinta(Suunta suunta) 325 { 326 mihinSuuntaanMenossa = suunta; 327 if (mihinSuuntaanMenossa == Suunta.Vasen) 328 KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake - 1)); 329 330 if (mihinSuuntaanMenossa == Suunta.Oikea) 331 KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake + 1)); 332 333 if (mihinSuuntaanMenossa == Suunta.Ylos) 334 KorostaKortti(new Paikka(korostettuKortti.Rivi - 1, korostettuKortti.Sarake)); 335 336 if (mihinSuuntaanMenossa == Suunta.Alas) 337 KorostaKortti(new Paikka(korostettuKortti.Rivi + 1, korostettuKortti.Sarake)); 338 } 339 #endregion 340 341 #region Kääntäminen ja parin löytyminen 342 343 public bool VoikoKorttiaKaantaa(Kortti kortti) 344 { 345 // Ei käännetä kahta kertaa samaa korttia 346 if (kaannetyt.Count == 0 || kortit[korostettuKortti.Rivi, korostettuKortti.Sarake] != kaannetyt[0]) 347 { 348 // Jos kortti "on jo löydetty", niin sitä ei voi missään tapauksessa kääntää 349 bool onkoPoistettuPelista = kortit[korostettuKortti.Rivi, korostettuKortti.Sarake].PoistettuPelista; 350 351 if (!onkoPoistettuPelista) 352 { 353 return true; 354 } 355 } 356 return false; 265 357 } 266 358 … … 293 385 } 294 386 387 void PiilotaKaannetyt(Timer t) 388 { 389 foreach (var item in kaannetyt) 390 { 391 item.Kaanna(); 392 } 393 kaannetyt.Clear(); 394 piilotusAjastin.Stop(); 395 Keyboard.Enable(Key.Space); 396 VuoroVaihtuu(); 397 } 398 295 399 public void PariLoytyi() 296 400 { … … 342 446 vuorossaOlevaPelaaja = pelaaja1; 343 447 highlighter.Image = LoadImage("highlight1"); 344 vuoronaytto.Text = "Pelaaja 1"; 448 vuoronaytto.Text = "Pelaaja 1"; 345 449 return; 346 450 } 347 451 } 348 452 349 public bool VoikoKorttiaKaantaa(Kortti kortti) 350 { 351 // Ei käännetä kahta kertaa samaa korttia 352 if (kaannetyt.Count == 0 || kortit[korostettuKortti.Rivi, korostettuKortti.Sarake] != kaannetyt[0]) 353 { 354 // Jos kortti "on jo löydetty", niin sitä ei voi missään tapauksessa kääntää 355 bool onkoPoistettuPelista = kortit[korostettuKortti.Rivi, korostettuKortti.Sarake].PoistettuPelista; 356 357 if (!onkoPoistettuPelista) 358 { 359 return true; 360 } 361 } 362 return false; 363 } 364 365 void PiilotaKaannetyt(Timer t) 366 { 367 foreach (var item in kaannetyt) 368 { 369 item.Kaanna(); 370 } 371 kaannetyt.Clear(); 372 piilotusAjastin.Stop(); 373 Keyboard.Enable(Key.Space); 374 VuoroVaihtuu(); 375 } 376 377 void KorostaKortti(Paikka korostettavaKortti) 378 { 379 korostettavaKortti = TarkistaKortinNro(korostettavaKortti); 380 highlighter.Position = new Vector(KortinX(korostettavaKortti.Sarake), KortinY(korostettavaKortti.Rivi)); 381 Kortti.PuoliEsilla puoliesilla = kortit[korostettavaKortti.Rivi, korostettavaKortti.Sarake].KumpiPuoliEsilla(); 382 korostettuKortti = korostettavaKortti; 383 } 384 385 /// <summary> 386 /// Aliohjelma pitää huolen, että valittu kortti on aina 387 /// rivi- ja sarakeindeksien sisäpuolella. Toisin sanoen 388 /// rivistä/sarakkeesta "yli" hypättäessä kursori palautuu 389 /// oikeaan paikkaan. 390 /// </summary> 391 /// <param name="kortinNro">Kortin rivi, sarake</param> 392 /// <returns>"Korjatut" koordinaatit</returns> 393 private Paikka TarkistaKortinNro(Paikka paikka) 394 { 395 // Viimeisen rivin jälkeen palataan ensimmäiselle riville 396 if (paikka.Rivi >= montakoRivia) 397 paikka.Rivi = 0; 398 399 // Viimeisen sarakkeen jälkeen palataan ensimmäiseen sarakkeeseen 400 if (paikka.Sarake >= montakoSaraketta) 401 paikka.Sarake = 0; 402 403 // Ensimmäisestä rivistä "taaksepäin" liikuttaessa 404 // hypätään viimeiselle riville 405 if (paikka.Rivi < 0) 406 paikka.Rivi = montakoRivia - 1; 407 408 // Ensimmäisestä sarakkeesta "taaksepäin" liikuttaessa 409 // hypätään viimeiseen sarakkeeseen 410 if (paikka.Sarake < 0) 411 paikka.Sarake = montakoSaraketta - 1; 412 413 // Mentiin pelipakan "tyhjälle alueelle" 414 if (kortit[paikka.Rivi, paikka.Sarake] == null) 415 paikka = TultiinNullViitteeseen(paikka); 416 417 return paikka; 418 } 419 420 private Paikka TultiinNullViitteeseen(Paikka kortinPaikka) 421 { 422 if (mihinSuuntaanMenossa == Suunta.Vasen) 423 return new Paikka(kortinPaikka.Rivi, (montakoKorttia % montakoSaraketta) - 1); 424 if (mihinSuuntaanMenossa == Suunta.Oikea) 425 return new Paikka(kortinPaikka.Rivi, 0); 426 if (mihinSuuntaanMenossa == Suunta.Ylos) 427 return new Paikka(montakoRivia - 2, kortinPaikka.Sarake); 428 429 // alas 430 return new Paikka(0, kortinPaikka.Sarake); 431 } 432 433 void KortinValinta(Suunta suunta) 434 { 435 mihinSuuntaanMenossa = suunta; 436 if (mihinSuuntaanMenossa == Suunta.Vasen) 437 KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake - 1)); 438 439 if (mihinSuuntaanMenossa == Suunta.Oikea) 440 KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake + 1)); 441 442 if (mihinSuuntaanMenossa == Suunta.Ylos) 443 KorostaKortti(new Paikka(korostettuKortti.Rivi - 1, korostettuKortti.Sarake)); 444 445 if (mihinSuuntaanMenossa == Suunta.Alas) 446 KorostaKortti(new Paikka(korostettuKortti.Rivi + 1, korostettuKortti.Sarake)); 447 } 448 453 #endregion 454 455 449 456 /// <summary> 450 457 /// Aliohjelma lisää halutun määrän kortteja … … 452 459 /// </summary> 453 460 /// <param name="montakoKorttiaLisataan">Kuinka monta korttia taulukkoon (attribuutti) lisätään.</param> 454 void KortitRuudulle( int montakoKorttiaLisataan)461 void KortitRuudulle() 455 462 { 456 463 int montakoKorttiaLisatty = 0; … … 462 469 // Jos tarvittava määrä kortteja on lisätty, 463 470 // laitetaan loppuihin taulukon alkioihin null-viite 464 if (montakoKorttia Lisataan== montakoKorttiaLisatty)471 if (montakoKorttia == montakoKorttiaLisatty) 465 472 { 466 473 kortit[r, s] = null; … … 468 475 } 469 476 470 kortit[r, s] = TeeKortti( "kortti1");471 kortit[r, s].KuvaPuoliTekstuuri = LoadImage("henkilo" + kortit[r, s].Tunniste.ToString());477 kortit[r, s] = TeeKortti(); 478 kortit[r, s].KuvaPuoliTekstuuri = Image.FromFile(korttisarja+"/" + kortit[r, s].Tunniste.ToString() + ".jpg"); 472 479 Add(kortit[r, s]); 473 474 //Label tunnusTeksti = new Label();475 //tunnusTeksti.Text = kortit[r, s].Tunniste.ToString();476 //tunnusTeksti.TextColor = Color.White;477 //Add(tunnusTeksti);478 480 479 481 kortit[r, s].X = KortinX(s); 480 482 kortit[r, s].Y = KortinY(r); 481 //tunnusTeksti.Position = new Vector(kortit[r, s].X, kortit[r, s].Y);482 483 montakoKorttiaLisatty++; 483 484 } … … 496 497 } 497 498 498 public Kortti TeeKortti(String kortinKuva) 499 { 500 Image kuvaTekstuuri = LoadImage(kortinKuva); 499 public Kortti TeeKortti() 500 { 501 501 Image takaTekstuuri = LoadImage("taka"); 502 Kortti kortti = new Kortti(kortinLeveys, kortinKorkeus, false, kuvaTekstuuri, takaTekstuuri, 0); 503 int tunnus; 502 int tunniste = AnnaTunniste(); 503 return new Kortti(kortinLeveys, kortinKorkeus, false, takaTekstuuri, tunniste); 504 } 505 506 private int AnnaTunniste() 507 { 508 int tunniste; 504 509 while (true) 505 510 { 506 tunn us= RandomGen.NextInt(0, montakoKutakinKorttitunnusta.Length - 1);507 if (montakoKutakinKorttitunnusta[tunn us] < 2)511 tunniste = RandomGen.NextInt(0, montakoKutakinKorttitunnusta.Length - 1); 512 if (montakoKutakinKorttitunnusta[tunniste] < 2) 508 513 { 509 montakoKutakinKorttitunnusta[tunn us]++;514 montakoKutakinKorttitunnusta[tunniste]++; 510 515 break; 511 516 } 512 517 } 513 514 return new Kortti(kortinLeveys, kortinKorkeus, false, kuvaTekstuuri, takaTekstuuri, tunnus); 518 return tunniste; 515 519 } 516 520 }
Note: See TracChangeset
for help on using the changeset viewer.