Tworzenie symulacji - wyścigi w środowisku Scratch
Wyścigi – scenariusz projektu
Projekt będzie polegał na opracowaniu programu symulującego wyścigi, z wykorzystaniem języka programowania Scratch. Od twojego wyboru zależy, jacy zawodnicy lub zawodniczki wezmą udział w danej 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.
RvNX6mjMkFgBa
Aby wykonać to ćwiczenie, ważna jest znajomość podstaw obsługi środowiska Scratch. Jeśli nie masz doświadczenia z tym językiem, zachęcamy do zapoznania się z materiałem Wprowadzenie do środowiska ScratchDUVRjOY3CWprowadzenie do środowiska Scratch.
Polecenie 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?
iHx6nhN4fB_d5e124
Wykorzystaj poniższy dzienniczek na zapisanie swoich notatek i przemyśleń.
RvMVGW2qBMwpj
Projektujemy działania duszków
3
Ćwiczenie 1
Zastanów się nad możliwym przebiegiem wyścigu i zapisz algorytmy, według których poruszać się będzie każdy 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.
Aby szanse na wygraną były takie same, a symulacja dynamiczna możesz losować liczbę kroków, o jaką przesunie się dany zawodnik przed wykonaniem przez niego pojedynczego ruchu. Pamiętaj o ustawieniu zawodnika w punkcie startu oraz zaplanuj sygnał, po którym rozpocznie się wyścig, czyli uruchomi się symulacja.
Po uruchomieniu programu należy ustawić zawodnika na pozycji startowej:
Kiedy kliknięto zieloną flagę:
Idź do pozycji startowej.
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:
Przesuń o wylosowaną liczbę kroków.
Zatrzymaj ten skrypt.
R1LWZjda79HTC
Ćwiczenie 1
1
Ćwiczenie 2
Zapisz algorytm, który będzie rozpoznawał, że zawodnik osiągnął linię mety.
To, czy zawodnik osiągnął linię mety można sprawdzić na kilka sposobów:
sprawdzenie, czy jego liczba określająca położenie ( lub - w zależności od tego, w jakim kierunku porusza się zawodnik) jest większa lub mniejsza od ustalonej pozycji mety,
dodanie duszka - linia mety lub oznaczenie linię mety specjalnym kolorem - gdy duszek - zawodnik dotknie go, rozpozna, że dotarł do linii mety.
Jeżeli dodany zostanie duszek - linia mety, algorytm może wyglądać następująco:
Kiedy wciśnięto klawisz spacja:
Powtarzaj, aż dotyka duszka - linia mety: 1.1. Przesuń o wylosowaną liczbę kroków.
Zatrzymaj ten skrypt.
RptnB0FozlFCW
Ćwiczenie 2
1
Ćwiczenie 3
Określ, w jaki sposób rozpoznać, że zawodnik wygrał lub przegrał.
To, czy zawodnik dodarł pierwszy, czy drugi na metę można sprawdzić wykorzystując np. zmienne.
Pierwszy sposób, to utworzenie dla każdego zawodnika zmiennej np. Miejsce pierwszego zawodnika oraz Miejsce drugiego zawodnika. Po uruchomieniu programu, wartości zmiennych należy ustawić na . 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 . Wówczas jeśli dotrze pierwszy, wartość ta wyniesie , jeśli drugi, to .
Drugi sposób to utworzenie zmiennych przechowujących czas jazdy poszczególnych zawodników. Przy każdym ruchu zawodnika można zapisywać czas, jaki upłynął od wystartowania korzystając z klocka stoperiHx6nhN4fB_d498e137stoper. Gdy zawodnicy dotrą do mety, w ich zmiennych będzie zapisany czas ich jazdy. Wystarczy sprawdzić, który zawodnik dotarł 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. Można w tym celu porównać liczby lub obu zawodników. To rozwiązanie pozwala uniknąć stosowania zmiennych.
Jeżeli zaplanujesz wykorzystanie zmiennych przechowujących 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:
Powtarzaj, aż dotyka duszka - linia mety. 1.1. Przesuń o wylosowaną liczbę kroków.
Ustaw zmienną Miejsce pierwszego zawodnika na (Miejsce drugiego zawodnika + 1).
Zatrzymaj ten skrypt.
Należy pamiętać, aby po uruchomieniu aplikacji wyzerować zmienną przechowującą miejsce zawodnika. Przykładowy algorytm dla pierwszego zawodnika może wyglądać tak:
Kiedy kliknięto zieloną flagę:
Ustaw zmienną Miejsce pierwszego zawodnika na .
Idź do pozycji startowej.
Zatrzymaj ten skrypt.
RQmGuTkaxGX5C
Ćwiczenie 3
1
Ćwiczenie 4
W jaki sposób powinien zachowywać się duszek - kibic? Zapisz algorytmy postępowania kibica w trakcie wyścigu, a także po przegranej lub wygranej zawodnika któremu będzie kibicować.
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ł. Informację o tym, który zawodnik wygrał można przekazać kibicom wykorzystując 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:
Powtarzaj aż dotyka duszka - linia mety: 1.1. Przesuń o wylosowaną liczbę kroków.
Ustaw zmienną Miejsce pierwszego zawodnika na (Miejsce drugiego zawodnika + 1).
Nadaj komunikat: Zawodnik nr 1 na mecie.
Zatrzymaj ten skrypt.
Wówczas przykładowe algorytmy działania duszka kibicującego pierwszemu zawodnikowi mogą być następujące:
Kiedy kliknięto zieloną flagę:
Idź do pozycji startowej.
Zawsze: 2.1. Czekaj sekundy. 2.2. Zmień kostium na następny.
Kiedy otrzymam komunikat Zawodnik nr 1 na mecie:
Jeżeli Miejsce pierwszego zawodnika = 1 to: 1.1. Powiedz „Hurra! Wygraliśmy.”. W przeciwnym razie: 1.2. Powiedz „Buuu! Przegraliśmy.”.
Zatrzymaj inne skrypty duszka.
Zatrzymaj ten skrypt duszka.
Rr9A31K0Dom1K
Ćwiczenie 4
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 materiału.
iHx6nhN4fB_d498e137
ROy8C1OssOc4t
Wartością jest czas liczony w sekundach od momentu ostatniego kliknięcia zielonej flagi lub wykonania bloczka resetuj stoper. Włączenie znacznika po lewej stronie powoduje wyświetlanie czasu na scenie.
Przykład:
RaaCtkh11xtDw
iHx6nhN4fB_d5e394
Tworzymy aplikację - budujemy skrypty
Mając zaprojektowane działania dla poszczególnych duszków, możesz przystąpić do stworzenia skryptów.
Polecenie 2
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.
To jak przygotujesz tło sceny będzie miało wpływ na pozycje startowe zawodników, czy miejsca kibiców. Nie musisz sugerować się poniższymi wartościami. W twoich skryptach zawodnicy mogą ścigać się, np. w innym miejscu sceny.
2
Ćwiczenie 5
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?
Utwórz duszki obu zawodników, każdy z nich powinien mieć dwa skrypty:
ustawienia początkowe przed wyścigiem,
skrypt aktywujący sam wyścig.
Następnie utwórz skrypt kibica pierwszego zawodnika i skrypt kibica drugiego zawodnika. Każdy z kibiców również powinien mieć dwa skrypty:
ustawienia początkowe,
skrypt odpowiedzialny za reakcję na wygraną lub przegraną swojego zawodnika.
Przykładowe skrypty dla pierwszego zawodnika mogą wyglądać następująco:
RNSIJxtqrVRVO
Przykładowe skrypty dla kibica pierwszego zawodnika mogą wyglądać następująco:
RHkoqcqEgvYHm
RFkpWMdWtbFsi
Ćwiczenie 5
iHx6nhN4fB_d5e451
klonowanie_duszkow
Klonowanie to funkcja w Scratchu, która pozwala na tworzenie kopii duszków podczas projektu. Każdy klon ma te same cechy, takie jak wygląd, dźwięki, skrypty i zmienne, jak oryginał, ale działa niezależnie. Klonowanie różni się od stemplowania, ponieważ stemplowanie tworzy tylko obraz duszka na scenie, podczas gdy klony są oddzielnymi duszkami, które mogą interpretować skrypty i działać niezależnie. Stemplowanie domyślnie dotyczy tylko aktualnego obrazu duszka. Również, klony nie pojawiają się w okienku duszków tak jak zwykłe duplikaty, są tymczasowe i znikają po zakończeniu skryptu. W ten sposób, klonowanie w Scratchu pozwala na tworzenie dynamicznych kopii duszków, które mogą wykonywać różne czynności, co daje więcej możliwości programowania i interakcji w projekcie.
Klonowanie jest przydatne w przypadku projektów, w których istnieje wiele podobnych duszków wykonujących podobne zadania. Dzięki klonowaniu projekt tworzy kopie duszków, a nie użytkownik, co ułatwia zachowanie spójności między nimi. Ta funkcja zapobiega konieczności wprowadzania tych samych zmian w każdym z wielu duszków. Zamiast tego, użytkownik może wprowadzić zmiany w jednym duszku, a klonowane kopie automatycznie odzwierciedlą te zmiany. Dzięki temu klonowanie umożliwia bardziej efektywne zarządzanie projektami z wieloma podobnymi duszkami, zapewniając spójność i jednoczesne dostosowywanie zachowań każdego z nich.
Przykłady bloków związanych z klonowaniem, można je znaleźć w kategorii Kontrola:
R19qgMQvepFEs
Powyższy blok odpowiada za utworzenie klona z wybranego duszka.
R10w8oNP0Ii2p
Kiedy wybrany duszek jest sklonowany, ten blok zaczyna działanie skryptu w nowo utworzonym klonie.
RPDvyEE98CYVY
Powyższy blok odpowiada za usuwanie klona. Dodatkowo zatrzymuje wszystko swoje skrypty klona.
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.
2
Ćwiczenie 6
Zmodyfikuj działanie duszka - kibica tak, aby zwiększyć liczbę widzów dopingujących danego zawodnika. Wykorzystaj w tym celu mechanizm klonowaniaklonowanie_duszkowmechanizm klonowania.
Najpierw napisz skrypt zwiększania liczby kibiców. Zastosuj do tego określoną liczbę razy blok Utwórz klona.
Przykładowe skrypty, które można dodać dla duszka - kibica:
RYhqf8vLTw2Gu
R1RwFBdbQDxU0
Ćwiczenie 6
iHx6nhN4fB_d5e505
Zadania uzupełniające
2
Ćwiczenie 7
Dodaj do aplikacji wyświetlanie czasów poszczególnych zawodników w podobny sposób, jak widać na filmie z przykładową aplikacją.
Do poprawnego wyświetlania czasu każdego z zawodników należy utworzyć nowe skrypty aktualizujące zmienne Czas pierwszego/drugiego samochodu. Każda zmienna powinna być aktualizowana podczas każdego przejścia przez pętlę, która sprawdza, czy samochód dojechał na metę.
Bloki Resetuj stoper oraz stoper znajdziesz w zakładce Czujniki.
Przykładowa implementacja (sposób zaprogramowania) licznika czasu pierwszego samochodu:
R1acRi9qXAVmm
RNmlDMjieuYCG
Ćwiczenie 7
2
Ćwiczenie 8
Dodaj do aplikacji wyświetlanie miejsca, które zajął dany zawodnik, w podobny sposób, jak widać na filmie z przykładową aplikacją.
W celu pokazywania wartości zmiennej przetrzymującej miejsce danego zawodnika należy ustawić widoczność zmiennej w zakładce Zmienne.
Jeżeli chcesz, aby wartość danej zmiennej była widoczna na scenie, zaznacz kwadrat znajdujący się po jej lewej stronie.
RZw3qlkXGGrM2
RRVPL09Tb1vjm
Ćwiczenie 8
2
Ćwiczenie 9
Przeprowadź kilkanaście wyścigów i zanotuj, ile razy wygrali poszczególni zawodnicy. Wyniki porównaj z kolegami i koleżankami. Czy można przyjąć, że przy odpowiednio wielu próbach, każdy z zawodników wygra mniej więcej tyle samo razy?
Niech każdy z was przeprowadzi różną liczbę wyścigów. Porównaj wyniki z kolegami i koleżankami oraz spróbujcie wyciągnąć z nich wnioski.
Wraz ze wzrastającą liczbą przeprowadzonych wyścigów, liczba wyścigów wygranych przez każdy z samochodów będzie się coraz bardziej wyrównywać.
RL2UOuFHerRkS
Ćwiczenie 9
3
Ćwiczenie 10
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ę?
Do wykonania tego zadania najlepiej wykorzystaj komunikaty, które możesz znaleźć w zakładce Zdarzenia.
Utwórz dodatkowy skrypt, który będzie cały czas sprawdzał, czy oba samochody zakończyły wyścig. Jeżeli tak, rozpocznij przygotowania do następnego wyścigu (skrypt, w którym samochody umieszczane są na miejsca startowe).
Ostatnią modyfikacją aplikacji będzie sposób, w jaki nowe wyścigi są rozpoczynane. Skrypt przygotowujący samochody do wyścigu powinien na końcu nadawać komunikat pozwalający na jego rozpoczęcie.
Przykładowa implementacja (sposób zaprogramowania) dla pierwszego samochodu: