Projekt – gra WYŚCIGI

W czasie tej lekcji uczniowie zbudują kolejne urządzenie oraz stworzą do niego oprogramowanie. Gra wyścigi dedykowana jest dla dwóch graczy i sprawdza naszą szybkość i refleks.

CELE, POJĘCIA, MATERIAŁY ▼

Cele zajęć

Cele ogólne:

• Wyrabianie umiejętności rozumienia, analizowania i rozwiązywania problemów na bazie logicznego i abstrakcyjnego myślenia.
• Doskonalenie myślenia algorytmicznego.
• Programowanie i rozwiązywanie problemów z wykorzystaniem komputera oraz
innych urządzeń cyfrowych, poprzez układanie i programowanie algorytmów.
• Zgłębianie znajomość zasad działania urządzeń cyfrowych oraz wykonywania programów.
• Rozwijanie kompetencji społecznych, takich jak: komunikacja i współpraca w grupie, udział w projektach zespołowych oraz organizacja i zarządzanie projektami.

Cele szczegółowe

Uczeń potrafi:
• Zbudować urządzenie elektroniczne korzystając z instrukcji i gotowych podzespołów.
• Prawidłowo podłączyć urządzenia wejścia wyjścia (czujniki, diody, wyświetlacz, przycisk) do sterowania Arduino za pośrednictwem adaptera LOFI Brain.
• Wyjaśnić na czym polega istota zaplanowanej gry.
• Określić cele gry, zmienne i warunki, jakie muszą znaleźć się w programie.
• Zaplanować szkic programu w Arduino IDE służący osiągnięciu konkretnego celu.
• Napisać program będący w pełni funkcjonalną grą.
• Zapisywać, weryfikować, wgrywać, testować i poprawiać program.
• Wyjaśnić zasadę działania programu, analizując poszczególne linie kodu.
• Rozbudować swoją grę o nowe funkcje.

Treści programowe (związek z podstawą programową)

Podstawa programowa z informatyki – szkoła podstawowa:
Etap II – klasy IV – VIII, w tym klasy VII – VIII: I.1.b, I.2.a, I.2.b, I.2.c, I.3, II.1.b, II.3, III.3, IV.1, IV.2, IV.3, IV.4,
Etap II – klasy VII-VIII: I.1, I.2.a, I.4, II.1, II.2, II.5, III.3, IV.1.

Pojęcia kluczowe

• projekt
• dioda
• wyświetlacz RGB 8×8
• czujnik natężenia światła
• przycisk
• sterownik Arduino / płytka
• adapter LOFI Brain
• funkcje (setup, loop, write, delay, read, buzzer, distance, servo, display.begin, display.show, displayClear, displayNumber, rectangle. color, rainbowColor)
• zmienna liczbowa, zmienna boolen / bool

Metody pracy

• Wykład problemowy,
• Dyskusja dydaktyczna związana z wykładem,
• Pokaz,
• Projekt.

Materiały pomocnicze

• Zestaw LOFI Robot CODEBOX Starter wraz z rozszerzeniem CODEBOX TV,
• Komputery stacjonarne lub przenośne z zainstalowanym Arduino IDE,
• Komputer nauczyciela z zainstalowanym Arduino IDE, projektor, tablica projekcyjna.

ZWIŃ ▲

Czas na realizację zajęć:

2-3 godziny lekcyjne (2×45 minut lub 3×45 minut)

Przebieg zajęć

1. Wprowadzenie w tematykę i integracja grupy:

Czas na realizację tej części: ok 5 minut.

Prosimy uczniów aby podzielili się swoimi przeżyciami z ostatniego projektu. Co najbardziej im się podobało? Jak można byłoby udoskonalić strzelnicę? Czy mają pomysł na jakąś podobną grę, bazując na strzelnicy?

Mówimy, że podczas tej lekcji (która może potrwać od 2 do 3 godzin) zajmiemy się projektem innej gry. Stworzymy grę wyścigi (przeciąganie liny). Będzie sprawdzała szybkość i refleks. Będzie to gra dla dwóch zawodników.

2. Część zasadnicza:

Czas na realizację tej części: ok 80 minut.

Do realizacji projektu potrzebować będziemy:
• LOFI Brain,
• wyświetlacz LED 8×8 pikseli RGB,
• przycisk,
• 2 czujniki światła,
• 2 diody LED,
• kabel USB,
• elementy konstrukcyjne z zestawu LOFI Robot CODEBOX.

Część 1 Projektowa.

Konstrukcja robota

