Slajd 1/55
Rozbudowany program - wprowadzenie
Cel slajdu: zapowiedź czwartej prezentacji - pełny, wieloekranowy program budowany krok po kroku.

Strona tytułowa

Tytuł: Program "Trener matematyczny" - budowa aplikacji krok po kroku. To pełna, wieloekranowa aplikacja edukacyjna do nauki tabliczki mnożenia.

Trener matematyczny - architektura programu Projekt: Trener matematyczny (Multi-Screen App) Wieloekranowa aplikacja mobilna z trwałym zapisem wyników (TinyDB) i procedurami. Screen1: Menu Start Wyniki Opcje Screen2: Trening 7 × 8 = ? Wpisz wynik... Sprawdź TinyDB + Wyniki Rekord: 10/10 pkt Czas: 00:45 Pamięć trwała telefonu Aplikacja: Trener matematyczny (App Inventor 2) Slajd 1/55
Slajd 2/55
Spis treści prezentacji 4

Plan budowy programu

Spis treści: Plan budowy programu 1 Specyfikacja i ekrany Wymagania, 4 ekrany i przepływ 2 Menu i Ustawienia ListPicker, zakres, reset wyników 3 Ekran Trening i logika Procedury, walidacja, licznik czasu 4 Baza TinyDB i wyniki Zapisywanie rekordu, formatowanie 5 Testy i budowa APK Wykrywanie błędów, kompilacja .apk Aplikacja: Trener matematyczny (App Inventor 2) Slajd 2/55
Slajd 3/55
Cele uczenia się prezentacji 4

Co student będzie umiał

  • W1: zaplanować aplikację wieloekranową. Najpierw szkic ekranów i przepływu, potem kod. Takie planowanie chroni przed kosztownymi przeróbkami.
  • W2: zaprojektować i wykonać spójny interfejs na kilku ekranach. Ten sam układ ułatwia obsługę. Spójność wyglądu skraca czas nauki korzystania z aplikacji.
  • W3: zastosować zmienne globalne, procedury i listy w realnym programie. Te elementy porządkują logikę. Dzięki nim kod jest krótszy i nie powiela się.
  • W4: zaimplementować losowanie zadań, ocenę odpowiedzi i punktację. To buduje mechanikę gry. Tak powstaje serce aplikacji, wokół którego działa cały trener.
  • W5: zapisać i odczytać dane trwałe w TinyDB. Dzięki temu wyniki przetrwają zamknięcie aplikacji. Dane te są przechowywane lokalnie na urządzeniu.
  • K1: samodzielnie rozbudować program o nową funkcję. To dowód zrozumienia wzorców, a nie tylko pamięciowego odtworzenia kodu.
To najbardziej złożony program w całym cyklu - efektem jest pełna, użyteczna aplikacja.
Cele uczenia się: Kompetencje programisty W1 Projektowanie architektury wieloekranowej Podział odpowiedzialności na ekrany (Menu, Trening, Wyniki, Ustawienia). W2 Trwałość danych (Data Persistence) Użycie komponentu TinyDB do zapisu ustawień i rekordów między sesjami. W3 Modularyzacja kodu za pomocą procedur Wydzielenie logiki losowania, walidacji, aktualizacji punktów i formatowania czasu. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 3/55
Slajd 4/55
Specyfikacja programu - cel

Co ma robić "Trener matematyczny"

  • Trenować tabliczkę mnożenia w zakresie zależnym od poziomu. Im wyższy poziom, tym większy zakres losowanych liczb.
  • Zadawać losowe pytania i oceniać odpowiedzi. Losowość sprawia, że każda sesja różni się od poprzedniej.
  • Prowadzić punktację i mierzyć czas sesji. Punkty i czas pozwalają śledzić postępy ucznia.
  • Zapisywać najlepsze wyniki trwale. Dzięki temu rekordy nie giną po zamknięciu aplikacji.
  • Umożliwiać wybór poziomu trudności. Użytkownik sam dopasowuje grę do swoich umiejętności.
Dobra aplikacja zaczyna się od jasnej specyfikacji - co, dla kogo i po co.
Cel programu: Trener tabliczki mnożenia Główny cel aplikacji: Edukacyjna gra mobilna pomagająca uczniom w opanowaniu tabliczki mnożenia. Automatyczny pomiar czasu, ocena poprawności i zapis najlepszych osiągnięć. 1. Losowość Każda sesja składa się z 10 losowo wybranych zadań 🎲 2. Stopniowanie 3 poziomy trudności: Łatwy (1–5) Średni (1–10), Trudny 📈 3. Motywacja Zegar sesji, punkty i tabela rekordów w pamięci stałej 🏆 Aplikacja: Trener matematyczny (App Inventor 2) Slajd 4/55
Slajd 5/55
Specyfikacja - wymagania funkcjonalne

Lista funkcji do wykonania

  • F1: wybór poziomu (łatwy 1-5, średni 1-10, trudny 1-20). Parametrem trudności jest górna granica losowanych liczb.
  • F2: losowanie pary liczb i pytania. Losujemy dwa czynniki i budujemy z nich działanie mnożenia.
  • F3: wprowadzenie i sprawdzenie odpowiedzi. Program porównuje wpisaną wartość z poprawnym iloczynem.
  • F4: punktacja oraz licznik pytań. Te liczby pokazują, ile zadań rozwiązano poprawnie.
  • F5: licznik czasu od startu sesji. Mierzy czas od pierwszego pytania do końca treningu.
  • F6: zapis i prezentacja najlepszych wyników. Rekordy przechowywane są w trwałej bazie danych.
  • F7: powrót do menu i restart. Użytkownik może zakończyć sesję i zacząć trening od nowa.
Wymagania funkcjonalne (Lista F1 - F5) F1 Wybór poziomu trudności (zakres czynników: 5, 10 lub 20) F2 Losowanie pary liczb i prezentacja działania: a × b = ? F3 Wprowadzanie odpowiedzi liczbowej z walidacją pola tekstowego F4 Weryfikacja wyniku, punktacja i natychmiastowy komunikat zwrotny F5 Koniec serii po 10 pytaniach, zapis do bazy TinyDB i podsumowanie Aplikacja: Trener matematyczny (App Inventor 2) Slajd 5/55
Slajd 6/55
Specyfikacja - wymagania pozafunkcjonalne

Jakość i ograniczenia

  • Interfejs czytelny, duże przyciski i czcionki. Układ dostosowany do obsługi na dotykowym ekranie telefonu.
  • Aplikacja działa bez internetu. Wszystkie dane są przechowywane lokalnie na urządzeniu.
  • Czas reakcji natychmiastowy. Unikanie zbędnych obliczeń gwarantuje płynne działanie.
  • Odporność na puste lub błędne dane wejściowe. Walidacja chroni przed nieprawidłowymi statystykami.
  • Rozmiar pliku .aia poniżej limitu 30 MB (tyle przyjmuje MIT App Inventor). Limit dotyczy pliku źródłowego projektu.
Przykład myślenia projektowego: aplikacja ma być używana przez uczniów na telefonach - priorytet to prostota i czytelność.
Wymagania pozafunkcjonalne jakości i ergonomii 1. Praca offline Aplikacja działa w 100% lokalnie, bez wymogu łączności z internetem. Baza TinyDB na pamięci flash. 2. Czas reakcji Natychmiastowa reakcja interfejsu na dotknięcie przycisków (<50ms). Brak zbędnych opóźnień. 3. Ergonomia dotykowa Duże przyciski dotykowe (>48px) i czytelna czcionka nagłówków. Wygodna obsługa jedną ręką. 4. Odporność na błędy Klawiatura numeryczna, brak awarii przy pustym polu, czytelne monity ostrzegawcze. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 6/55
Slajd 7/55
Projekt ekranów

Struktura aplikacji

  • Screen1 - Menu: tytuł i przyciski: Start, Wyniki, Ustawienia. Ekran główny kieruje użytkownika do pozostałych części.
  • Screen2 - Trening: pytanie, pole odpowiedzi, sprawdź, następne, punkty, czas. Tu dzieje się główna mechanika gry.
  • Screen3 - Wyniki: najlepsze wyniki, powrót. Czyta rekordy zapisane w bazie danych.
  • Screen4 - Ustawienia: wybór poziomu, reset wyników. Konfiguracja gry i zarządzanie rekordami.
  • Każdy ekran ma własny zestaw komponentów i bloków. Zmienne globalne nie są współdzielone między ekranami.
