Programowanie w Scratch: jak zrobić grę typu Memory?

Na blogu pojawiło się już tyle różnych wersji gry memory w wersji papierowej, że chyba przyszedł czas zrobić kolejny krok. Tym razem nie będziemy drukować kart – tym razem zaprogramujemy własną grę memory w Scratchu. 😄

Kto pamięta serię Robimy naszą pierwszą grę, ten może być już przyzwyczajony do tego, jak opisuję Wam krok po kroku kodowanie gry w Scratch. Ten wpis będzie różnił się od tamtej serii tym, że zrobimy całą grę już dziś – w tym jednym wpisie. 🤯

Od razu powiem, że jest to poziom trochę bardziej zaawansowany, więc jeśli nie znacie Scratcha ani trochę, to najpierw sprawdźcie moje pierwsze lekcje.

W tej grze naszym zadaniem będzie odkrywanie kart i szukanie pasujących par – to jest właśnie „mechanika” gry typu memory. Jeśli dwie karty mają taki sam obrazek – pozostają odkryte. Jeśli są różne – po chwili znów się zakrywają. Jak na razie brzmi prosto?

To zaczynamy!

Co będzie nam potrzebne?

Gra Memory w Scratchu polega na tworzeniu kart jako klonów jednego duszka. Każda karta losuje swój obrazek z listy, a program sprawdza, czy dwie odkryte karty tworzą parę. Projekt wykorzystuje zmienne, listy, komunikaty, klony i instrukcje warunkowe.

A zatem w tym projekcie użyjemy:

  • jednego duszka „Karta”,
  • kilku kostiumów z obrazkami,
  • tła startowego,
  • tła „Wygrana”,
  • listy,
  • zmiennych,
  • klonów,
  • komunikatów,
  • warunków,
  • bloczków z kategorii „Wyrażenia”.

Jeśli czujecie się przytłoczeni, to – spokojnie. Wszystko omówimy po kolei. 😄

Jak działa nasza gra?

Nasza gra będzie miała 8 kart.

Każda karta będzie klonem jednego duszka. To oznacza, że nie musimy tworzyć ośmiu osobnych duszków. Tworzymy jedną kartę, a Scratch zrobi jej kopie.

Każda karta dostanie swój numer, swoje miejsce na planszy i swój obrazek.

Krok 1. Przygotowujemy listę obrazków

Najpierw możecie pobrać obrazki, które przygotowałam specjalnie dla tej gry na bazie mojego owocowo-warzywnego memory. Zajrzyjcie do wpisu Owocowo-warzywne grafiki do gry typu Memory, gdzie znajdziecie wszystkie potrzebne grafiki. Możecie też użyć Waszych grafik, albo tych dostępnych w Scratch. A na wypadek, gdybyście zapomnieli – tu jest wyjaśnione, jak wgrać grafiki do Scratcha?

Po skompletowaniu potrzebnych grafik tworzymy listę o nazwie „obrazki kart„. Szukajcie w kategorii „Zmienne” – tam będzie przycisk „Stwórz listę”.

Wpisujemy do niej liczby: 1, 1, 2, 2, 3, 3, 4, 4 Każda liczba oznacza jeden obrazek, np.

  • 1 może oznaczać truskawkę,
  • 2 może oznaczać banana,
  • 3 może oznaczać jabłko,
  • 4 może oznaczać marchewkę.

Ponieważ w memory każda karta musi mieć parę, każda liczba pojawia się dwa razy.

Czym jest lista w Scratchu?

Lista to takie pudełko, w którym możemy przechowywać wiele rzeczy naraz. Dla porównania zmienna przechowuje jedną informację, np.: zmienna ruchy = 3

Lista może przechowywać wiele informacji: obrazki kart = 1, 1, 2, 2, 3, 3, 4, 4

W naszej grze lista działa jak worek z obrazkami. Każda karta losuje jeden element z listy, a potem ten element jest usuwany. Dzięki temu mamy pewność, że każdy obrazek pojawi się dokładnie dwa razy.

Krok 2. Ustawiamy zmienne na początku gry

Kiedy klikamy zieloną flagę, musimy przygotować grę od początku. Ustawiamy tło na planszę gry. Czyścimy listę i ponownie dodajemy do niej obrazki kart, żeby mieć pewność, że wszystkie dobrze się załadowały. Potem ustawiamy zmienne na 0. Wcześniej oczywiście musimy stworzyć te zmienne w kategorii „Zmienne”, naciskając przycisk „Utwórz zmienną”.

Wypiszę Wam teraz wszystkie zmienne, których będziemy używać i oznaczę, które z nich należy ustawić „Dla wszystkich duszków”, a które „Tylko dla tego duszka” – pamiętajcie, to ważne dla poprawnego działania kodu!

Zmienne:

Nazwa zmiennejDla wszystkich, czy dla jednego duszka?Dlaczego tak?
blokada kliknięciaDla wszystkich duszkówGdy dwie karty są odkryte, wszystkie karty muszą wiedzieć, że chwilowo nie wolno klikać
pierwszy obrazekDla wszystkich duszkówZapamiętujemy obrazek pierwszej karty.
drugi obrazekDla wszystkich duszkówZapamiętujemy obrazek drugiej karty.
pierwsza kartaDla wszystkich duszkówZapamiętujemy numer pierwszej odkrytej karty.
druga kartaDla wszystkich duszkówZapamiętujemy numer drugiej odkrytej karty.
liczba trafionych kartDla wszystkich duszkówTo wynik całej gry (licznik znalezionych par).
losDla wszystkich duszkówWspólna zmienna wykorzystywana podczas losowania obrazków.
mój obrazekTylko dla tego duszka (Każda karta ma własne dane, których inne karty nie powinny zmieniać.)Każda karta przechowuje własny owoc lub warzywo.
numer kartyTylko dla tego duszka (Każda karta ma własne dane, których inne karty nie powinny zmieniać.)Każda karta ma swój własny numer.
odkryta?Tylko dla tego duszka (Każda karta ma własne dane, których inne karty nie powinny zmieniać.)Jedna karta może być odkryta, a druga zakryta. Każda musi pamiętać swój stan niezależnie.
ruchyDla wszystkich duszkówLiczba wykonanych ruchów dotyczy całej gry.
licznik kartDla wszystkich duszkówWspólny licznik używany podczas tworzenia kart.

Dlaczego potrzebujemy aż tylu zmiennych?

Bo gra memory musi dużo pamiętać 😄, Scratch musi wiedzieć:

  • która karta została kliknięta jako pierwsza,
  • która karta została kliknięta jako druga,
  • jaki obrazek ma pierwsza karta,
  • jaki obrazek ma druga karta,
  • ile kart już trafiliśmy,
  • ile ruchów wykonał gracz,
  • czy wolno teraz klikać,
  • który klon jest którą kartą.

Nasz program musi przez cały czas zapisywać informacje, żeby móc sprawdzić, czy gracz znalazł parę.

Krok 3. Tworzymy klony kart

Na początku tworzymy jednego duszka o nazwie „Karta” i dodajemy mu 4 kostiumy kart (potem możecie dodać więcej).

Przy okazji dodajmy też od razu grafikę z rewersem karty (tyłem), jako piąty kostium.

Teraz ukrywamy oryginalnego duszka „Karta”, a potem tworzymy 8 klonów.

Każdy klon stanie się jedną kartą na planszy.

To bardzo wygodne, bo jeśli chcemy coś zmienić w działaniu kart, zmieniamy kod tylko jednego duszka, a wszystkie klony działają tak samo. A dlaczego 8 klonów, skoro mamy tylko 4 karty? Bo przypominam, że w memory chodzi o PARY KART – czyli mamy 4 karty, ale każdą z nich musimy wyświetlić podwójnie. 😉

Krok 4. Każdy klon losuje swój obrazek

Kiedy klon powstaje, robi kilka rzeczy:

  1. pokazuje się,
  2. zmienia kostium na rewers karty,
  3. ustawia zmienną „odkryta?” na 0,
  4. losuje obrazek z listy,
  5. usuwa wylosowany element z listy,
  6. dostaje swój numer karty,
  7. idzie na odpowiednie miejsce na planszy.

To bardzo ważny moment.

Dzięki liście nie musimy ręcznie mówić każdej karcie, jaki ma mieć obrazek. Scratch sam losuje obrazki, a ponieważ usuwa je z listy, nie powstaną nam przypadkowe trzy takie same karty.

Ponieważ każda karta ma swój numer, to możemy „powiedzieć” każdej z nich, gdzie ma się znajdować, np.:

  • karta 1 idzie w lewy górny róg,
  • karta 2 idzie obok niej,
  • karta 3 idzie dalej,
  • karta 4 kończy pierwszy rząd,
  • karta 5 zaczyna drugi rząd.

Dlatego w kodzie mamy warunki:

jeżeli numer karty = 1, idź do wybranego miejsca
jeżeli numer karty = 2, idź do kolejnego miejsca
i tak dalej.

To może wyglądać trochę długo, ale dla początkujących jest bardzo czytelne.

Krok 5. Klikamy kartę

Kiedy gracz kliknie kartę, Scratch najpierw sprawdza dwie rzeczy:

  • czy kliknięcia nie są zablokowane, czyli, czy ma nam pozwolić kliknąć,
  • i czy karta nie jest już odkryta.

Jeśli karta może zostać kliknięta, zmienia kostium z rewersu na swój obrazek (losowy).

Potem Scratch sprawdza czy to pierwsza karta w ruchu, czy druga?

Jeśli pierwsza karta jest jeszcze pusta, zapisujemy:

  • numer pierwszej karty,
  • wylosowany obrazek pierwszej karty.

