Projekt edukacyjny: Termin realizacji: – Zespół projektowy: Dominik Grzybowski Michał Kozłowski
Gra została przeze mnie napisana w języku C++, w programie Code::Blocks. Używałem następujących bibliotek (w tym autorskiej klasy SOUNDS.h, o której powiem coś później):
Jest ich 15 (bez funkcji ‘main’ i ‘gotoxy’): menu główne wypełnianie tabeli cyframi wybór trudności losowanie współrzędnych bomb oblicz bomby w otoczeniu strzelanie wypisywanie tabeli w programie wypisywanie tabeli po przegranej sprawdź pole sprawdzanie całej planszy ekran o grze napis wygrana przechowywacz hall of fame
W grze zastosowałem zapis wyniku w postaci cyfr. Ustalany jest on na podstawie poziomu trudności i czasu przejścia planszy. Znacznik rozpoczęcia pomiaru czasu gry umieściłem na początku funkcji ‘strzelanie’, a zakończenia na początku funkcji ‘wygrana’. Jeżeli chodzi o obliczanie wyniku to posłużę się przykładem: Czas: 15 Poziom trudności: Easy, czyli od czasu odejmuję 20 (próg punktowy, dla każdego poziomu inny) Różnicę czasu i progu punktowego mnożę x(-2) i dodaję do wyniku Wynik ostateczny = 5 Obliczenia: 15 – 20 = -5 ; (15 – 20) x -2 = 10 ; = 5
Klasa ta oprócz konstruktora posiada 6 funkcji: PLAY_SOUND, PAUSE, STEMPO, USTEMPO, SLIDE i REPEAT. Za pomocą tej pierwszej dźwięk o określonej długości (ustalanej z tempa i odpowiednich mnożników) i określonej wysokości. W klasie SOUNDS zdefiniowałem wysokości wszystkich dźwięków od C0 do B7, czyli 8 oktaw. Funkcja PAUSE powoduje wstawienie pauzy w wybrane miejsce, a jej długość również zależy od tempa. STEMPO ustawia tempo na żądaną wartość, a USTEMPO ustawia je na domyślną wartość (możliwą do zmiany) 150BPM. SLIDE powoduje ześlizgnięcie się lub podjazd z jednego do drugiego dźwięku w określonym czasie. REPEAT umożliwia powtórzenie sekwencji dźwięków (max 16) wybraną ilość razy oraz zezwala na określenie długości poszczególnych dźwięków składowych. Oto, jak wygląda w całości:
1. Lista dostępnych akcji 2. Wpisanie 4 = wywołanie funkcji ‘ekran o grze’ 3. Wpisanie 1 = rozpoczęcie gry; widać wywołanie wielu funkcji, które m.in. przygotowują tabele do gry 4. Wpisanie 5 = wyjście z gry 5. Wpisanie 2 = wywołanie funkcji ‘hall of fame’ 6. [niewidoczne na screenie] Wpisanie 3 = otworzenie instrukcji do gry
MINESWEEPER MENU GŁÓWNE
1. Dwie pętle ‘for’, odpowiadające za wstawienie cyfry określonej podczas wywoływania tej funkcji 2. Tutaj następuje owo przypisanie
1.Za pomocą funkcji ‘gotoxy’ (zielona strzałka) określiłem pole wpisywania poziomu trudności przez gracza w miejscu oznaczonym strzałką czerwoną 2.Po raz pierwszy pojawia się bardziej złożona melodia, którą napisałem z wykorzystaniem mojej autorskiej klasy (klasa – własny typ danych) SOUNDS.h. Jest ona odtwarzana, gdy gracz wybierze tryb Impossible
MINESWEEPER WYBÓR TRUDNOŚCI
MINESWEEPER PRZYKŁADOWY WYBÓR POZIOMU TRUDNOŚCI
1. Zmienna ‘liczba_bomb’ określa ile min ma się znajdować na planszy w określonym poziomie trudności, np. na poziomie Easy są tylko 3 miny, a na Impossible ‘rand()’ oznacza, że cyfra jest losowana (w tym przypadku współrzędne), ale zaraz obok widzimy ograniczenie w postaci wyrażenia ‘x %= 10’, czyli losowa zmienna x równa jest reszcie z dzielenia (operator ‘%’) x / 10; oznacza to, że x może wynosić od 0 do 9; instrukcja ‘if’ powoduje, że jak wylosowane współrzędne są współrzędnymi miny, obieg pętli wykonywany jest jeszcze raz
1. Obliczana jest suma wartości wszystkich bomb w otoczeniu konkretnego pola (tu: dla prawego górnego rogu) 2. Bomba (jak można było zauważyć w wcześniejszym slajdzie) ma wartość 9, więc suma jest dzielona przez 9, dzięki czemu wynikiem jest liczba bomb w otoczeniu 3. Wartość sumy jest przypisywana do tablicy ‘schowek’ 4. Zawartość ‘schowka’ jest przepisywana to tablicy ‘tab’, która pokazuje po tej operacji obraz planszy po wygranej
1. Wywołanie funkcji ‘napis’ 2. Informacje o wybranym trybie strzału (domyślne jest odkrywanie planszy) 3. Jeżeli gracz będzie chciał odkryć pole już wcześniej odkryte, zostanie wyświetlony stosowny komunikat 4. Wywołanie funkcji ‘sprawdź pole’ 5. Informacje o wybranym trybie (tym razem o flagowaniu) 6. Analogicznie do punktu 3 7. Jeżeli gracz postawi flagę na fladze, wówczas to pole stanie się polem nieodkrytym (ze znakiem ‘?’)
1. Wywołanie funkcji ‘sprawdzanie całej planszy’ 2. Jeżeli zmienna ‘czywygrana’ jest równa 1 to następuje wyjście z funkcji ‘strzelanie’ 3. Wywołanie funkcji ‘wypisywanie tabeli w programie’ 4. Jeżeli podając współrzędną ‘x’ gracz wpisze ‘e’ to będzie mógł wyjść z gry 5. Tak samo: jeżeli wpisze ‘A’, wywoła funkcję ‘ekran o grze’
1. Jeżeli podając zmienną ‘x’ gracz wpisze ‘f’, tryb strzelania zmieni się na flagowanie 2. Co się dzieje wewnątrz operacji flagowania
MINESWEEPER PRZYKŁADOWY EKRAN GRY
MINESWEEPER FLAGOWANIE
MINESWEEPER ALERT 1 I 2
MINESWEEPER RUCH TUŻ-TUŻ PRZED WYGRANĄ
MINESWEEPER EKRAN WYJŚCIA PODCZAS GRY
1. Wewnątrz funkcji ma miejsce narysowanie tabeli w oknie programu, dodając kolory do poszczególnych rodzajów pól, tutaj: mina 2. Tutaj: pole nieodkryte 3. Tutaj: flaga (kolory pól z liczą bomb w otoczeniu są niewidoczne screenie)
1. To samo, co w poprzedniej funkcji, ale jest dodane pole, które spowodowało przegraną oraz zmieniony jest znak bomby na ‘X’
MINESWEEPER PLANSZA PO PRZEGRANEJ I „GAME OVER”
1. Jeżeli wartość pola jest równa 0, to wykonywane są poniższe operacje 2. Odrębna operacja dla każdego pola na planszy (tu: dla pól środkowych) 3. Wywołanie funkcji przez samą siebie, ze zmodyfikowanymi argumentami; przypomina to pętlę, która kończy się w momencie, aż żaden warunek w instrukcjach ‘if’ nie został spełniony 4. Jeżeli gracz trafi w bombę, to wywoływana jest funkcja ‘wypisywanie tabeli po przegranej’ 5. Melodia (z wykorzystaniem SOUNDS.h) odtwarzana ekranowi przegranej
1. Następuje sprawdzenie całej planszy i zapisanie w zmiennych ilości pól: z minami, z flagami, z polami nieodkrytymi 2. Obliczana jest ilość flag, które można postawić (na podstawie liczby bomb i postawionych wcześniej flag) 3. Zaprezentowanie na ekranie wyników obliczeń 4. Jeżeli ilość dostępnych flag będzie wynosić 0, a wszystkie pola zostaną odkryte, zostaje wywołana funkcja ‘wygrana’
1. Zostaje wyświetlone logo gry 2. Tablice znakowe zawierające wyrażenia, które zostaną wypisane w punkcie 3 3. Pętla, która w sposób audio-wizualny wypisuje na ekran treść tablic znakowych
MINESWEEPER O GRZE
1. Wypisanie nagłówka na górze ekranu gry
1. Wypisanie dużego napisu w ASCII art. 2. Jeżeli wygrasz grę na poziomie wyższym niż Medium, zostaje odtworzona 40 sekundowa melodia (napisana za pomocą SOUNDS.h), której monstrualny kod nie zmieściłby się na jednym slajdzie(!) 3. Po tym wszystkim następuje wywołanie funkcji ‘przechowywacz’, która jest odpowiedzialna za zapis
MINESWEEPER WYGRANA
1. W tych zmiennych zapisane będą dane o aktualnej dacie i imię gracza 2. Pobór aktualnej daty i zapis jej do zmiennej ‘aktualnyczas’ 3. Definicja kilku operacji (dla wygody) 4. Napis podsumowanie 5. Ustalenie wartości kilku zmiennych na podstawie wybranego poziomu trudności 6. Obliczeni innych liczb składowych potrzebnych do określenia wyniku (jego zapis do pliku znajduje się poniżej, ale nie zmieściłby się nawet na dwóch slajdach, ze względu na dużą ilość operacji)
MINESWEEPER EKRAN PODSUMOWANIA I DWA ODMIENNE WYNIKI
1. Pobór danych z plików, zawierających zapisane informacje 2. Ładne zaprezentowanie ich na ekranie, z wyróżnieniem pierwszego miejsca
MINESWEEPER EKRAN ZAPISU I WIDOCZNE POTEM HALL OF FAME