Podział na ekrany porządkuje aplikację i ułatwia jej rozwijanie.
Architektura aplikacji: 4 ekrany składowe Screen1: Menu Start gry Wyniki Ustawienia Punkt wejścia do aplikacji Screen2: Trening Pytanie a × b Pole txt Sprawdź Zegar sesji Główna rozgrywka Screen3: Wyniki Rekord pkt Najlepszy czas Ostatnia sesja Wróć Odczyt z TinyDB Screen4: Opcje ListPicker Zakres 5/10/20 Reset rekordów Wróć Konfiguracja Aplikacja: Trener matematyczny (App Inventor 2) Slajd 7/55
Slajd 8/55
Przepływ między ekranami

Nawigacja aplikacji

  • Menu -> Trening: metoda open another screen ("Screen2"). Metoda otwiera ekran po jego dokładnej nazwie.
  • Trening -> Menu: metoda close screen. Zamyka bieżący ekran i wraca do poprzedniego.
  • Menu -> Wyniki: open another screen ("Screen3"). Przejście na ekran z rekordami.
  • Menu -> Ustawienia: open another screen ("Screen4"). Przejście na ekran konfiguracji.
  • Ekrany pomocnicze wracają do Menu przez close screen. To prosty model nawigacji bez zagubionych ekranów.
Diagram nawigacji i przepływu między ekranami Screen1 (Menu) Screen2 (Trening) Screen3 (Wyniki) Screen4 (Opcje) Ekrany podrzędne wracają do Screen1 przez instrukcję: close screen Aplikacja: Trener matematyczny (App Inventor 2) Slajd 8/55
Slajd 9/55
Przekazywanie danych między ekranami

Jak ekrany wymieniają informacje

  • Dane przekazujemy przez metodę open another screen with start value. Metoda wysyła pojedynczą wartość jako argument.
  • Ekran odbiera wartość zdarzeniem when ... .Initialize. Wartość jest dostępna od razu po starcie nowego ekranu.
  • Zmienne globalne nie są wspólne dla różnych ekranów. Każdy ekran ma własną, niezależną pamięć.
  • Dlatego poziom i wyniki przekazujemy jawnie lub przez TinyDB. Wybór metody zależy od liczby i trwałości danych.
  • TinyDB jest wspólne dla całej aplikacji - najprostszy sposób wymiany. Zapisywane wartości są dostępne i trwałe.
W AI2 każdy ekran ma własne zmienne - dane trwałe trzymamy w TinyDB, aby były dostępne wszędzie.
Przekazywanie danych między ekranami w AI2 Metoda 1: Przekazanie wartości początkowej (Start Value) open another screen with start value ("Screen2", get zakres) when Screen2.Initialize do: set global zakres to get start value Metoda 2: Wspólna pamięć trwała (TinyDB - Rekomendowana) Screen4: call TinyDB1.StoreValue ("zakres", 10) Screen2: call TinyDB1.GetValue ("zakres", default 10) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 9/55
Slajd 10/55
Model danych aplikacji

Jakie dane przechowujemy

  • poziom - aktualny zakres liczb (5, 10 lub 20). Określa górną granicę losowanych czynników mnożenia.
  • a, b - wylosowane liczby. Czynniki mnożenia wybrane z bieżącego zakresu.
  • iloczyn - poprawna odpowiedź. Wynik mnożenia porównywany z odpowiedzią ucznia.
  • punkty, liczbaPytan - postęp sesji. Podstawa punktacji i licznika pytań.
  • czasSesji - czas od startu. Liczony w sekundach i pokazywany w podsumowaniu.
  • najlepszyWynik - rekord zapisany w TinyDB. Porównywany z każdym nowym wynikiem.
Model danych: Zmienne sesji i baza TinyDB Pamięć RAM sesji (Zmienne): zakres Górna granica liczb (5, 10, 20) a, b Wylosowane czynniki mnożenia iloczyn Wartość poprawna (a * b) punkty, nrPytania Bieżący wynik i licznik (1..10) sekundy, dziala Stan stopera sesji Pamięć trwała TinyDB (Flash): Tag: "rekord" Wartość: najwyższy wynik (np. 10) Tag: "najlepszyCzas" Wartość: najkrótszy czas (sekundy) Tag: "poziom" Wartość: wybrany zakres (10) Dane zostają po wyłączeniu app! Aplikacja: Trener matematyczny (App Inventor 2) Slajd 10/55
Slajd 11/55
Projekt wizualny - zasady

Spójność i ergonomia

  • Ten sam układ na wszystkich ekranach (nagłówek, treść, przyciski). Spójna struktura ułatwia odnalezienie się w aplikacji.
  • Spójna kolorystyka i czcionki. Jednolite kolory tworzą przyjazny i profesjonalny wizerunek.
  • Duże przyciski ułatwiające obsługę palcem. Odpowiednia wielkość celu zmniejsza pomyłki dotykowe.
  • Wyraźne etykiety i komunikaty zwrotne. Użytkownik zawsze wie, co dzieje się w aplikacji.
  • Minimum elementów na ekranie - prostota. Mniejsza liczba elementów oznacza mniej rozpraszania uwagi.
Dobry interfejs to taki, którego użytkownik nie musi się uczyć - wszystko jest oczywiste.
Zasady ergonomii i spójnego interfejsu UI 1. Spójna siatka Nagłówek góra Stałe miejsce tytułu Sekcja główna Wyśrodkowane dane Belka dolna Przyciski akcji 2. Paleta barw Główny (Primary) Sukces / Sprawdź Błąd / Reset Neutralny 3. Czytelność fontu 24 pt Zadanie a × b 16 pt Przyciski akcji 14 pt Wyniki i komunikaty Kontrast spełnia WCAG AA Aplikacja: Trener matematyczny (App Inventor 2) Slajd 11/55
Slajd 12/55
Ekran Menu - projekt interfejsu

Screen1 - Menu główne

  • lblTytul: "Trener matematyczny", duża czcionka. Pełni rolę nagłówka ekranu menu.
  • btnStart: "Rozpocznij trening". Startuje sesję i przechodzi na ekran treningu.
  • btnWyniki: "Najlepsze wyniki". Otwiera ekran z zapisanymi rekordami.
  • btnUstawienia: "Ustawienia". Prowadzi do konfiguracji poziomu i danych.
  • lblInfo: aktualny poziom trudności. Etykieta potwierdza wybór zapisany wcześniej w TinyDB.
  • Układ: VerticalArrangement wyśrodkowany. Ułożenie pionowe dobrze sprawdza się na ekranach telefonów.
Screen1: Interfejs Menu głównego Trener matematyczny Menu Główne Rozpocznij trening Najlepsze wyniki Ustawienia Komponenty w Designerze: lblTytul Label z dużym napisem i pogrubieniem btnStart Button przechodzący do Screen2 btnWyniki Button przechodzący do Screen3 btnUstawienia Button otwierający opcje Screen4 Aplikacja: Trener matematyczny (App Inventor 2) Slajd 12/55
Slajd 13/55
Menu - logika przycisków

Obsługa zdarzeń w Menu

  • when btnStart.Click -> open another screen "Screen2". Każdy przycisk otwiera swój ekran docelowy.
  • when btnWyniki.Click -> open another screen "Screen3". Przejście na ekran z wynikami.
  • when btnUstawienia.Click -> open another screen "Screen4". Przejście na ekran ustawień.
  • when Screen1.Initialize - ustawia etykietę poziomu z TinyDB. Odświeżanie informacji o poziomie przy starcie.
  • Proste, jednokierunkowe przejścia - bez logiki biznesowej. Menu tylko nawiguje, nie przeprowadza obliczeń.
Wzorzec: ekran menu jest sterownicą całej aplikacji - tylko nawiguje.
Screen1: Logika blokowa otwierania ekranów when btnStart .Click open another screen ("Screen2") when btnWyniki .Click open another screen ("Screen3") when btnUstawienia .Click open another screen ("Screen4") Aplikacja: Trener matematyczny (App Inventor 2) Slajd 13/55
Slajd 14/55
Ekran Ustawienia - wybór poziomu

Screen4 - Ustawienia

  • lstPoziom z opcjami: Łatwy (1-5), Średni (1-10), Trudny (1-20). ListPicker prezentuje poziomy do wyboru.
  • Po wyborze zapisujemy zakres do zmiennej i TinyDB. Ustawienie staje się trwałe dla całej aplikacji.
  • btnReset - kasuje najlepsze wyniki. Wymaga potwierdzenia, bo operacja jest nieodwracalna.
  • btnPowrot - close screen. Realizuje powrót do menu głównego.
  • Etykieta potwierdzająca aktualny wybór. Daje natychmiastową informację zwrotną o zapisanym poziomie.