(czas potrzebny na wykonanie tej części to około 15 minut)

Instrukcja złożenia urządzenia

Podłączenie:

• czujnik światła → port INPUT1 – sterowanie dla gracza nr 1
• czujnik światła → port INPUT2 – sterowanie dla gracza nr 2
• przycisk → INPUT3 – do resetowaniw gry
• czerwona dioda LED → port OUTPUT1 – sygnalizacja dla gracza nr 1
• zielona dioda LED → port OUTPUT2 – sygnalizacja dla gracza nr 2
• wyświetlacz → OUTPUT3 – do obserwowania postępów
• zasilanie robota → kabel USB → wyjście USB w komputerze

Część 2 Projektowa

Programowanie

(czas potrzebny na wykonanie tej części to około 65 minut)

Opis działania programu:

Dwóch zawodników zasłania i odsłania dłońmi jak najszybciej czujnik światła. Postępy wyświetlane są na ekranie LED 8×8 przy pomocy dwóch pasków postępu (czerwony i zielony). Wygrywa ten zawodnik, który szybciej macha ręką i którego pasek pierwszy dojdzie do końca ekranu.

Założenia do omówienia:

1. Zmienne w grze:
a) liczbowe deklarowane na początku szkicu, przed pętlą setup()
• dwie do odczytywania wartości z czujnika światła (po jednej dla każdego gracza), np. foto1, foto2;
• jedna do ustawienia poziomu “czułości”, np. czulosc;
• dwie do określania stopnia postępu / poziomu (po jednej dla każdego gracza), np. level1, level2;
• jedna na przechowanie wyniku o numerze zwycięzcy, np. winner
b) inne
• dwie typu boolen do przechowywania wartości prawda/fałsz, oznaczające zakrycie lub odkrycie czujnika (przyjmijmy, że false = odkryty, true = zakryty);

bool foto1_pressed = false;
bool foto2_pressed = false;

2. Instrukcje warunkowe:

a) Zdobywanie punktów – jeżeli czujnik jest odkryty (zmienna bool = false) i gracz zakryje ręką czujnik (odczyt z czujnika < czułości) to zaświeci się jego dioda (OUTPUT1), zmienna bool ma zmienić wartość na true (oznaczającą, że czujnik został zakryty), a gracz ma zdobyć punkt.

b) Blokowanie naliczania punktów – gdy trzyma zakryty czujnik po zdobyciu 1 punktu: jeżeli czujnik jest zakryty (zmienna bool = true) i gracz trzyma rękę na czujniku (odczyt z czujnika < czułości) to dioda OUTPUT1 ma się wyłączyć i żadne inne zmienne nie zmieniają się.

c) Odblokowanie możliwości zdobycia punktu gdy gracz odkryje czujnik – jeżeli czujnik jest zakryty (zmienna bool = true) i gracz odkryje czujnik (odczyt z czujnika > czułości) to dioda OUTPUT1 ma się wyłączyć, a zmienna bool ma przyjąć wartość na false (oznaczającą odkrycie czujnika), bez dodawania punktów

d) takie same 3 instrukcje warunkowe należy napisać dla drugiego gracza.

e) Określenie zwycięzcy: jeżeli nikt jeszcze nie został zwycięzcą (winner == 0) i poziom gracza pierwszego > 32 wówczas zwycięzcą ma zostać gracz pierwszy, czyli zmiennej winner przypisujemy wartość 1.

Czemu 32? Maksymalna wartość zmiennej poziom powinna być podzielna przez 8 (bo tyle mamy kolumn na wyświetlaczu), a jednocześnie nie powinna być ani za duża, ani za mała, aby ilość zasłonięć nie była zbyt duża/mała. Np. przy 8 zasłonieniach gra byłaby zbyt krótka, a przy 100 – dłużyła by się. Przy 32, 40, czy 48 zasłonięciach prowadzących do zwycięstwa gra jest przyjemna.

f) Analogiczny warunek dla drugiego gracza.

g) Rysowanie pasków graczy na ekranie – jeśli nikt jeszcze nie został zwycięzcą if (winner == 0), to:

• ustawiamy kolor czerwony dla gracza pierwszego i rysujemy prostokąt od X=0 i Y=0, o szerokości równej ¼ aktualnego poziomu tego gracza oraz wysokości 4,
• ustawiamy kolor zielony dla gracza drugiego i rysujemy prostokąt od X=0 i Y=4, o szerokości równej ¼ aktualnego poziomu tego gracza oraz wysokości 4,

Dopiero później wywołujemy wyświetlanie grafiki na wyświetlaczu funkcją display.show()

h) Reset gry – jeśli wartość odczytu z wejścia INPUT3 będzie większa od 90, to zmiennym: winner, level1 i level2 przypisuje się wartość 0, a wyświetlacz zostaje wyczyszczony funkcją displayClear();

Przykładowy kod gotowej gry:

#include <LOFI.h>
LOFI robot;

int foto1;
int foto2;
int czulosc = 15;

bool foto1_pressed = false;
bool foto2_pressed = false;

int level1 = 0;
int level2 = 0;
int winner = 0;

void setup() {
Serial.begin(9600);
robot.displayBegin();
robot.displayShow();
}

void loop() {
foto1 = robot.read(INPUT1);
foto2 = robot.read(INPUT2);

// pierwszy gracz:
if (foto1<czulosc && foto1_pressed == false) {
  robot.write(OUTPUT1,100);
  foto1_pressed = true;
  level1 = level1 + 1;
}

if (foto1<czulosc && foto1_pressed == true) {
  robot.write(OUTPUT1,0);
}

if (foto1>czulosc && foto1_pressed == true) {
  robot.write(OUTPUT1,0);
  foto1_pressed = false;
}

// drugi gracz:
if (foto2<czulosc && foto2_pressed == false) {
  robot.write(OUTPUT2,100);
  foto2_pressed = true;
  level2 = level2 + 1;
}

if (foto2<czulosc && foto2_pressed == true) {
  robot.write(OUTPUT2,0);
}

if (foto2>czulosc && foto2_pressed == true) {
  robot.write(OUTPUT2,0);
  foto2_pressed = false;
}

// określenie zwycięzcy
if (winner == 0 && level1>32) {
  winner = 1;
}

if (winner == 0 && level2>32) {
  winner = 2;
}

// rysowanie pasków graczy na ekranie
if (winner == 0)
robot.color(100,0,0);

robot.rectangle(0,0,level1/4,4);
robot.color(0,100,0);
robot.rectangle(0,4,level2/4,4);

if (winner == 1) {
  robot.color(100,00,0);
robot.rectangle(0,0,8,8);
}

if (winner == 2) {
robot.color(0,100,0);
robot.rectangle(0,0,8,8);
}

robot.displayShow();

//reset gry
if (robot.read(INPUT3) > 90) {
  winner = 0;
  level1 = 0;
  level2 = 0;
  robot.displayClear();
}
}

Po napisaniu gry, weryfikacji i wgraniu na płytkę, dajemy uczniom trochę czasu na zabawę.

Jeśli zostanie czas możemy z uczniami zastanowić się nad tym jak rozbudować projekt? Powodzenia!

3. Podsumowanie i ewaluacja:

Czas na realizację tej części: ok. 10 minut.

Prosimy aby uczniowie ostrożnie spakowali zestawy. Jeden przedstawiciel każdej grupy przynosi zestaw na wyznaczone przez nauczyciela miejsce w klasie.

Zadajemy uczniom pytania: Co najbardziej podobało się Wam w tym projekcie? Na jakie problemy napotkaliście podczas realizacji projektu? Co było najtrudniejsze? Z czym nie było problemów?

Podajemy przykładowe pomysły na inne gry, jakie można stworzyć dzięki zestawowi LOFI Robot CODEBOX:

• Bramka do piłki nożnej – strzelanie piłką wykrywa styk,
• Gorący ziemniak – czas ucieka trzeba podawać z rąk do rąk,
• System alarmowy – przecinanie promieni lasera,
• Utrzymywanie równowagi – porówanie dwóch czujników światła,
• Frogger – żaba przechodzi przez ulicę,
• Liczba parzysta/nieparzysta – na wyświetlaczu pokazywana jest losowa liczba w zakresie 0-99. Użytkownik ma za zadanie jak najszybciej wybrać czy jest parzysta czy nieparzysta, naciskając jeden z dwóch przycisków (jako przyciski używamy fotoresystory). Zawodnik musi odgadnąć jak najwięcej liczb w przeciągu określonego czasu np 30 sek. Jeśli się pomyli, kończy grę przed czasem.

O autorze scenariusza:

Grzegorz Zawistowski

Grzegorz Zawistowski

Nauczyciel informatyki w szkole podstawowej. Miłośnik komputerów, nowinek technicznych i robotyki. Szkoleniowiec i trener m.in, w #Superkoderach i Mistrzach Kodowania.