algorytm.org

Arkanoid



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Arkanoid
Ocena użytkowników:***** / 29
SłabyŚwietny 
Wpisany przez Marek Rudolf, 08 grudnia 2005 19:22

Arkanoid - jest grą komputerową, w której za pomocą małej paletki obija się piłkę aby zbić bloczki znajdujące się u góry ekranu. Przestrzeń w której znajdują się wszystkie elementy to prostokąt otwarty z jednej strony, przy paletce. Celem gry jest uzyskanie jak największej ilości punktów za zbicie bloczków i nie dopuszczenie aby piłka wydostała się poza określony obszar. W zależności od implementacji gry gracz ma do dyspozycji określoną liczbę paletek lub piłek. Nasza implementacja będzie posiadała określoną liczbę piłek. Każde zbicie bloczka to punkty ale żeby gra była ciekawsza ilość punktów przyznanych za zbcie zależy od prędkości z jaką piłeczka uderzyła w bloczek.
    Założenia gry:
  • Określona liczba piłek
  • Wykrywanie kolizji piłki z otoczeniem
  • Za każdy zbity bloczek otrzymujemy punkty
  • Ilość punktów przyznanych za zbicie klocka zależy od prędkości piłki
  • Poruszanie paletki przy wykorzystaniu myszki oraz klawiatury

Struktury danych
-Bloki są strukturą danych, która jest opisana tablicą dwuwymiarową, każdy z bloków może mieć własny kolor przy czym wartość 0 oznacza brak bloku. Ilość bloków znajdujących się na planszy zależy od etapu natomiast wielkość bloku jest dostosowywana do rozdzielczości okna. Ilość wierszy, w których ułożone są bloki powinna być tak dobrana aby istniała przestrzeń między paletką, a blokami. Nasza struktura będzie zawierała następujące dane: ilość wierszy, ilość kolumn, tablice tworzoną na podstawie poprzednich danych oraz metody wczytywania tablicy z pliku, zapisu tablicy do pliku, zaznaczenia iż blok został zbity, zwracanie współrzędnych określonego bloku(potrzebne do sprawdzania kolizji) oraz metodę malowania.
-Piłka jest obiektem, który będzie posiadał pięć wartości mianowicie współrzędne środka x,y , promień, wektor prędkości xspeed i yspeed oraz metody malowania, poruszania się, a także sprawdzania kolizji.
-Planszą będziemy określać rozmiar całego okno. Jest to nam potrzebne aby określić obszar, w którym piłka będzie mogła się poruszać i od których boków powinna się odbić.
-Paletka jest jedynym obiektem, który powinien reagować na ruchy myszką lub klawiaturę zawiera ona wartości określające położenie na planszy oraz rozmiary (wysokość, długość), a także dwie metody poruszania paletką które powinny być podpięte pod obsługę klawiatury i myszki.

Kolizje Wykrywanie kolizji piłki z otoczeniem jest jednym z głównych problemów tej gry. Wykrycie kolizji może się odbywać na dwa sposoby, wykrywanie przecięcia się dwóch prostokątów jak na rysunku poniżej gdzie widać część wspólną obu płaszczyzn albo wykrywanie kolizji poprzez określenie wektora kierunku piłki.

arkanoid - kolizja


Skorzystamy z tej drugiej metody ponieważ będzie można określić, z której strony piłka uderzyła dany blok. Dzięki temu będziemy w stanie łatwo określić, w którą stronę piłka powinna się odbić. Znając współrzędne środka piłki oraz promień i prędkość z jaką piłka porusza się w osi x i y sprawdzamy czy nastąpi kolizja z którym kolwiek klockiem na planszy w momencie gdy piłka zostanie przesunięta z punktu x,y w punkt x+p+xspeed i y+p+yspeed.

arkanoid - ruch piłki


    Procedura sprawdzania kolizji jest następująca (gdzie x1,x2,y1,y2 to współrzędne bloku, z którym jest sprawdzana kolizja,size to promień a i x,y współrzędne piłki): Jeżeli (x+xspeed+size >= x1 oraz x+xspeed-size <= x2) i (y+yspeed+size >= y1 oraz y+yspeed-size <= y2) to wtedy zaistnieje zdarzenie kolizji po którym musimy określić z którą ścianą nastąpiło to zdarzenie.
  • Jeżeli (x+size < x1 oraz x+xspeed+size >= x1) to zaistniała kolizja ze scianą w poziomie(oś x)
  • Jeżeli (x-size > x2 oraz x+xspeed-size <= x2) to zaistniała kolizja ze scianą w poziomie(oś x)
  • Jeżeli (y+size < y1 oraz y+yspeed+size >= y1) to zaistniała kolizja ze scianą w pionie(oś y)
  • Jeżeli (y-size > y2 oraz y+yspeed-size <= y2) to zaistniała kolizja ze scianą w pionie(oś y)
Gdy nastąpi kolizja w zależności od osi zmieniamy znak przy xspeed lub yspeed, aby piłka poruszała się w przeciwną stronę. Czyli postępujemy według znanej zasady - kąt padania równa się kątowi odbicia.
Strata piłki to kolizja piłki z dolną ścianą planszy gdy taka sytuacja zaistnieje ilość dostępnych piłek powinna zostać zmniejszona o jeden oraz nowa piłka powinna zostać umieszczona na paletce. Gdy nie pozostanie już więcej bloczków do zbicia gra powinna przejść do następnego etapu.

Odczyt i zapis tablicy Zapis tablicy dwuwymiarowej powinien się odbywać jako dopisywanie do pliku etapów (jeżeli już taki plik istnieje), a struktura takiego pliku powinna zawierać wielkość x,y tablicy oraz pokoleji wartośći z tablicy. Przy odczycie takiego pliku bierzemy pod uwagę który etap chcemy odczytać jezeli w pliku mamy zapisane trzy etapy musimy przesunąć wskaźnik odczytu do momentu rozpoczęcia tablicy danego etapu. Aby tego dokonać musimy najpierw sprawdzić jakiej wielkości był pierwszy etap odczytując x,y następnie wystarczy zrobić x*y i przesunąc się o tą wartość pomijając tablicę etapu pierwszego, to samo robimy przy kolejnych etapach aż dotrzemy do tego, którym jesteśmy zainteresowani. Niektórzy mogliby zadać pytanie po co nam wogóle zapis? jest ono potrzebne przy tworzeniu etapów aby nie robić spejalnie edytora wystarczy że wypełnimy tablicę ręcznie i pozniej użyjemy procedury zapisującej etap na koniec pliku. Uzyskamy w ten sposób łatwo plik zawierający kolejne etapy gry.

Podsumowanie
Pisząc program powinniście otrzymać następujące struktury:
Bloki{
tablica[][];//tablica dwuwymiarowa
int x,y;//wielkość tablicy
int width;//szerokość
rect getblockrect(int x,y)://pobranie współrzędnych określonego bloku
blockexistst(int x,y);//sprawdzenie czy blok istnieje
read(int etap,szer);//wczytanie tablicy z pliku jako parametry numer etapu oraz szerokość okna
write();//zapis tablicy do pliku
won();//sprawdzenie czy wszystkie bloki zostały zbite
}

Paletka{
int x;//pozycja x na planszy
int y;//pozycja y na planszy
int width;//szerokośc paletki
int height;//wysokość paletki
int maxx;//(ograniczenie)maksymalne przesunięcie paletki w prawo
void draw();//malowanie paletki
void move(int);//przesuwanie przy uzyciu klawiatury
void movemouse(int i);//przesuwanie przy uzyciu myszki
}

Piłka{
GLfloat x;//pozycja x piłki
GLfloat y;//pozycja x piłki
GLfloat size;//średnica piłki
GLfloat xspeed;//prędkość w poziomie
GLfloat yspeed;//prędkość w pionie
void move();//przesunięcie piłki
int colisiontest(GLfloat x1,y1,x2,y2);//wykrycie kolizji z obiektem opisanym współrzędnymi
void draw();//malowanie piłki
}

Główna pętla programu:
- stan gry-będzie określał czy piłka ma się poruszać czy też nie
- sprawdzanie ilości piłek jeżeli mniej niż 1 to koniec gry
- sprawdzanie czy wszystkie bloczki zbite jeżeli tak to przejdź do następnego etapu
- sprawdzanie który etap jeżeli niema więcej to zatrzymaj grę
- sprawdzenie kolizji z paletką
- sprawdzenie kolizji ze wszystkimi bloczkami jeżeli zaistniała to zwiększ prędkość piłki
- sprawdzenie kolizji z bokami planszy
- jeżeli zaistniała kolizja w osi x to zmień kierunek ruchu piłki w tej osi
- jeżeli zaistniała kolizja w osi y to zmień kierunek ruchu piłki w tej osi
- rysuj bloki, piłkę i paletkę
- wyświetlaj aktualny wynik i ilość piłek w lewym dolnym rogu

Pliki źródłowe: images.cpp,images.h - pliki zawierają wszystkie struktury danych(paletki, bloków, piłki) napisane jako klasy w C++.
main.cpp - jest połączeniem pliku bazowego NEHE(nehe.gamedev.net) umożliwiającego generowanie grafiki przy wykorzystaniu technologi OPENGL wraz z klasami arkanoida.


arkanoid



Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Marek RudolfC/C++Dev-C++ 4.9.9.2
.cpp
.cpp
***** / 18
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 01 czerwca 2010 21:27
Dodaj komentarz