Poziom zapisany w TinyDB jest dostępny na ekranie Treningu mimo różnych zmiennych ekranów.
Screen4: Interfejs wyboru poziomu (ListPicker) Screen4: Ustawienia Wybierz poziom ▾ Aktualny: Średni (1-10) Resetuj rekordy Powrót do Menu Właściwości ListPicker: ElementsFromString: Łatwy (1-5), Średni (1-10), Trudny (1-20) Zasada działania: Kliknięcie otwiera pełnoekranowe okno z opcjami wyboru. Po wyborze (AfterPicking): Zdarzenie aktualizuje zmienną i zapisuje wartość zakresu w bazie TinyDB. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 14/55
Slajd 15/55
Ustawienia - zapis poziomu

Logika wyboru poziomu

  • when lstPoziom.AfterPicking. Zdarzenie uruchamiane po wybraniu pozycji z listy.
  • Zmienna wybor = get Selection. Selection przechowuje tekst wybranej pozycji.
  • Warunkami ustawiamy zakres: if wybor = "Łatwy" then zakres = 5 itd. Nazwa poziomu zamieniana jest na liczbę zakresu.
  • Zapisujemy zakres: call TinyDB1.StoreValue("zakres", zakres). Dzięki temu inne ekrany odczytają ten sam poziom.
  • Aktualizujemy etykietę potwierdzenia. Użytkownik widzi, jakie ustawienie zostało zapisane.
Screen4: Obsługa wyboru poziomu i zapis w TinyDB when lstPoziom .AfterPicking if Selection = "Łatwy (1-5)" then set global zakres = 5 else if Selection = "Średni (1-10)" then set global zakres = 10 else if Selection = "Trudny (1-20)" then set global zakres = 20 call TinyDB1 .StoreValue ("zakres", get global zakres) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 15/55
Slajd 16/55
Ustawienia - reset wyników

Kasowanie rekordów

  • when btnReset.Click. Zdarzenie przycisku kasującego wyniki.
  • Pytamy o potwierdzenie: call Notifier1.ShowMessageDialog. Dialog chroni przed przypadkowym usunięciem danych.
  • Po potwierdzeniu: call TinyDB1.ClearAll lub StoreValue z pustą wartością. ClearAll usuwa wszystko, nadpisanie obejmuje wybrane klucze.
  • Informujemy o wykonaniu operacji. Krótki komunikat potwierdza zakończenie akcji.
  • Wracamy do menu. Zamykamy ekran ustawień.
Operacje nieodwracalne zawsze potwierdzamy dialogiem - to zasada dobrego projektowania.
Screen4: Bezpieczny reset danych z Notifier Krok 1: Żądanie resetu i dialog potwierdzenia when btnReset.Click -> call Notifier1.ShowChooseDialog ("Czy wyczyścić rekordy?", "Tak", "Nie") when Notifier1 .AfterChoosing (choice) if get choice = "Tak" then call TinyDB1 .StoreValue ("rekord", 0) call TinyDB1 .StoreValue ("najlepszyCzas", 9999) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 16/55
Slajd 17/55
Ekran Trening - projekt interfejsu

Screen2 - Trening

  • lblPytanie: np. "7 x 8 = ?". Główny element ekranu, napisany dużą czytelną czcionką.
  • txtOdpowiedz: NumbersOnly = true. Pole przyjmuje wyłącznie cyfry.
  • btnSprawdz: "Sprawdź". Ocenia wpisaną odpowiedź.
  • btnNastepne: "Następne pytanie". Przechodzi do nowego zadania.
  • lblPunkty: "Punkty: 3 / 5". Pokazuje aktualny postęp punktacji.
  • lblCzas: "Czas: 00:12". Aktualizowany co sekundę przez zegar.
  • Clock1 - odświeżanie czasu. Zegar generuje cykl zdarzeń co 1000 ms.
Screen2: Interfejs ekranu Trening Pytanie 1/10 | ⏱ 00:15 7 × 8 = ? Wpisz liczbę... Sprawdź Dobrze! +1 pkt Następne zadanie ➔ Układ Designer: lblPytanie Czcionka 28pt, centralnie txtOdpowiedz NumbersOnly = true btnSprawdz Przycisk akcji weryfikacji lblKomunikat Informacja zwrotna (kolorowa) btnNastepne Przejście do kolejnego pytania Aplikacja: Trener matematyczny (App Inventor 2) Slajd 17/55
Slajd 18/55
Trening - inicjalizacja sesji

Start sesji na ekranie Trening

  • when Screen2.Initialize. Zdarzenie startowe ekranu treningu.
  • Odczytujemy zakres z TinyDB: call TinyDB1.GetValue("zakres", 10). Domyślna wartość 10 zabezpiecza pierwsze uruchomienie.
  • Zerujemy: punkty = 0, liczbaPytan = 0, sekundy = 0. Każda sesja zaczyna się od czystego stanu.
  • Ustawiamy Clock1.TimerInterval = 1000. Interwał jednej sekundy umożliwia liczenie czasu.
  • Wywołujemy procedurę nowePytanie. Na ekranie natychmiast pojawia się pierwsze zadanie.
Wzorzec: zdarzenie Initialize to miejsce na przygotowanie stanu ekranu.
Screen2: Inicjalizacja sesji i start zegara when Screen2 .Initialize set global zakres = call TinyDB1.GetValue ("zakres", default 10) set global punkty = 0; set global nrPytania = 0; set global sekundy = 0 set Clock1 .TimerEnabled = true call nowePytanie call aktualizujWynik Aplikacja: Trener matematyczny (App Inventor 2) Slajd 18/55
Slajd 19/55
Trening - procedura nowePytanie

Wspólna procedura losowania

  • Definiujemy procedurę to nowePytanie. Procedura wywoływana bez argumentów.
  • W środku: a = random 1..zakres, b = random 1..zakres. Każda liczba losowana jest niezależnie.
  • iloczyn = a * b. Zapamiętujemy poprawny wynik do późniejszego porównania.
  • Budujemy pytanie blokiem join i ustawiamy lblPytanie. Łączymy tekst i liczby w jedno pytanie.
  • Czyścimy pole odpowiedzi i ustawiamy fokus. Nowe pytanie zaczyna się od pustego pola.
Wydzielenie losowania do procedury pozwala wywołać je jednym blokiem w wielu miejscach.
Procedura: to nowePytanie (Losowanie czynników) to nowePytanie set global nrPytania = get global nrPytania + 1 set global a = random integer from 1 to get global zakres set global b = random integer from 1 to get global zakres set global iloczyn = get global a * get global b set lblPytanie.Text = join(get a, " × ", get b, " = ?") set txtOdpowiedz.Text = ""; set lblKomunikat.Text = "" Aplikacja: Trener matematyczny (App Inventor 2) Slajd 19/55
Slajd 20/55
Trening - sprawdzanie odpowiedzi

Obsługa przycisku Sprawdź

  • when btnSprawdz.Click. Zdarzenie przycisku oceny odpowiedzi.
  • Odpowiedź = get txtOdpowiedz.Text (zamiana na liczbę). Tekst zamieniamy na liczbę przed porównaniem.
  • Warunek: if odpowiedz = iloczyn. Porównanie wpisanej wartości z poprawnym wynikiem.
  • Poprawnie: punkty + 1, komunikat "Dobrze!", zmiana koloru etykiety na zielony. Zielony kolor i pochwała za właściwy wynik.
  • Błędnie: komunikat "Źle. Poprawnie: iloczyn", kolor czerwony. Podanie prawidłowego wyniku wspiera naukę.
  • Zwiększamy liczbaPytan i aktualizujemy etykietę punktów. Statystyki pozostają spójne z przebiegiem gry.
Sprawdzanie wyniku: Obsługa btnSprawdz when btnSprawdz .Click if txtOdpowiedz.Text = get global iloczyn then set global punkty = get global punkty + 1 set lblKomunikat.TextColor = GREEN; set lblKomunikat.Text = "Brawo! Dobrze!" else set lblKomunikat.TextColor = RED; set lblKomunikat.Text = join("Źle! Poprawny: ", iloczyn) call aktualizujWynik; set btnSprawdz.Enabled = false; set btnNastepne.Enabled = true Aplikacja: Trener matematyczny (App Inventor 2) Slajd 20/55
Slajd 21/55
Trening - walidacja odpowiedzi

Zabezpieczenie przed błędami

  • Sprawdzamy, czy pole nie jest puste. Pusty wpis nie może być oceniany.
  • if txtOdpowiedz.Text = "" then pokaż komunikat i przerwij. Blok wyświetla prośbę o wpisanie odpowiedzi.
  • Sprawdzamy, czy tekst jest liczbą (NumbersOnly pomaga, ale nie chroni całkowicie). Ograniczenie znaków zmniejsza ryzyko błędów.
  • Dopiero potem porównujemy z iloczynem. Kolejność warunków ma znaczenie dla poprawności.
  • Dzięki temu aplikacja nie zlicza pustych odpowiedzi. Licznik pytań odzwierciedla realnie podjęte próby.
