Nauka Scratch, lekcja 3: uczymy robaka chodzić!

Witajcie!

Na poprzedniej lekcji nauczyliśmy się wprawiać w ruch naszego bohatera. Dziś popracujemy nad tym, żeby ruch nie był tak jednostajny. Dodamy trochę realizmu do ruchu, a jednocześnie poznamy zmienne – zobaczycie po co się je stosuje i jak działają. Aha, no i dziś zmieniamy naszą postać, przedstawiam Wam robaka :). Zresztą zobaczcie sami nad czym będziemy pracować:

Gotowi do działania?! To działamy! Pierwsza rzecz jaką powinniście zrobić, to oczywiście otwarcie tego projektu i zajrzenie do środka. Tak samo jak mechanik zagląda pod maskę, nawet z ciekawości 🙂

Na początku opiszę Wam co chciałem osiągnąć, sami oceńcie czy to się udało:

  • robak miał poruszać się po całej planszy,
  • ale nie wychodzić poza nią,
  • i miał mieć możliwość łatwego parametryzowania swojego zachowania.

Pierwsza rzecz, jaką trzeba zrobić, to zmiana postaci (duszka). Robimy to klikając w obszarze duszków (lewy dolny róg ekranu tworzenia programu) w przycisk Nowy duszek: „Wybierz duszka z biblioteki” nowy duszek - wybierz duszka z biblioteki. Wybieramy postać, którą nauczymy chodzić po planszy (ja wybrałem robala).

Skoro jesteśmy w tej części ekranu, to rozwiążę zagadkę z poprzedniej lekcji. Oczywiście elementem, o którym nie napisałem była… zmiana tła 🙂 

03_01 zmiana tla

Po wybraniu duszka (i ewentualnie tła) możemy chwilę się zastanowić jak chcemy zrealizować ruch. Ja chcę to zrobić następująco: w każdym cyklu robak powinien obracać się losowo w lewo lub prawo i robić krok do przodu. Pomiędzy cyklami robak powinien nie robić nic poza czekaniem (przez pewien ustalony czas). W chwili wymyślania programu nie wiem dokładnie jak długi powinien być krok robaka, w jakim zakresie powinien się obracać (o ile stopni) i jak długo powinien czekać pomiędzy cyklami. Zakładam, że trochę poeksperymentuję z tymi parametrami. I tu z pomocą przychodzą zmienne.

Oczywiście w tym przykładzie będzie to bardzo proste wykorzystanie zmiennych – tak naprawdę są one dużo bardziej użyteczne, o czym przekonacie się w kolejnych lekcjach. Gdyby nie zmienne, programowanie byłoby naprawdę nudne 🙂

Co to są zmienne? To pewne wartości, które możemy zmieniać, a są dostępne pod zdefiniowanymi nazwami 🙂 (nie jest to książkowa definicja). No dobra, jak zrobimy to zobaczycie o co chodzi i okaże się czy są tak skomplikowane jak ta moja definicja. Zacznijmy od stworzenia zmiennych, klikamy kolejno jak na obrazku

03_02 nowa zmienna

a następnie wpisujemy nazwę zmiennej, którą chcemy stworzyć (czynności powtarzamy dla każdej zmiennej). W moim przypadku tworzę następujące zmienne:

  • opoznienie_ruchu – opóźnienie czasowe pomiędzy kolejnymi cyklami ruchu (krokami),
  • krok – o ile robak przesunie się w jednym kroku do przodu,
  • min_obrot – minimalny kąt obrotu robaka w każdym cyklu ruchu,
  • max_obrot – maksymalny kąt obrotu.

Oprócz nazwy zmiennej możemy jeszcze wybrać czy zmienna jest widoczna „Dla wszystkich duszków” (zmienna globalna) czy „Tylko dla tego duszka” (zmienna lokalna). Ma to duże znaczenie jeśli tworzymy program z wieloma duszkami. Dokładne różnice opiszę jak dojdziemy do odpowiedniego przykładu.

Już po stworzeniu pierwszej zmiennej pojawiają się w zakładce „Skrypty” -> „Dane” bloki, dzięki którym możemy:

  • odczytać wartość zmiennej zmienna krok,
  • ustawić wartość zmiennej ustaw krok na 0
  • i zmienić wartość zmiennej o zadaną wartość zmien krok o 1.

Dodatkowo możemy sterować wyświetlaniem wartości zmiennych za pomocą przycisków pokaz zmienna krok i ukryj zmienna krok. Wyświetlić i ukryć wartość zmiennej na ekranie można również za pomocą checkboxa przy zmiennej (zmienna krok).

Jeśli teraz prześledzimy program zobaczymy, że na samym początku (po kliknięciu w zieloną flagę) ustawiane są wartości początkowe wszystkich stworzonych zmiennych.

Według mnie jest to bardzo dobra praktyka, żeby w jednym miejscu (jeśli to możliwe i sensowne) ustawiać wszystkie wartości początkowe zmiennych. Przy bardziej złożonych programach łatwiej jest znaleźć i zmienić taką wartość – w przeciwieństwie do ustawiania początkowych wartości zmiennych „gdzie popadnie” w całym skrypcie.

Dalej widzimy pętlę „zawsze”, którą już znacie z poprzednich lekcji. W pętli pierwszym blokiem jest „czekaj opoznienie_ruchu s”. Wstrzymuje on wykonanie skryptu przez określoną ilość sekund, w naszym przypadku zgodną z wartością zmiennej opoznienie_ruchu.

Przyjrzyjmy się dokładniej kolejnemu blokowi, jego zadaniem jest obrót robaka.

03_03 obracanie robaka

Mamy tam duży blok „jeżeli _ to _ w przeciwnym razie _”, którego zadaniem jest podjęcie decyzji czy robakiem skręcamy w lewo czy w prawo. Decyzja opiera się na elemencie (pseudo)losowości. Warunkiem funkcji jeżeli jest porównanie czy wylosowana liczba jest równa 1. Jeżeli jest równa 1 wtedy obracamy duszka w prawo, w przeciwnym razie (czyli jeśli wylosowana jest liczba 2) skręcamy w lewo.

Przy okazji: wynikiem funkcji (bloku) „losuj od 1 do 2” jest liczba 1 lub 2, możemy się ich spodziewać z równym prawdopodobieństwem. W przypadku szerszego zakresu, zostanie wylosowana liczba całkowita z danego zakresu, każdej z nich możemy się spodziewać z równym prawdopodobieństwem.

I teraz zobaczmy jak zrealizowany jest sam obrót (bloki „obróć o …”). Tam również losujemy, tym razem o jaki kąt ma się obrócić robak. I tutaj powinniśmy docenić zastosowanie zmiennych – w obydwu przypadkach zakres losowania określony jest przez zmienne. Zatem w przypadku eksperymentowania z kątami obrotu podajemy tylko jako nowe wartości początkowe zmiennych, a nie nowe wartości ręcznie do każdego z bloków.  Podsumowując tę część: duszka obracamy losowo w lewo lub w prawo o losowy kąt z zakresu [min_obrot; max_obrot].

Pamiętajmy, że zbliżone zachowanie (losowy obrót w lewo lub prawo) można zrealizować na wiele sposobów. Jeden ze sposobów zamiast całego bloku „jeżeli” wykorzystuje tylko jeden blok „obróć o …” – macie pomysły jaki to sposób? Może to być zagadka na dziś. 🙂

Idąc dalej mamy taki fragment:

03_04 kroki robaka

Jego zadaniem jest poruszanie robakiem (wykonywanie kroków), ale w taki sposób, żeby nie wypaść poza planszę. Warunkiem sprawdzanym przez blok „jeżeli” jest czy duszek „nie dotyka krawędź(i)”. Jeżeli nie dotyka, wtedy robak przesuwa się do przodu o ilość kroków zdefiniowaną przez zmienną „krok”. Jeżeli dotyka krawędzi, to cofa się o dwu krotność wartości zmiennej „krok” (tak sobie wymyśliłem – ma to być efekt odbijania się od krawędzi). Jeżeli okaże się, że po cofnięciu duszek nadal jest na brzegu planszy – odbija się od krawędzi (blok „jeżeli na brzegu, odbij się”). Zabezpieczamy się w ten sposób przed wychodzeniem duszka poza krawędź planszy.

Kropką nad i jest zmiana kostiumu na następny – powinniśmy przygotować taki/takie, które sprawiają wrażenie poruszania się naszej postaci (zakładka „kostiumy”).

Dotarliśmy razem do końca. Czekam na informacje od Was czy wszystko było jasne, ewentualnie co dokładniej wytłumaczyć – piszcie w komentarzach.


Listę wszystkich lekcji znajdziecie na tej stronie. Już niebawem kolejna lekcja – zobaczymy jak zrobić walentynkową prezentację.

 

Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments