Gra w statki

Zasad tej gry chyba nikomu nie muszę wyjaśniać. W tutorialu zajmiemy się tylko podstawowymi zagadnieniami tej gry, czyli planszą, rozstawianiem statków i strzelaniem. Poniżej macie przykładową grę stworzoną w języku vb.net grywalną zarówno z komputerem, we dwójkę przy jednym komputerze, jak i grę przy użyciu protokołu TCP/IP.

 

Statki wersja 1.1.zip

 

 

 

 

Zaczniemy od przygotowania planszy do gry, będą nam potrzebne następujące elementy:

Rodzaj elementu Nazwa elementu Ustawienia
Form Form1 Name: Form1
Text: Okręty VisualMonsters.cba.pl
Size: 1015; 545
Picturebox gracz1 Name: gracz1
Size: 478; 478
Location: 13;13
BackColor: White
Anchor: Top, Left
Picturebox gracz2 Name: gracz2
Size: 478; 478
Location: 506; 13
BackColor: White
Anchor: Top, Left

 

Do gry użyjemy Pictureboxów, które będziemy blokować w zależności od tego, który aktualnie gracz będzie wykonywał strzał. Podzielimy nasze obszary na pola 10×10. Posłuży nam do tego kod poniżej, który wygenerujemy obiekty Rectangle z określoną pozycją i wielkością. Dla lepszej widoczności dodałem im niepełny kolor czerwony:

Teraz gdy mamy planszę, na której możemy umieścić nasze statki, przejdziemy do podświetlenia elementu, nad którym znajduje się kursor myszy. Gdy kursor znajdzie się nad naszym panelem, zostanie wychwycony a jego położenie odczytane. Kiedy znajdzie się w określonej pozycji, podświetlimy go. Użyjemy do tego zdarzenia MouseMove zarówno do pierwszego panelu, jak i do drugiego:

Każdy okręt będzie tworzony jako struktura, a te będą przechowywane w kolekcjach. Każdy z graczy będzie posiadał 10 okrętów: 4x pojedyncze, 3x podwójne, 2x potrójne i jeden poczwórny okręt. W tutorialu nie będę pokazywał jak obracać okrętami i jak sprawdzać, czy okręty są za blisko siebie, zasłoniłoby to główne elementy gry. Na pewno każdy, kto będzie chciał grę trochę zmodyfikować, z łatwością doda te elementy. Zajmiemy się teraz układaniem okrętów gracza 1.  Zaczniemy od okrętu czteromasztowego. Przypominam, że będziemy mogli ułożyć go tylko w jednej pozycji i musimy również nałożyć ograniczenie, które uniemożliwi ułożenie go poza obszarem planszy. Dodamy również bitmapę podglądową, która ukaże miejsca ułożonych okrętów.

Należy odblokować opcję w „initRectangles”:

Zmodyfikowana zostanie zdarzenie MouseMove dla gracza1:

Mamy już pierwszy okręt i wypadało, by go ułożyć, kontroluje nam to zmienna „pozwolNaUmieszczenieOkretu” a układanie będzie obsługiwać zdarzenie „MouseClick”. Przy użyciu lewego przycisku myszy kleimy nasz okręt do bitmapy „PlanszaZOkretamiGracza1”  i dodamy strukturę okrętu do kolekcji.

W momencie ułożenia wszystkich okrętów plansza zostaje zasłonięta (tak jak to widać na gifie powyżej) a plansza gracza drugiego odblokowana. Gracz drugi układa okręty w taki sam sposób jak gracz 1. Kierują nim takie same zasady. Kiedy gracz drugi ułoży okręty, gra zostanie rozpoczęta. Element strzelania zostanie zawarty w zdarzeniu MouseClick. Pełen kod razem z układaniem okrętów przez gracza 2 dodaje poniżej:

Mam nadziej, że nadążacie. Po dokonaniu tych zmian układanie okrętów mamy już z głowy:

Teraz kiedy pojawił się komunikat, możemy zaprosić gracza 1 do gry. To on rozpoczyna grę, chociaż można by było wprowadzić element losowy, który wyznaczałby gracza zaczynającego grę. Gracze będą strzelać za pomocą lewego przycisku myszy. Kiedy kursor myszy najedzie na dostępny kwadrat do strzału, zostanie zmieniony ze strzałki na rączkę. Kiedy gracz trafi okręt, będzie miał do dyspozycji kolejny strzał. Plansze zostaną odblokowane w zależności od tego, który gracz aktualnie wykonuje strzał. Jeśli będzie to gracz 1, wtedy odblokowaniu podlega plansza gracza 2. Gra kończy się, wtedy kiedy kolekcja okrętów gracza1 lub gracza2 będzie pusta. Zajmijmy się dodaniem ważnych zmiennych, lecz jeszcze niewpisanych w nasz kod:

Zmienne przechowują trafione kwadraty i jeśli spudłujemy, kwadraty puste. Zajmijmy się ustawieniem kursora rączki nad możliwym do wybrania kwadratem. Przechodzimy do zdarzenia gracz1_MouseMove i dodajemy następujący kod:

Efekt prezentuje poniższy gif:

Oczywiście elementem dyskusyjnym są kolory przestawione w programie, możecie użyć dowolnych kolorów, możecie podświetlić panel aktualnie wykonującego strzał gracza, dodać ładną grafikę statków, a nie czarne prostokąty. Każdy taki element urozmaici i wzbogaci grę. Zobaczcie grę zademonstrowaną na wstępie tego wpisu. Wróćmy do naszej gry. Został nam ostatni element, chyba najtrudniejszy, tak myślę. Najpierw weźmiemy czystą bitmapę „StrzelicaGracza” to na jej powierzchnię będziemy nanosić obrazki zatopionych okrętów. Następnie używając znanej już nam pętli, sprawdzimy, w którym miejscu znajduje się kursor myszy, sprawdzimy, czy ten obszar nie znajduje się już w liście trafionych lub liście spudłowanych. Jeśli nie wtedy sprawdzamy każdy element kolekcji (w zależności od miejsca, w którym się znajdujemy KolekcjaOkretowGracz1 lub KolekcjaOkretowGracz2) czy przypadkiem nasz kwadrat tam się nie znajduje. Jeśli znajduje się, wtedy dokonaliśmy trafienia okrętu przeciwnika. Następnie sprawdzamy, czy wszystkie elementy trafionego okrętu znajdują się w naszej liście trafionych obiektów. Jeśli tak nanosimy sylwetkę okrętu na bitmapę strzelnicy. Na koniec rysujemy pola, podstawiamy obrazek i jeśli gracz trafił, kontynuuje grę, w tym miejscu sprawdzamy, jeszcze czy może gra nie jest już skończona.

To samo tylko w sposób odwrócony robimy dla gracza 1 w obszarze gracza 2.

To by było na tyle. Grę musicie sami dopracować według własnych pomysłów. Szkielet gry macie dostępny, więc musicie się postarać. Jeśli wymyślicie coś ciekawego, to prześlijcie mi zdjęcia to umieszczę je na blogu 😉

Tak jak zawsze do pobrania:

Pełen kod gry:  Okrety_visualmonsters.cba.pl.txt

Projekt:  Okrety_VisualMonsters.cba.pl.zip

 

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/gra-w-statki/

Dodaj komentarz

Twój adres email nie będzie publikowany.