2.4. Wyścigi

Scenariusz projektu

Projekt będzie polegał na opracowaniu programu symulującego wyścigi. Od twojego wyboru zależy, jacy zawodnicy lub zawodniczki wezmą udział w konkurencji. Może to być bieg lekkoatletyczny, wyścig zwierząt, samochodów albo motocykli. Zawodom towarzyszyć powinna publiczność dopingująca swoich faworytów. Gdy konkurencja się zakończy, część publiczności będzie się cieszyła ze zwycięstwa swojego zawodnika, druga zaś będzie spokojnie stała po przegranej.
Zobacz przykładowe działanie aplikacji na poniższym filmie.
Twoim zadaniem będzie zaprojektowanie i zaprogramowanie własnej wersji symulacji wyścigów.

Zadanie 2.4.1.

Zaplanuj scenerię dla projektu - zastanów się, gdzie umieścisz publiczność, tory wyścigowe, punkt startu oraz mety. Czy użytkownik będzie na nich patrzył z boku, a może z góry?

Projektujemy działania duszków

Zadanie 2.4.2.

Zastanów się i zapisz przepis, według którego poruszać się będzie zawodnik. Pamiętaj, żeby zaplanować ruch w taki sposób, by szanse na zwycięstwo obu zawodników były takie same oraz by w czasie wyścigu mogli zmieniać się na prowadzeniu. Symulacja dzięki temu będzie bardziej dynamiczna.

Wskazówka

Możesz losować liczbę kroków, o jaką przesunie się dany zawodnik przed wykonaniem przez niego pojedynczego ruchu. Uwzględnij ustawienie zawodnika w punkcie startu oraz w jaki sposób użytkownik da sygnał do rozpoczęcia wyścigu, czyli uruchomi symulację. Pamiętaj też, że poruszanie się zawodnika powinno zakończyć się, gdy dotrze do mety.
Po uruchomieniu programu należy ustawić zawodnika na pozycji startowej:

Kiedy kliknięto zieloną flagą:
  1. 1.
    Idź do pozycji startowej.
  2. 2.
    Zatrzymaj ten skrypt.
Start wyścigu może rozpocząć się np. po daniu sygnału poprzez wciśnięcie klawisza spacji. Wówczas przepis na ruch zawodnika może wyglądać następująco:

Kiedy wciśnięto klawisz spacja:
  1. 1.
    Powtarzaj, aż dotrze do mety:
    1. 1.1.
      Przesuń o wylosowaną liczbę kroków.
  2. 2.
    Zatrzymaj ten skrypt.

Zadanie 2.4.3.

Zastanów się, w jaki sposób rozpoznać, że zawodnik osiągnął metę. Uzupełnij przepis.

Wskazówka

Czy zawodnik osiągnął metę można sprawdzić na kilka sposobów - na przykład:
  • poprzez sprawdzenie, czy jego współrzędna (x lub y - w zależności od tego, wzdłuż której osi i w jakim kierunku porusza się zawodnik) jest większa lub mniejsza od ustalonej pozycji mety,
  • dodanie duszka - mety lub oznaczenie mety specjalnym kolorem - gdy duszek - zawodnik dotknie go, rozpozna, że dotarł do mety.
Jeżeli dodany zostanie duszek - meta, przepis na ruch zawodnika może wyglądać następująco:
Kiedy wciśnięto klawisz spacja:
  1. 1.
    Powtarzaj, aż dotyka mety:
    1. 1.1.
      Przesuń o wylosowaną liczbę kroków.
  2. 2.
    Zatrzymaj ten skrypt.

Zadanie 2.4.4.

Zastanów się, w jaki sposób rozpoznać, że zawodnik wygrał lub przegrał.

Wskazówka