Walidacja danych wejściowych: Puste pole Zabezpieczenie przed błędem pustego wpisu: if is empty (txtOdpowiedz.Text) then call Notifier1.ShowAlert ("Proszę wpisać liczbę!") exit (przerwij procedurę bez oceny) Dlaczego walidacja jest kluczowa? • Zapobiega błędom rzutowania typu string na number w działaniach AI2. • Poprawia doświadczenie użytkownika (jasna wskazówka zamiast awarii). Aplikacja: Trener matematyczny (App Inventor 2) Slajd 21/55
Slajd 22/55
Trening - przycisk Następne

Przejście do kolejnego pytania

  • when btnNastepne.Click. Zdarzenie przycisku kolejnego pytania.
  • Wywołanie procedury nowePytanie. Przygotowuje nowe, losowane zadanie.
  • Wyczyszczenie komunikatu zwrotnego. Stary komunikat nie pojawia się przy nowym pytaniu.
  • Przywrócenie domyślnego koloru etykiety. Etykieta wraca do neutralnego wyglądu.
  • Można ograniczyć liczbę pytań - po 10 kończymy sesję. Granica dziesięciu pytań wyznacza koniec treningu.
Rozdzielenie "Sprawdź" i "Następne" daje użytkownikowi czas na przemyślenie odpowiedzi.
Sterowanie pytaniami: Obsługa btnNastepne when btnNastepne .Click if get global nrPytania < 10 then call nowePytanie set btnSprawdz.Enabled = true; set btnNastepne.Enabled = false else (ukończono 10 pytań) call zakonczSesje (zatrzymaj zegar i zapisz rekordy) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 22/55
Slajd 23/55
Trening - licznik czasu

Pomiar czasu sesji

  • when Clock1.Timer (co 1000 ms). Zdarzenie zegara odliczającego czas.
  • if dziala then sekundy = sekundy + 1. Flaga logiczna kontroluje, czy licznik działa.
  • Formatujemy czas do postaci MM:SS. Minuty i sekundy zapisujemy z zerem wiodącym.
  • Aktualizujemy lblCzas. Etykieta pokazuje bieżący czas sesji.
  • Po zakończeniu sesji ustawiamy dziala = false i zapisujemy wynik. Zatrzymany czas trafia do rekordu.
Obsługa zegara Clock1: Pomiar czasu sesji when Clock1 .Timer if get global dziala = true then set global sekundy = get global sekundy + 1 set lblCzas.Text = call formatujCzas (get global sekundy) Parametry komponentu Clock: • TimerInterval: 1000 (wyzwalanie dokładnie co 1 sekundę) • TimerEnabled: aktywowane dopiero po rozpoczęciu treningu Aplikacja: Trener matematyczny (App Inventor 2) Slajd 23/55
Slajd 24/55
Ekran Wyniki - projekt

Screen3 - Najlepsze wyniki

  • lblTytul: "Najlepsze wyniki". Nagłówek ekranu wyników.
  • lblRekord: najwyższy wynik punktowy. Odczytuje wartość klucza "rekord" z TinyDB.
  • lblNajlepszyCzas: najkrótszy czas sesji. Krótszy czas oznacza lepszy wynik.
  • lblStatystyki: liczba rozegranych sesji. Wartość klucza "sesje" pobierana z bazy danych.
  • btnPowrot: close screen. Powrót do menu głównego.
Ekran wyników czyta dane wyłącznie z TinyDB - nie prowadzi własnych obliczeń.
Screen3: Projekt interfejsu Najlepsze wyniki Najlepsze wyniki 🏆 Rekord punktów: 10 / 10 pkt Najlepszy czas: ⏱ 00:42 Ostatnia sesja: 8 pkt (01:15) Wróć do Menu Komponenty ekranu: lblRekordPkt Odczytuje tag "rekord" z TinyDB lblRekordCzas Odczytuje "najlepszyCzas" lblOstatniaSesja Wynik ostatniej rozgrywki btnWrocMenu Zamyka ekran: close screen Aplikacja: Trener matematyczny (App Inventor 2) Slajd 24/55
Slajd 25/55
Wyniki - odczyt z TinyDB

Wczytanie rekordów

  • when Screen3.Initialize. Odczyt danych następuje przy wejściu na ekran.
  • rekord = call TinyDB1.GetValue("rekord", 0). Wartość domyślna 0 obowiązuje, gdy klucza jeszcze nie ma.
  • najlepszyCzas = call TinyDB1.GetValue("najlepszyCzas", 0). Domyślne zero dla braku zapisanego czasu.
  • sesje = call TinyDB1.GetValue("sesje", 0). Domyślne zero dla liczby rozegranych sesji.
  • Ustawiamy etykiety tymi wartościami. Odczytane dane trafiają do etykiet ekranu.
Domyślne wartości: drugi argument GetValue to wartość zwracana, gdy klucza jeszcze nie ma.
Screen3: Odczyt danych z bazy TinyDB when Screen3 .Initialize set global rPkt = call TinyDB1.GetValue ("rekord", default 0) set global rCzas = call TinyDB1.GetValue ("najlepszyCzas", default 0) set lblRekordPkt.Text = join ("Rekord: ", get rPkt, " / 10 pkt") set lblRekordCzas.Text = join ("Czas: ", call formatujCzas (get rCzas)) • Wartość domyślna (0) chroni przed błędem, gdy baza jest pusta. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 25/55
Slajd 26/55
Wyniki - formatowanie prezentacji

Czytelne pokazanie danych

  • Budujemy napisy blokiem join: "Rekord: " + rekord + " pkt". Składamy opis i liczbę w jeden tekst.
  • Dla czasu: "Najlepszy czas: " + MM + ":" + SS. Czas wyświetlany w formacie minut i sekund.
  • Dla sesji: "Rozegrane sesje: " + sesje. Pokazuje liczbę ukończonych treningów.
  • Gdy brak danych, pokazujemy "Brak wyników". Przejrzysty komunikat dla nowego użytkownika.
  • Warunek sprawdza, czy rekord = 0. Zero oznacza brak zapisanych osiągnięć.
Łączenie napisów: Blok join i prezentacja Budowanie czytelnego komunikatu użytkownika: set lblWynik.Text = join ("Zdobyłeś ", get punkty, " / 10 pkt") set lblCzas.Text = join ("Czas sesji: ", get min, ":", get sek) Zasada działania mutatora join: • Pozwala dołączać dowolną liczbę gniazd (teksty, liczby, zmienne). • AI2 dokonuje niejawnej konwersji typów liczbowych na napisy. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 26/55
Slajd 27/55
Zakończenie sesji treningu

Co dzieje się po 10 pytaniach

  • Warunek: if liczbaPytan = 10 then zakończ sesję. Dziesięć pytań wyznacza koniec treningu.
  • Zatrzymujemy zegar (dziala = false). Czas przestaje się zmieniać.
  • Aktualizujemy rekord, jeśli wynik lepszy. Nowy rekord zapisujemy tylko, gdy jest wyższy.
  • Zapisujemy czas, jeśli krótszy. Porównanie z trwale zapisanym najlepszym czasem.
  • Zwiększamy licznik sesji. Każde ukończenie treningu jest zliczane.
  • Pokazujemy podsumowanie i wracamy do menu. Użytkownik widzi wynik i może rozpocząć od nowa.
Zakończenie sesji to moment zapisu wszystkich danych trwałych.
Zakończenie serii: Warunek 10 pytań Procedura: to zakonczSesje 1. set Clock1 .TimerEnabled = false (zatrzymaj pomiar czasu) 2. call zapiszWynik (porównaj z rekordem i zapisz w TinyDB) 3. call pokazPodsumowanie (wyświetl okno końcowe) 4. zablokuj przyciski odpowiadania (btnSprawdz = false) Pętla 10 pytań dobiega końca – następuje utrwalenie stanu gry. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 27/55
Slajd 28/55
Trening - podsumowanie sesji

Ekran lub komunikat końcowy

  • Wynik: "Zdobyłeś 7 / 10 punktów". Podsumowanie zliczonych poprawnych odpowiedzi.
  • Czas: "Twój czas: 01:23". Czas trwania całej sesji treningowej.
  • Ocena słowna zależna od wyniku. Na przykład od "dobry początek" po "znakomicie".
  • Informacja, czy padł nowy rekord. Wiadomość o rekordzie wzmacnia motywację.
  • Przyciski: "Jeszcze raz" i "Menu". Pozwalają powtórzyć trening lub wrócić do menu.
Komunikat końcowy: Dialog z podsumowaniem Koniec treningu! 🎉 Twój wynik: 9 / 10 Czas: 01:14 min Świetna robota! Nowy rekord! Zagraj ponownie Wróć do Menu Składowe podsumowania: • Liczba punktów (0–10) • Czas całej sesji (MM:SS) • Ocena jakościowa: >8: Mistrz! 5-8: Dobry wynik <5: Ćwicz dalej • Opcje dalszej akcji Aplikacja: Trener matematyczny (App Inventor 2) Slajd 28/55
Slajd 29/55
Poziomy trudności - koncepcja

Trzy poziomy, jedna logika

  • Łatwy: liczby 1-5, 10 pytań. Poziom dla osób zaczynających naukę.
  • Średni: liczby 1-10, 10 pytań. Podstawowy poziom treningu.
  • Trudny: liczby 1-20, 10 pytań. Wyzwanie dla zaawansowanych uczniów.
  • Różnica sprowadza się do wartości zmiennej zakres. Jedna zmienna kontroluje całą trudność gry.
  • Ta sama procedura nowePytanie działa dla wszystkich poziomów. Logika nie zawiera powielonego kodu.
Parametryzacja logiki to klucz do unikania powielania kodu.
Stopniowanie trudności: Trzy poziomy, jedna logika Poziom 1: Łatwy Zakres liczb: 1–5 • Czynniki a, b ≤ 5 • Max wynik: 25 • Dedykowany dla klas 1–2 zakres = 5 Poziom 2: Średni Zakres liczb: 1–10 • Standardowa tabliczka • Max wynik: 100 • Podstawowy trening zakres = 10 Poziom 3: Trudny Zakres liczb: 1–20 • Działania poza tabliczkę • Max wynik: 400 • Wyzwanie mistrzowskie zakres = 20 Aplikacja: Trener matematyczny (App Inventor 2) Slajd 29/55
Slajd 30/55
Ekran Wyników - rozbudowa

Statystyki szczegółowe

  • Liczba poprawnych i błędnych odpowiedzi. Szczegółowa statystyka przebiegu sesji.
  • Średni czas na pytanie. Obliczany jako całkowity czas podzielony przez liczbę pytań.
  • Najtrudniejsze pytanie (najczęściej błędne). Wskaźnik wymaga zapisywania historii odpowiedzi.
  • Wykres słupkowy z Canvas (opcjonalnie). Rysowanie na płótnie omówimy w prezentacji 5.
  • Ranking sesji w formie listy. Lista ostatnich wyników zamiast pojedynczego rekordu.
Rozbudowa statystyk: Szczegóły sesji Zaawansowane wskaźniki efektywności nauki: Skuteczność procentowa: 90% (9 poprawnych / 1 błąd) Średni czas na zadanie: 7.4 s (całkowity czas / 10) Jak to zrealizować w AI2? • Dzielenie matematyczne: round ( get sekundy / 10 ) • Zapis listy pomyłek: lista do powtórki na koniec sesji Aplikacja: Trener matematyczny (App Inventor 2) Slajd 30/55
Slajd 31/55
Przygotowanie projektu do pracy

Kolejność wykonywania kroków

  1. Tworzymy nowy projekt o nazwie TrenerMatematyczny. Nazwa bez polskich znaków i spacji.
  2. Dodajemy ekrany: Screen2, Screen3, Screen4. Ekrany dodaje się za pomocą przycisku Add Screen.
  3. Budujemy interfejs każdego ekranu w Designerze. Praca zaczyna się od widoku, nie od bloków.
  4. Nadajemy opisowe nazwy komponentom. Nazwy zgodne z konwencją btn, lbl, txt.
  5. Dopiero potem programujemy bloki - ekran po ekranie. Taki porządek zapobiega chaosowi bloków.
Najpierw cały interfejs, potem logika - to naturalna kolejność pracy w AI2.
Przygotowanie projektu: Kolejność kroków 1 Nowy projekt Start New Project: TrenerMatematyczny (bez spacji i polskich liter) 2 Dodanie kolejnych ekranów Przycisk Add Screen: Screen2 (Trening), Screen3 (Wyniki), Screen4 (Opcje) 3 Komponenty niewidoczne Dodanie TinyDB1, Clock1 oraz Notifier1 na odpowiednich ekranach 4 Implementacja blokowa Stopniowe programowanie zdarzeń przycisków i wspólnych procedur Aplikacja: Trener matematyczny (App Inventor 2) Slajd 31/55
Slajd 32/55
Nazewnictwo komponentów

Konwencja nazw

  • Stosujemy prefiksy: btn, lbl, txt, lst, tts, clock, db. Prefiks od razu informuje o typie komponentu.
  • Przykłady: btnStart, lblPytanie, txtOdpowiedz, lstPoziom, clockSesja, dbWyniki. Spójne nazwy ułatwiają znajdowanie bloków.
  • Nazwy bez polskich znaków i spacji. Takie nazwy nie sprawiają problemów w narzędziach projektu.
  • Nazwy opisowe, ale niezbyt długie. Krótka nazwa pozostaje czytelna w oknie bloków.
  • Ta sama konwencja we wszystkich ekranach. Jednolity styl obowiązuje w całym projekcie.
Zaleta: w oknie Blocks łatwo znaleźć właściwy komponent i uniknąć pomyłek.
Konwencja nazewnictwa komponentów w projekcie Zasada prefiksów technicznych (Hungarian notation): btn... Button (np. btnStart, btnSprawdz, btnWroc) lbl... Label (np. lblPytanie, lblPunkty, lblCzas) txt... TextBox (np. txtOdpowiedz) lst... ListPicker (np. lstPoziom) db..., clk... TinyDB1, ClockSesja, NotifierAlert Aplikacja: Trener matematyczny (App Inventor 2) Slajd 32/55
Slajd 33/55
Zmienne globalne programu

Wspólny stan na ekranie Trening

  • zakres - górna granica liczb (5, 10, 20). Decyduje o trudności losowanych pytań.
  • a, b - składniki mnożenia. Losowane czynniki bieżącego pytania.
  • iloczyn - poprawna odpowiedź. Przechowywany do porównania z odpowiedzią ucznia.
  • punkty, liczbaPytan - postęp. Określają stan punktacji i licznika pytań.
  • sekundy - czas sesji. Licznik czasu wykorzystywany przez zegar.
  • dziala - flaga logiczna zegara. Określa, czy czas jest w danej chwili liczony.
Wszystkie te zmienne tworzymy na ekranie Trening, bo tam są używane.
Stan sesji: Inwentarz zmiennych globalnych Konfiguracja i czynniki: global zakres = 10 Maksymalna losowana liczba global a = 0, b = 0 Czynniki mnożenia a × b Odpowiedź i punktacja: global iloczyn = 0 Prawidłowy wynik mnożenia global punkty = 0 Suma trafień (0–10) Przebieg sesji: global nrPytania = 0 Licznik rozwiązanych zadań global sekundy = 0 Całkowity czas rozgrywki Stan gry: global dziala = false Flaga aktywności stopera global staryRekord = 0 Poprzedni najlepszy wynik Aplikacja: Trener matematyczny (App Inventor 2) Slajd 33/55
Slajd 34/55
Procedura nowePytanie - szczegóły

Serce logiki treningu

  • set a to random integer from 1 to get zakres. Blok losowy korzysta z zakresu zmiennej.
  • set b to random integer from 1 to get zakres. Dwa niezależne losowania czynników mnożenia.
  • set iloczyn to get a * get b. Iloczyn zostaje zapamiętany w zmiennej.
  • set lblPytanie.Text to join(get a, " x ", get b, " = ?"). Tekst pytania składany z wielu części.
  • set txtOdpowiedz.Text to "" oraz lblInfo.Text to "". Czyszczenie pola odpowiedzi i komunikatu.
Wywołanie: call nowePytanie w Initialize i w przycisku Następne.
Algorytm procedury: to nowePytanie 1 Inkrementacja licznika pytań: set nrPytania to nrPytania + 1 2 Losowanie czynników: a = random(1..zakres), b = random(1..zakres) 3 Obliczenie poprawnej wartości: iloczyn = a × b 4 Aktualizacja widoku pytania: lblPytanie.Text = join(a, " × ", b, " = ?") Reset stanu: wyczyszczenie pola txtOdpowiedz i etykiety lblKomunikat Aplikacja: Trener matematyczny (App Inventor 2) Slajd 34/55
Slajd 35/55
Procedura sprawdzOdpowiedz

Wydzielenie logiki oceny

  • Procedura bez argumentów: to sprawdzOdpowiedz. Wykorzystuje zmienne globalne ekranu.
  • Odczytuje txtOdpowiedz.Text i porównuje z iloczynem. Ocenia wpisaną przez użytkownika wartość.
  • Ustawia komunikat, kolor i punktację. Jedno miejsce odpowiada za całą informację zwrotną.
  • Zwiększa liczbaPytan. Licznik pytań rośnie po każdej ocenie.
  • Wywoływana z przycisku Sprawdź. Pojedyncze wywołanie uruchamia całą logikę oceny.
Dzielenie logiki na procedury sprawia, że program jest krótszy i łatwiejszy do poprawy.
Wydzielona procedura: to sprawdzOdpowiedz to sprawdzOdpowiedz if txtOdpowiedz.Text = get global iloczyn then punkty = punkty + 1; lblKomunikat.Text = "Dobrze! 🎉" else lblKomunikat.Text = join ("Błąd! Prawidłowo: ", iloczyn) call aktualizujWynik btnSprawdz.Enabled = false; btnNastepne.Enabled = true Aplikacja: Trener matematyczny (App Inventor 2) Slajd 35/55
Slajd 36/55
Procedura aktualizujWynik

Wyświetlanie postępu

  • Procedura to aktualizujWynik. Odpowiada za widok postępu sesji.
  • Buduje napis: "Punkty: " + punkty + " / " + liczbaPytan. Skleja opis tekstowy z bieżącymi liczbami.
  • Ustawia lblPunkty.Text na ten napis. Etykieta pokazuje aktualne statystyki.
  • Wywoływana po każdej odpowiedzi. Widok pozostaje zgodny ze stanem gry.
  • Jedno miejsce odpowiedzialne za format postępu. Zmiana formatu dotyczy tylko jednego bloku.
Procedura: to aktualizujWynik (Widok postępu) to aktualizujWynik set lblPunkty.Text = join ("Punkty: ", get punkty, " / ", get nrPytania) set lblPostep.Text = join ("Zadanie ", get nrPytania, " z 10") 7 / 10 ukończone (70%) Procedura dba o synchronizację interfejsu z modelem zmiennych. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 36/55
Slajd 37/55
Procedura formatujCzas

Zamiana sekund na MM:SS

  • Procedura z argumentem: to formatujCzas (sek). Argument przekazuje liczbę sekund.
  • minuty = floor(sek / 60). Dzielenie całkowite daje pełne minuty.
  • reszta = sek modulo 60. Reszta z dzielenia to pozostałe sekundy.
  • Budujemy napis z zerami wiodącymi blokiem join. Zapis czasu ma stałą szerokość.
  • Zwracamy wynik (return) lub ustawiamy etykietę. Procedura może działać jako funkcja zwracająca wartość.
Przykład: 83 sekundy -> "01:23".
Procedura: to formatujCzas (sek) -> MM:SS to formatujCzas (sekundyTotal) min = floor ( sekundyTotal / 60 ) sek = sekundyTotal modulo 60 if min < 10 then minTekst = join ("0", min) else minTekst = min if sek < 10 then sekTekst = join ("0", sek) else sekTekst = sek result: join (minTekst, ":", sekTekst) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 37/55
Slajd 38/55
Procedura zapiszWynik

Zapis rekordu do TinyDB

  • Procedura to zapiszWynik. Zbiera wszystkie operacje zapisu danych trwałych.
  • Odczytuje aktualny rekord z TinyDB. Porównanie z wartością zapisaną wcześniej.
  • if punkty > rekord then zapisz nowy rekord. Nowy wynik nadpisuje stary tylko, gdy jest wyższy.
  • Analogicznie dla najlepszego czasu. Krótszy czas zastępuje dotychczasowy rekord.
  • Zwiększa licznik sesji. Zlicza ukończone treningi.
Wszystkie operacje na danych trwałych w jednym miejscu - łatwiej je kontrolować.
Procedura: to zapiszWynik (Aktualizacja TinyDB) to zapiszWynik staryRekord = call TinyDB1.GetValue ("rekord", default 0) if punkty > staryRekord then call TinyDB1.StoreValue ("rekord", punkty) call TinyDB1.StoreValue ("najlepszyCzas", sekundy) call TinyDB1.StoreValue ("ostatniWynik", punkty) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 38/55
Slajd 39/55
Losowanie - powtórka wzorca

Random integer w praktyce

  • Blok random integer from 1 to zakres. Zwraca losową liczbę całkowitą z podanego zakresu.
  • Zakres pobierany ze zmiennej, nie wpisany na sztywno. Zmiana zmiennej zmienia trudność wszystkich pytań.
  • Dzięki temu poziom trudności działa automatycznie. Jedna procedura obsługuje wszystkie poziomy.
  • Losujemy dwa razy - dla a i dla b. Każdy czynnik mnożenia jest losowany osobno.
  • Warto unikać powtarzania tego samego pytania (opcjonalnie). Można zapamiętać ostatnią parę liczb i porównać z nową.
Wzorzec losowania liczb w App Inventor Blok losowania z palety Math: random integer from [ 1 ] to [ get global zakres ] 1. Zmienna jako granica Górny limit pobierany z pamięci pozwala dynamicznie zmieniać poziom trudności bez zmian w kodzie. 2. Dyskretność liczb Funkcja zwraca liczby całkowite z rozkładem jednostajnym w przedziale domkniętym [1, zakres]. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 39/55
Slajd 40/55
Sprawdzanie - porównanie i konwersja

Tekst czy liczba

  • txtOdpowiedz.Text zwraca tekst. Wartość pola jest zawsze łańcuchem znaków.
  • W działaniach matematycznych AI2 zamienia tekst na liczbę. Konwersja zachodzi automatycznie przy obliczeniach.
  • Bezpieczniej użyć bloku compare texts lub porównać po konwersji. Świadomy wybór sposobu porównania chroni przed błędami.
  • Porównanie: if get txtOdpowiedz.Text = get iloczyn. Porównanie tekstu z liczbą w bloku warunku.
  • Uwaga na spacje i znaki spoza cyfr. Niechciane znaki powodują nieprawidłowe porównanie.
Świadomość typu danych chroni przed trudnymi do wykrycia błędami.
Typy danych w AI2: Tekst a Liczba Tekst (String): txtOdpowiedz.Text = "56" • Wartość z pola jest ciągiem znaków. • Puste pole to pusty napis "". Liczba (Number): global iloczyn = 56 • Wartość arytmetyczna z mnożenia. • Pozwala na operacje relacji (>, <). Automatyczne rzutowanie (Type Coercion): W App Inventor operator równości [ = ] w palecie Math automatycznie konwertuje napis "56" na liczbę 56 przed porównaniem, o ile napis zawiera poprawne cyfry (dzięki NumbersOnly = true). Aplikacja: Trener matematyczny (App Inventor 2) Slajd 40/55
Slajd 41/55
Komunikaty zwrotne dla użytkownika

Informowanie o wyniku

  • Poprawna odpowiedź: zielony kolor i "Dobrze!". Zielony jednoznacznie sygnalizuje sukces.
  • Błędna: czerwony kolor i "Źle. Poprawnie: X". Czerwień i podanie właściwego wyniku.
  • Puste pole: "Wpisz odpowiedź". Komunikat prosi o podanie wartości.
  • Kolor zmieniamy właściwością lblInfo.TextColor. Zmiana właściwości następuje z poziomu bloków.
  • Komunikaty krótkie i zrozumiałe. Krótka forma pozostaje czytelna na telefonie.
Projekt wizualny komunikatów zwrotnych ✓ Odpowiedź poprawna (Success): Napis: "Brawo! Dobra odpowiedź! (+1 pkt)" | Kolor: Zielony (#16a34a) ✕ Odpowiedź błędna (Error): Napis: "Niestety błąd! Prawidłowo: 56" | Kolor: Czerwony (#dc2626) ! Błąd walidacji (Warning): Napis: "Wpisz liczbę przed sprawdzeniem!" | Toast alert z Notifier Aplikacja: Trener matematyczny (App Inventor 2) Slajd 41/55
Slajd 42/55
Pętla w programie - seria pytań

Powtarzanie pytań

  • Seria 10 pytań realizowana jest przez licznik i warunek. Mechanizm zdarzeniowy napędzany kliknięciami.
  • Alternatywnie: pętla for each from 1 to 10 wokół logiki. Pętla wykonuje powtórzenia automatycznie.
  • W wersji zdarzeniowej pytania następują po kliknięciach. To uczeń nadaje tempo sesji.
  • W wersji pętlowej wszystko dzieje się automatycznie. Kolejne zadania pojawiają się bez udziału użytkownika.
  • Wersja zdarzeniowa jest łatwiejsza dla początkujących. Prostsza do zrozumienia i do poprawiania błędów.
Pętla i licznik to dwa sposoby osiągnięcia tego samego celu - wybieramy prostszy dla danego zastosowania.
Pętla pytań w architekturze sterowanej zdarzeniami Model zdarzeniowy (AI2): • Brak blokującej pętli while/for • Pętlę tworzy cykl: Click btnSprawdz ↓ Click btnNastepne • Zmienna nrPytania steruje warunkiem stopu (10 pytań). Zalety podejścia sterowanego: 1. Płynność interfejsu (UI) Aplikacja nie "zamraża się" 2. Tempo użytkownika Uczeń decyduje, kiedy przejść dalej 3. Działający stoper Zegar Clock działa płynnie w tle Aplikacja: Trener matematyczny (App Inventor 2) Slajd 42/55
Slajd 43/55
Lista pytań - wariant rozszerzony

Zadania z gotowej listy

  • Zamiast losować, można trzymać listę pytań. Zadania pochodzą z przygotowanego wcześniej zbioru.
  • Lista pytań i równoległa lista odpowiedzi. Odpowiedź znajduje się pod tym samym indeksem.
  • Indeks przechodzi przez kolejne pozycje. Zmienna indeksu zwiększa się o jeden.
  • Można tasować listę (shuffle) dla losowej kolejności. AI2 nie ma gotowego bloku tasowania - realizujemy je samodzielnie lub rozszerzeniem.
  • Ten wariant przygotowuje grunt pod quiz z prezentacji 3. Analogiczna logika pojawi się przy quizach.
Alternatywa: Pytania z predefiniowanej listy Lista pytań i powiązana lista odpowiedzi: listPytania: ["6 × 7", "9 × 8", "4 × 5", ...] listOdpowiedzi: [42, 72, 20, ...] Pobieranie elementu według indeksu: pytanie = select list item (listPytania, index: nrPytania) poprawna = select list item (listOdpowiedzi, index: nrPytania) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 43/55
Slajd 44/55
TinyDB - struktura danych

Jak przechowujemy wyniki

  • TinyDB działa jak słownik: klucz - wartość. Każdy klucz ma przypisaną jedną wartość.
  • Klucz "rekord" - najwyższa liczba punktów. Przechowuje najlepszy wynik punktowy.
  • Klucz "najlepszyCzas" - najkrótszy czas w sekundach. Zawiera najlepszy czas trwania sesji.
  • Klucz "sesje" - liczba rozegranych sesji. Zlicza ukończone treningi.
  • Klucz "zakres" - wybrany poziom trudności. Ustawienie wspólne dla wszystkich ekranów.
Zapis: call TinyDB1.StoreValue("rekord", 9). Odczyt: call TinyDB1.GetValue("rekord", 0).
Model danych TinyDB: Słownik klucz - wartość Struktura bazy klucz-wartość (Key-Value Store): Tag (Klucz tekstowy) Value (Zapisana wartość) "rekord" 10 (liczba punktów) "najlepszyCzas" 42 (sekundy) "zakres" 10 (poziom średni) "ostatniaSesja" 8 (ostatni wynik) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 44/55
Slajd 45/55
TinyDB - aktualizacja rekordu

Logika "nowy rekord"

  • Odczyt: stary = get TinyDB1.GetValue("rekord", 0). Przed porównaniem pobieramy zapisany rekord.
  • Warunek: if get punkty > get stary. Nowy wynik musi być większy od starego.
  • Zapis: call TinyDB1.StoreValue("rekord", get punkty). Nadpisanie klucza nową wartością.
  • Ustawiamy flagę nowyRekord = true. Flaga informuje pozostałą część programu o rekordzie.
  • Pokazujemy użytkownikowi informację o rekordzie. Komunikat o pobiciu dotychczasowego wyniku.
Rekord porównujemy z wartością z bazy, a nie z bieżącą sesją - to częsty błąd początkujących.
Logika "Nowy Rekord": Decyzja o zapisie w TinyDB Algorytm aktualizacji rekordu sesji: staryRekord = call TinyDB1.GetValue ("rekord", default 0) if (punkty > staryRekord) then call TinyDB1.StoreValue ("rekord", punkty) set flagaNowyRekord = true else if (punkty = staryRekord and sekundy < staryCzas) then call TinyDB1.StoreValue ("najlepszyCzas", sekundy) // Lepszy czas! Aplikacja: Trener matematyczny (App Inventor 2) Slajd 45/55
Slajd 46/55
TinyDB - czyszczenie i kopie

Zarządzanie danymi trwałymi

  • ClearAll kasuje wszystkie dane - używać ostrożnie. Usuwa również ustawienia poziomu.
  • Lepiej usuwać pojedyncze klucze (StoreValue z wartością domyślną). Celowane nadpisanie chroni pozostałe dane.
  • Reset wyników zawsze po potwierdzeniu dialogiem. Dialog zapobiega przypadkowemu usunięciu.
  • Dane trwałe przeżywają zamknięcie i restart aplikacji. Wartości zapisane w pamięci urządzenia.
  • Do kopii służy eksport projektu (.aia). Plik źródłowy można w każdej chwili przywrócić.
Bezpieczne zarządzanie danymi w TinyDB Metoda ClearAll (Ryzykowna): call TinyDB1 .ClearAll • Usuwa wszystkie dane aplikacji. • Kasuje też wybrane ustawienia! ClearTag (Rekomendowana): call TinyDB1 .ClearTag ("rekord") • Usuwa wyłącznie wybrany klucz. • Zachowuje preferencje użytkownika. Najlepsza praktyka resetowania rekordów: Zamiast kasować tag, nadpisz go wartością początkową (domyślną): call TinyDB1.StoreValue ("rekord", 0); StoreValue ("najlepszyCzas", 9999) Aplikacja: Trener matematyczny (App Inventor 2) Slajd 46/55
Slajd 47/55
Testowanie programu

Plan testów aplikacji

  • Test 1: poprawna odpowiedź - punkty rosną, komunikat zielony. Sprawdza główną ścieżkę sukcesu.
  • Test 2: błędna odpowiedź - komunikat czerwony, punkty bez zmian. Weryfikuje reakcję na błąd.
  • Test 3: puste pole - komunikat "Wpisz odpowiedź". Test poprawności walidacji danych.
  • Test 4: zmiana poziomu - pytania w nowym zakresie. Sprawdza działanie konfiguracji gry.
  • Test 5: po 10 pytaniach - zapis wyniku i powrót. Test poprawności zakończenia sesji.
  • Test 6: restart aplikacji - wyniki nadal widoczne. Weryfikuje trwałość zapisanych danych.
Testujemy zarówno ścieżki poprawne, jak i przypadki brzegowe.
Plan testów weryfikacyjnych aplikacji T1 Prawidłowa odpowiedź Wpisanie równego iloczynu: punkty rosną o 1, zielony komunikat "Dobrze!". T2 Błędna odpowiedź Zła liczba: brak punktu, czerwony komunikat z podaną poprawną wartością. T3 Walidacja pustego pola Kliknięcie "Sprawdź" przy pustym polu: monit ostrzegawczy bez awarii. T4 Ukończenie 10 pytań Wyświetlenie podsumowania sesji, zatrzymanie timera, zapis rekordu. T5 Trwałość TinyDB Restart aplikacji: rekord punktów i czas są poprawnie wczytywane. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 47/55
Slajd 48/55
Typowe błędy w programie

Na co uważać

  • Niezgodne nazwy ekranów w open another screen. Błąd nazwy natychmiast przerywa działanie aplikacji.
  • Brak inicjalizacji zmiennych przed użyciem. Nieustawione zmienne mają pustą wartość.
  • Zapominanie o zatrzymaniu zegara po sesji. Czas liczy się dalej po zakończeniu treningu.
  • Porównywanie tekstu z liczbą bez konwersji. Rodzi nieprzewidywalne wyniki porównań.
  • Nadpisywanie rekordu gorszym wynikiem (zły warunek). Rekord zapisujemy tylko, gdy wynik jest lepszy.
  • Brak walidacji pustego pola. Puste odpowiedzi fałszują statystyki sesji.
Typowe błędy programistyczne i ich zapobieganie 1 Błędna nazwa ekranu w tekście: Wpisanie "screen2" zamiast "Screen2" powoduje natychmiastowy crash. 2 Wielokrotne otwieranie Screen1: Zamiast open another screen ("Screen1") używaj zawsze close screen. 3 Działający timer w tle: Niezatrzymany Clock obciąża baterię i zaburza kolejne serie rozgrywki. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 48/55
Slajd 49/55
Optymalizacja i porządek w projekcie

Dobre praktyki na koniec

  • Grupuj bloki i zwijaj nieużywane fragmenty. Porządek pola roboczego ułatwia pracę.
  • Komentuj procedury i ważne warunki. Komentarze pełnią rolę dokumentacji kodu.
  • Używaj plecaka do przenoszenia sprawdzonych bloków. Gotowe bloki kopiuje się między ekranami.
  • Trzymaj stałą konwencję nazw. Spójne nazwy ułatwiają przegląd projektu.
  • Regularnie eksportuj projekt (.aia). Kopia chroni przed utratą pracy.
Porządek w projekcie to oszczędność czasu przy jego rozbudowie i poprawkach.
Dobre praktyki czystego kodu w App Inventor 1. Zwijanie bloków (Collapse) Gotowe i przetestowane procedury warto zwinąć, by nie zajmowały obszaru roboczego. 2. Komentarze do procedur Dodawaj dymki komentarza (?) z opisem działania procedur i oczekiwanych argumentów. 3. Narzędzie Plecak (Backpack) Wykorzystuj plecak do kopiowania wspólnych procedur (np. formatujCzas) pomiędzy różnymi ekranami. 4. Usuwanie zbędnych bloków Przeciągaj osierocone bloki do kosza na śmieci, aby uniknąć konfliktów kompilacji. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 49/55
Slajd 50/55
Zbudowanie aplikacji .apk

Od projektu do instalacji

  1. Zapisujemy projekt w chmurze. Projekt dostępny na każdym urządzeniu z przeglądarką.
  2. Menu Build - Android App (.apk). Kompilacja pakietu odbywa się w chmurze MIT.
  3. Pobieramy plik .apk na komputer. Otrzymujemy gotowy pakiet do instalacji.
  4. Przenosimy plik na telefon i instalujemy. Instalacja spoza sklepu Google Play.
  5. Włączamy instalację z nieznanych źródeł, jeśli trzeba. Standardowe zezwolenie na taką instalację.
  6. Testujemy pełną aplikację na prawdziwym urządzeniu. Rzeczywiste działanie sprawdzamy na telefonie.
Proces budowy pakietu instalacyjnego .apk 1 Menu górne Build w MIT AI2: Wybierz: Build -> Android App (.apk) 2 Kompilacja w chmurze MIT: Serwer kompiluje projekt, tworząc gotowy plik wykonywalny Androida. 3 Instalacja na smartfonie: Zeskanuj kod QR aparatem lub pobierz plik .apk bezpośrednio na dysk komputera. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 50/55
Slajd 51/55
Rozszerzenia programu

Pomysły na dalszy rozwój

  • Działania inne niż mnożenie: dodawanie, odejmowanie, dzielenie. Logika losowania rozszerza się o wybrany operator.
  • Tryb na czas - jak najwięcej pytań w 60 sekund. Zmienia cel rozgrywki i warunki zakończenia.
  • Poziomy trudności zwiększane automatycznie. Trudność rośnie wraz z osiągnięciami ucznia.
  • Dźwięki przy poprawnej i błędnej odpowiedzi. Wymaga komponentu odtwarzającego pliki dźwiękowe.
  • Wysyłanie wyników na serwer (komponent Web). Wymaga komunikacji sieciowej z usługą.
  • Tryb wieloosobowy na jednym telefonie. Kilku graczy korzysta ze wspólnego urządzenia.
Każde rozszerzenie to okazja do zastosowania poznanych wcześniej wzorców.
Kierunki rozwoju aplikacji Trener matematyczny 1. Inne operacje (+, -, /) Dodanie wyboru operacji arytmetycznej: dodawanie, odejmowanie bez ujemnych oraz dzielenie bez reszty. 2. Tryb "Próba czasowa" Odliczanie 60 sekund w dół. Cel: rozwiązanie jak największej liczby zadań przed upływem limitu. 3. Dźwięki i synteza TTS Odczytywanie zadań na głos i efekty dźwiękowe sukcesu/błędu z komponentu Sound. 4. Tabela wielu graczy Wpisywanie imienia gracza i sortowana lista TOP 5 wyników zapisywana w TinyDB. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 51/55
Slajd 52/55
Podsumowanie prezentacji 4

Co zapamiętać

  • Aplikację planujemy: specyfikacja, ekrany, dane, logika. Planowanie w tej kolejności chroni przed kosztownymi zmianami.
  • Podział na ekrany porządkuje program. Każdy ekran pełni jedno główne zadanie.
  • Zmienne i procedury porządkują kod. Czytelność rośnie dzięki podziałowi na procedury.
  • TinyDB zapewnia trwałość danych między ekranami i sesjami. Wspólna baza dostępna dla całej aplikacji.
  • Zdarzenia, warunki i losowość budują logikę gry. Połączone elementy tworzą mechanikę rozgrywki.
  • Testujemy ścieżki poprawne i brzegowe. Oba typy scenariuszy zwiększają niezawodność.
Powstał pełny, użyteczny program - wzorzec dla własnych projektów studenta.
Podsumowanie: Czego się nauczyliśmy ✓ Architektura wieloekranowa Prawidłowe nawigowanie między ekranami za pomocą open screen i close screen. ✓ Trwałość danych (TinyDB) Pamięć trwała urządzeń Android: zapisywanie, odczyt z wartością domyślną i reset. ✓ Czysty kod i procedury Wydzielanie logiki losowania, sprawdzania, aktualizacji UI i formatowania czasu. ✓ Kompilacja niezależnego APK Tworzenie pełnej instalacji gotowej do uruchomienia bez połączenia z chmurą MIT. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 52/55
Slajd 53/55
Pytania kontrolne

Sprawdź się

  1. Dlaczego w AI2 przekazujemy dane między ekranami przez TinyDB?
  2. Jak działa procedura nowePytanie i dlaczego warto ją wydzielić?
  3. W jaki sposób sprawdzamy, czy padł nowy rekord?
  4. Jak zatrzymujemy zegar po zakończeniu sesji?
  5. Jak zabezpieczyć program przed pustą odpowiedzią?
  6. Zadanie: dodaj tryb dzielenia i zapisz osobny rekord dla niego. Wykorzystaj wzorzec z mnożenia i nowy klucz w TinyDB.
Pytania kontrolne: Sprawdź swoją wiedzę Q1 Pamięć trwała: Dlaczego do przekazywania ustawień między ekranami warto stosować bazę TinyDB? Q2 Procedura nowePytanie: Jakie czynności wykonuje procedura losowania i dlaczego wywołujemy ją w kilku miejscach? Q3 Porównanie z rekordem: W jaki sposób blok if decyduje, czy aktualna sesja ustanawia nowy rekord? Q4 Nawigacja w pamięci RAM: Dlaczego z ekranów potomnych należy wracać przez close screen, a nie open another screen? Aplikacja: Trener matematyczny (App Inventor 2) Slajd 53/55
Slajd 54/55
Zadania praktyczne dla studenta

Do samodzielnego wykonania

  1. Odtwórz program Trener matematyczny w całości. Ćwiczenie utrwala całą drogę budowy aplikacji.
  2. Dodaj czwarty poziom trudności (liczby 1-50). Nowa wartość zakresu i pozycja na liście.
  3. Dodaj dźwięk przy poprawnej odpowiedzi. Wymaga komponentu odtwarzającego dźwięk.
  4. Dodaj ekran z rankingiem ostatnich pięciu sesji. Wymaga zapisu listy wyników w TinyDB.
  5. Zmień wygląd aplikacji (kolory, czcionki, obrazek tła). Praca nad warstwą wizualną programu.
Zadania praktyczne: Rozbuduj aplikację Z1 Odtwórz projekt Trener matematyczny Zbuduj 4 ekrany, zaimplementuj procedury i uruchom aplikację na telefonie. Z2 Dodaj 4. poziom trudności "Mistrz (1-50)" Zaktualizuj ListPicker na Screen4 i dopisz odpowiedni warunek ustawiający zakres. Z3 Wprowadź sygnały dźwiękowe Dodaj komponent Sound: odtwórz dźwięk braw przy wygranej i buczenie przy pomyłce. Aplikacja: Trener matematyczny (App Inventor 2) Slajd 54/55
Slajd 55/55
Zakończenie prezentacji 4

Dziękuję za uwagę

  • Zbudowaliśmy kompletny program wieloekranowy. Cztery ekrany połączone spójną nawigacją.
  • Wykorzystaliśmy zmienne, procedury, warunki i pętle. Wszystkie poznane elementy w jednym programie.
  • Zapisaliśmy dane trwałe w TinyDB. Wyniki przetrwają zamknięcie aplikacji.
  • W prezentacji 5 zajmiemy się czujnikami, multimediami i grami. Nowe możliwości dalszej rozbudowy projektów.
Koniec prezentacji 4: Gratulacje! Gratulacje! Opanowałeś tworzenie programów! Stworzyłeś kompletną aplikację wieloekranową z bazą TinyDB, procedurami i pełną walidacją interfejsu dotykowego. Zapowiedź Prezentacji 5: Czujniki sprzętowe, silnik gier 2D (Canvas, Sprites) i multimedia! Kliknij "Następna prezentacja", aby przejść do tworzenia gier mobilnych ➔ Aplikacja: Trener matematyczny (App Inventor 2) Slajd 55/55