CentrumXP.pl » Witamy
CentrumXP.pl
 
Szukaj
Subskrypcja
Powiadomienie e-mailem o nowościach na CentrumXP.pl:
E-mail: Zapisz
Czy zamierzasz pobrać Internet Explorer 9?


CentrumXP.pl » Microsoft .NET » Visual C# w praktyce » Dodaj do ulubionych Dodaj do ulubionych   Dodaj do ulubionych Wersja do wydruku

Snake w C#

Autor: Marcin Hałaczkiewicz    Opublikowano: 28 kwietnia 2007    Odsłon: 39985    »Skomentuj...
Strona 1 z 2  Następna»
Zobacz również:

Analogowy zegarek

Budzik w C#

Commander w C#

Kalkulator w C#

Komunikator w C#

Mini Paint w C#

Notatnik w C#

Przeglądarka internetowa w C#

Przeglądarka zdjęć w C#

Przetwarzanie obrazów

Tetris w C#

Wygaszacz ekranu w C#

»Uzyskaj pomoc na forum

Dzisiaj zajmiemy się napisaniem kolejnej gry - znanego wszystkim z komórek Nokii, Snake'a. Wykorzystamy kod, który napisaliśmy już przy okazji Tetrisa. Nauczymy się także korzystać z przestrzeni nazw System.Generics, która zawiera typowe struktury danych, takie jak stos, kolejka czy lista. My wykorzystamy listę dwukierunkową (LinkedList<>).

Na początku trochę o tej właśnie liście. Jej deklaracja wygląda następująco:

System.Generics.LinkedList<T> nazwa_zmiennej;

T jest typem przechowywanych wartości. W tej strukturze danych przechowywane są elementy LinkdeListNode, które zawierają właściwe zmienne, które chcemy pamiętać (właściwość Value - jest ona typu T). Dane są ułożone w określonej kolejności. Każdy element wie jaki jest jego  poprzednik i następnik (właściwości Next, Previous). Sama lista posiada z góry zdefiniowane właściwości, z których możemy swobodnie korzystać. Przechowuje ona np. swój początek oraz koniec (właściwości First oraz Last). W tej strukturze danych dzięki połączeniu pomiędzy sąsiednimi elementami, możemy dostać się do dowolnej wartości przesuwając się po elementach w prawo lub w lewo. Mamy do dyspozycji szereg metod do obsługi listy. Między innymi AddFirst, AddNext, Find, Remove. Po szczegóły odsyłam do dokumentacji MSDN. LinkedList będziemy używać do przechowywania węża w naszej grze. Jest to dość intuicyjne. Pierwszy element odpowiada głowie, a kolejne - kolejnym segmentom gada. Ostatni z elementów to końcówka ogona.

Zajmijmy się teraz grą. Tworzymy nowy projekt, nazywamy go Snake. Zmieniamy nazwę formy na frmSnake, we właściwości Text wpisujemy Snake. Rozmiary ustawiamy na 371x200, AutoSizeMode na GrowAndShrink, a MaximizeBox na false - nie chcemy, aby można było zmieniać rozmiar lub maksymalizować okno aplikacji. Do formy dodajemy 5 etykiet. Dwie z nich nazywamy lblPoziom i lblPunkty, nazwy pozostałych są nieistotne. Zmieniamy położenie lblPoziom na 325x9 i wpisujemy tekst 9. Umiejscowienie lblPunkty to 325x32, tekst to 0 (zero). Do dwóch z pozostałych etykiet wpisujemy Poziom i Punkty, a lokacje ustawiamy odpowiednio na 281x9 oraz 281x32. Do ostatniej kontrolki wpisujemy:
Enter - Start
Spacja - Pauza
Escape - Koniec
1...9 - Poziom
Posłuży nam ona ze legendę. Jej położenie to 381x84. Teraz dodajemy kontrolkę Timer i nadajemy jej nazwę licznik - będzie ona licznikiem czasu. Na końcu ustawiamy jeszcze właściwość formy KeyPreview na true. Dzięki temu forma będzie przechwycać zdarzenia powiązane z klawiaturą od wszystkich kontrolek w niej zawartych. To na razie tyle jeśli chodzi o wygląd aplikacji. Przejdźmy teraz do stworzenia klasy reprezentującej planszę do gry.

Najpierw dodajemy do projektu pliki, których używaliśmy przy okazji tworzenia Tetrisa - kratka.cs i Plansza.cs, artykuł ten znajdziemy tutaj. Dokonujemy niewielkiej modyfikacji w kratka - zmieniamy stałą wymiar na 10. Następnie tworzymy nową klasę i nazywamy ją Plansza_Snake. Klasa ta będzie dziedziczyć po klasie Plansza (podobnie jak Plansza_Tetris w Tetrisie). Plansza reprezentuje podstawowe okno gry. Można w niej rysować poszczególne kratki, odświeżyć lub wyczyścić ekran. Dopiero Plansza_Snake będzie zawierać węża, metody służące do poruszania nim i pilnujące zasad gry. Jednak zanim się nią zajmiemy, stwórzmy klasę Waz. Oto jej pełna treść:


1 2 Dalej» 

Aktualna ocena to: 2,31

Oceń artykuł...
Porażka Kiepski Taki Sobie Dobry Super!

Tagi:  

A teraz:    Dodaj do ulubionych Dodaj do ulubionych    Wydrukuj Wydrukuj    Wyślij link znajomemu Wyślij link znajomemu    Skomentuj Skomentuj

Komentarze do Snake w C#

Dodaj komentarz»

Bartosz 25 czerwca 2007, 0:50

dlaczego zdarzenia Tick i KeyDown nie są opisane kodem???

Sayco 30 marca 2009, 4:06

Czy ma ktoś kody brakujących zdarzeń ???

DRW 17 czerwca 2009, 13:54

Jestem początkujący ale coś takiego skleciłem private void licznik_Tick(object sender, EventArgs e) { okno.ruch(); if (okno.przedluz) { punkty += 1; lblPunkty.Text = punkty.ToString(); } if (!okno.gra) { licznik.Stop(); punkty = 0; MessageBox.Show("Koniec gry"); okno.reset(); } }

DRW 17 czerwca 2009, 13:56

I KeyDown private void frmSnake_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter && !okno.gra) { lblPunkty.Text = "0"; okno.gra = true; okno.nowywaz(); licznik.Start(); } else if (e.KeyCode == Keys.Left && okno.gra && !okno.pauza) okno.kierunek = PlanszaSnake.kierunki.lewo; else if (e.KeyCode == Keys.Right && okno.gra && !okno.pauza) okno.kierunek = PlanszaSnake.kierunki.prawo; else if (e.KeyCode == Keys.Down && okno.gra && !okno.pauza) okno.kierunek = PlanszaSnake.kierunki.dol; else if (e.KeyCode == Keys.Up && okno.gra && !okno.pauza) okno.kierunek = PlanszaSnake.kierunki.gora; else if (e.KeyCode == Keys.Escape && okno.gra) { okno.gra = false; okno.reset(); punkty = 0; licznik.Stop(); } else if (e.KeyCode == Keys.Space && okno.gra) { if (okno.pauza) { licznik.Start(); okno.pauza = false; } else { licznik.Stop(); okno.pauza = true; } }

DRW 17 czerwca 2009, 13:58

No i jeszcze w KeyDown deklaracja poziomów trudności na zasadzie else if (e.KeyCode == Keys.D1 && !okno.gra) { licznik.Interval = 100; poziom = 1; lblPoziom.Text = poziom.ToString(); } else if (e.KeyCode == Keys.D2 && !okno.gra) { licznik.Interval = 150; poziom = 2; lblPoziom.Text = poziom.ToString(); } else if (e.KeyCode == Keys.D3 && !okno.gra)

DRW 17 czerwca 2009, 14:00

W klasie PLANSZASNAKE w metodzie ruch zmieniłem jeszcze w odpowiednim miejscu if (zlapano_kratke) nowy_element = przedluz = true; else nowy_element = przedluz = false;

MasterUkacz 28 lutego 2011, 18:06

Napisałem kiedyś podobne w C++ :P


Dodaj swój komentarz

»Zasady udzielania komentarzy

Autor:  
Komentarz:
Dodaj komentarz
© 2012 Onex Group
Onex Group O Onex Group  |  O CentrumXP.pl  |  Kontakt  |  Reklama
Nasze serwisy: CentrumXP.plXboxSpot.pl  |  Jama Mastaha