Czy zawodnik dodarł pierwszy, czy drugi, na metę można sprawdzić wykorzystując np. zmienne.
Pierwszy sposób, to utworzenie dla każdego duszka - zawodnika zmiennej np. Miejsce pierwszego zawodnika oraz Miejsce drugiego zawodnika. Po uruchomieniu programu, wartości zmiennych należy ustawić na 0. Gdy zawodnik dotrze do mety, wartość zmiennej oznaczającej jego miejsce powinna zostać zmieniona na wartość zmiennej oznaczającej miejsce jakie zajmuje konkurent powiększoną o 1. Wówczas jeśli dotrze pierwszy, wartość ta wyniesie 1, jeśli drugi, to 2.
Drugi sposób to utworzenie zmiennych przechowujących czas biegu poszczególnych zawodników. Przy każdym ruchu zawodnika można zapisywać czas, jaki upłynął od początku biegu korzystając z klocka stoper. Gdy zawodnicy dotrą do mety, w ich zmiennych będzie zapisany czas ich biegu. Wystarczy sprawdzić, który zawodnik dobiegł w krótszym czasie. W przypadku, gdy czasy są równe - mamy remis.
Trzecie rozwiązanie polega na sprawdzeniu, gdy zawodnik dotarł do mety, czy rywal znajduje się za nim czy przed nim w danej chwili. Można w tym celu porównać współrzędne x lub y obu zawodników (w zależności od tego, wzdłuż której osi układu współrzędnych odbywał się wyścig). To rozwiązanie pozwala uniknąć stosowania zmiennych.
Jeżeli dodane zostaną zmienne przechowujące informacje o miejscach, które zajęli poszczególni zawodnicy, algorytm działania pierwszego zawodnika może wyglądać następująco:

Kiedy wciśnięto klawisz spacja:
  1. 1.
    Powtarzaj, aż dotyka mety:
  2. 2.
    Przesuń o wylosowaną liczbę kroków.
  3. 3.
    Ustaw zmienną Miejsce pierwszego zawodnika na (Miejsce drugiego zawodnika + 1).
  4. 4.
    Zatrzymaj ten skrypt.
Należy pamiętać, aby wyzerować zmienne przechowujące miejsce zawodnika, gdy kliknięta zostanie zielona flaga, przykład dla pierwszego zawodnika:

Kiedy kliknięto zieloną flagę:
  1. 1.
    Ustaw zmienną Miejsce pierwszego zawodnika na 0.
  2. 2.
    Idź do pozycji startowej.
  3. 3.
    Zatrzymaj ten skrypt.

Zadanie 2.4.5.

Zastanów się, w jaki sposób powinien zachowywać się duszek - kibic?

Wskazówka

Kibic powinien dopingować zawodników (np. poruszając się) od momentu ich ustawienia na pozycji startowej, do końca zawodów. Następnie może krzyczeć „Hura! Wygraliśmy” dalej się poruszając lub „Buuu! Przegraliśmy” stojąc nieruchomo - w zależności od tego, czy jego zawodnik wygrał lub przegrał. Miejsce, które zajął dany zawodnik, kibic może sprawdzić, gdy ten dotrze do mety. W tym celu można wykorzystać mechanizm nadawania i odbierania komunikatów.
Jeżeli planujemy wykorzystać mechanizm nadawania i odbierania komunikatów, to należy zmodyfikować algorytm działania zawodnika (przykład dla pierwszego zawodnika):

Kiedy wciśnięto klawisz spacja:
  1. 1.
    Powtarzaj, aż dotyka mety:
    1. 1.1.
      Przesuń o wylosowaną liczbę kroków.
  2. 2.
    Ustaw zmienną Miejsce pierwszego zawodnika na (Miejsce drugiego zawodnika + 1).
  3. 3.
    Nadaj komunikat: Zawodnik nr 1 na mecie.
  4. 4.
    Zatrzymaj ten skrypt.
Wówczas przykładowy algorytm działania duszka kibicującego pierwszemu zawodnikowi może być następujący:

Kiedy kliknięto zieloną flagę:
  1. 1.
    Idź do pozycji startowej.
  2. 2.
    Zawsze:
    1. 2.1.
      Czekaj 0.25 sekundy.
    2. 2.2.
      Zmień kostium na następny.
Kiedy otrzymam komunikat Zawodnik nr 1 na mecie:
  1. 1.
    Jeżeli Miejsce pierwszego zawodnika = 1 to:
    1. 1.1.
      Powiedz „Hura! Wygraliśmy!”.
  2. 2.
    W przeciwnym razie:
    1. 2.1.
      Powiedz „Buuu! Przegraliśmy”.
    2. 2.2.
      Zatrzymaj inne skrypty duszka.
  3. 3.
    Zatrzymaj ten skrypt.
Jak można było zauważyć na filmie z przykładem działania programu, poszczególnym zawodnikom kibicuje całkiem duża grupa publiczności. Do powielenia pojedynczego kibica można użyć mechanizm klonowania duszków, który zostanie omówiony w dalszej części podręcznika.

Tworzymy aplikację - budujemy skrypty

Mając zaprojektowane działania dla poszczególnych duszków, możesz przystąpić do stworzenia skryptów.

Zadanie 2.4.6.

Przygotuj tło sceny na potrzeby wyścigów, dodaj dwa duszki - zawodników oraz dwa duszki - kibiców (po jednym dla każdego zawodnika), ewentualnie inne duszki - jeśli zostały uwzględnione w twoim planie. Nie zapomnij odpowiednio nazwać każdego duszka.

Zadanie 2.4.7.

Stwórz skrypty dla każdego z duszków zgodnie z przygotowanymi algorytmami ich działania. Następnie przetestuj program. Uruchom go parokrotnie. Czy zawodnicy zwyciężają na zmianę? Czy każdego z zawodników dopinguje jeden kibic, który cieszy się, w przypadku zwycięstwa lub jest smutny, w przypadku przegranej?
Przykładowe skrypty dla pierwszego zawodnika mogą wyglądać następująco:
Przykładowe skrypty dla kibica pierwszego zawodnika mogą wyglądać następująco:

Zwiększamy liczbę kibiców

Podczas zawodów jednego zawodnika lub drużynę dopinguje zazwyczaj wielu kibiców. Dlatego także w twojej symulacji wyścigów warto zadbać o odpowiednią liczbę widzów.

Zadanie 2.4.8.

Zastanów się, w jaki sposób możesz zmodyfikować algorytm działania duszka - kibica wykorzystując mechanizm klonowania, aby zwiększyć liczbę widzów dopingujących danego zawodnika.

Wskazówka

W celu wykorzystania mechanizmu klonowania do zwiększenia liczby kibiców, należy dodać w algorytmie działania kibica, aby sklonował się określoną liczbę razy. Należy także przewidzieć, co ma zrobić, gdy zaczyna istnienie jako klon. Warto zauważyć, że klon nie wykona poleceń, które duszek wykonał po kliknięciu zielonej flagi. Dlatego w instrukcjach, które wykona, gdy zacznie jako klon, powinny znaleźć się m.in.: polecenie przesuwające go w odpowiednie miejsce na scenie (inaczej zacznie dokładnie w miejscu, w którym znajduje się oryginalny duszek) oraz np. instrukcje animacji jego postaci.
Przykładowe skrypty, które można dodać dla duszka - kibica, aby go sklonować:

Zadania uzupełniające

Zadanie 2.4.9.

Dodaj do aplikacji wyświetlanie czasów poszczególnych zawodników w podobny sposób, jak widać na filmie z przykładową aplikacją.

Zadanie 2.4.10.

Dodaj do aplikacji wyświetlanie miejsca, które zajął dany zawodnik, w podobny sposób, jak widać na filmie z przykładową aplikacją.

Zadanie 2.4.11.

Utwórz nową wersję aplikacji i dodaj do niej dodatkowego zawodnika (wraz z kibicującymi mu widzami), czasem, który osiągnął na mecie oraz miejscem, które zajął.

Zadanie 2.4.12.

Dodaj do aplikacji dekorację zawodników na podium, po zakończonym wyścigu. Jeśli w twoim programie ścigają się samochody, dekorowani powinni być ich kierowcy.

Zadanie 2.4.13.

Przeprowadź kilkanaście wyścigów i zanotuj ile razy wygrali poszczególni zawodnicy. Wyniki porównaj z kolegami. Czy można przyjąć, że przy odpowiednio wielu próbach, każdy z zawodników wygra mniej więcej tyle samo razy?

Zadanie 2.4.14.

Zmodyfikuj aplikację w taki sposób, aby automatycznie po zakończeniu wyścigu startował następny. Niech program automatycznie zlicza i wyświetla łączną liczbę wygranych dla poszczególnych zawodników. Uruchom program i obserwuj wyniki. Czy twoje wcześniejsze obserwacje potwierdzają się?