Jeśli pierwsza karta już istnieje, to znaczy, że klikamy drugą kartę. Wtedy zapisujemy:

  • numer drugiej karty,
  • obrazek drugiej karty,
  • dodajemy 1 do liczby ruchów,
  • nadajemy komunikat „sprawdź parę”, żeby program przekonał się, czy mamy trafienie, czy pudło.

Wiem, brzmi skomplikowanie – zróbmy wszystko po kolei:

Jak nadać „komunikat”?

Musimy go stworzyć w kategorii „Zdarzenia”. Tworzy się go przez rozwinięcie listy, np. w bloczku „nadaj komunikat”, na końcu tej listy jest przycisk: „Nowa wiadomość”.

A dlaczego używamy bloczków z kategorii „Wyrażenia”?

Zwróćcie uwagę na powyższy obrazek – jest tam taki skomplikowany zielony bloczek (ten pierwszy w kodzie). Jeden duży zielony bloczek obejmuje dwa mniejsze zielone bloczki… Głowa chce od tego pęknąć! 🤯 Dlaczego to musi wyglądać tak skomplikowanie? Bo czasem warunek nie jest prosty… nie wystarczy zapytać: „Czy kliknięto kartę?”

Musimy zapytać bardziej dokładnie: „Czy kliknięcia są odblokowane ORAZ czy ta karta nie jest jeszcze odkryta?” albo: „Czy numer tej karty jest taki sam jak numer pierwszej karty LUB numer drugiej karty?”

Do takich bardziej złożonych pytań używamy bloczków z kategorii Wyrażenia. To właśnie ta zielona kategoria. To tam znajdziemy bloczki:

  • i,
  • lub,
  • równa się,
  • większe niż,
  • mniejsze niż.

Dzięki nim Scratch może sprawdzać bardziej skomplikowane sytuacje.

Krok 6. Sprawdzamy, czy karty tworzą parę

Teraz Scratch porównuje dwa obrazki. Jeśli pierwszy obrazek = drugi obrazek, to znaczy, że znaleźliśmy parę i wtedy zwiększamy liczbę trafionych kart o 2, bo trafiliśmy dwie karty.

Potem nadajemy komunikat: „para znaleziona„.

Natomiast jeśli obrazki są różne, nadajemy komunikat: „zakryj nietrafione„.

Po sprawdzeniu, czy karty do siebie pasują, czy nie, musimy jeszcze wyzerować zmienne: pierwsza karta, druga karta, pierwszy obrazek, drugi obrazek i blokadę kliknięcia, bo będą nam potrzebne przy kolejnym ruchu.

Krok 7. Co robi komunikat „zakryj nietrafione”?

Jeśli karty nie pasują, musimy zakryć tylko te dwie karty, które właśnie kliknęliśmy. Dlatego każdy klon sprawdza: czy mój numer karty jest taki sam jak pierwsza karta lub druga karta? Jeśli tak, karta zmienia kostium na rewers i ustawia zmienną „odkryta?” na 0.

Dzięki temu znowu można będzie ją kliknąć.

Krok 9. Co robi komunikat „para znaleziona”?

Jeśli karta jest częścią poprawnej pary, nie zakrywamy jej. Ona pozostaje odkryta. To ważne, bo w memory trafione pary zostają widoczne do końca gry. Możemy tutaj dodać dźwięk albo mały efekt, ale nie zmieniamy kostiumu na rewers.

Krok 10. Wygrana

Na końcu sprawdzamy, ile kart zostało trafionych. Ponieważ mamy 8 kart, gra kończy się wtedy, kiedy liczba trafionych kart = 8. Wtedy nadajemy komunikat „wygrana„. Po otrzymaniu tego komunikatu zmieniamy tło na ekran wygranej i zatrzymujemy grę.

Sprawdź, czy działa!

Poprawnie działająca gra powinna wyglądać mniej więcej tak:

A cały kod prezentuje się tak:

Jeśli chcecie podejrzeć go w Scratchu, to link do gry i jej kodu jest tu: Owocowo-warzywne Memory.

Czego nauczyliśmy się w tym projekcie?

Tworząc grę memory w Scratchu, użyliśmy wielu ważnych elementów programowania.

Poznaliśmy:

  • listy,
  • zmienne,
  • klony,
  • losowanie,
  • komunikaty,
  • warunki,
  • wyrażenia,
  • sprawdzanie par,
  • blokowanie kliknięć,
  • ekran wygranej.

To całkiem sporo jak na jedną grę!

Ale właśnie dlatego memory jest tak dobrym projektem do nauki Scratcha. Wygląda prosto, ale w środku ma dużo ciekawej logiki.

Co można dodać później?

Jeśli Wasza gra już działa, możecie ją rozbudować, np. dodać więcej kart, dodać licznik czasu, poziomy trudności, przycisk „zagraj ponownie”, czy własne obrazki. Bo najlepsze w Scratchu jest to, że kiedy już zrozumiemy, jak coś działa, możemy zacząć tworzyć własne wersje.

Do usłyszenia wkrótce!

MOŻE ZAINTERESUJE CIĘ RÓWNIEŻ:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *