INF.04-01-24.06-SGCzerwiec 2024 · 26 kroków · ok. 74 min · 35 kryteriów z klucza
Rozwiązanie krok po kroku: Gra w kości (C# + .NET MAUI)
Rozwiązanie dotyczy arkusza z grą w kości w wersji C# + .NET MAUI: w konsoli program, który pyta o liczbę kostek (od 3 do 10, aż do skutku), rzuca nimi w osobnej funkcji, liczy punkty w drugiej - sumę oczek, które wypadły co najmniej dwa razy - i pyta, czy grać dalej; w aplikacji mobilnej .NET MAUI ekran z pięcioma obrazami kości, przyciskiem rzutu, wynikiem rzutu, wynikiem całej gry i przyciskiem resetu. Do tego dokumentacja funkcji według wzoru z arkusza, zrzuty i dokument egzamin.
To drugie rozwiązanie tego arkusza - pierwsze, w zakładce obok, robi to samo w Javie i Android Studio. Arkusz pokazuje oba środowiska (obraz 3 to .NET MAUI, obraz 4 - Android Studio), a klucz ocenia je tak samo. Jeden język, C#, wystarcza tu na obie części: funkcja licząca punkty z konsoli przechodzi do aplikacji bez zmian.
Kroki idą zdanie po zdaniu za treścią arkusza, a kod od początku jest taki, jak w porządnym projekcie. Na końcu dwa kroki porównują to rozwiązanie z wariantem w Javie.
Co widać w podglądzie. Wyniki programu konsolowego pochodzą z prawdziwego uruchomienia kodu z danego kroku (.NET 10) z danymi wpisanymi z klawiatury, a punkty w każdym rzucie przeliczono niezależnie z wypisanych oczek. Ekran telefonu to symulacja w przeglądarce zbudowana z pliku XAML danego kroku, z obrazami z archiwum pliki1.zip; jej zachowanie odpowiada kodowi C# z kroku - możesz klikać „RZUĆ KOŚĆMI” i „RESETUJ WYNIK”. Każdy stan aplikacji zbudowano też naprawdę (dotnet build) i porównano z emulatorem Pixel 8 (Android 16).
Jak liczą się punkty. Klucz ma 35 kryteriów (R.1.1 - R.4.8), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 27 punktów - można stracić 8 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie, pliki i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Rozwiązuję samodzielnie” chowa rozwiązanie kroku - najpierw własna próba, potem odsłonięcie.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
Etap 1: Przygotowanie
Krok 1 · po tym etapie masz 0 z 35 kryteriów (pkt)
Krok 1: Folder zdającego, podfoldery i obrazy z pliki1.zip
ok. 3 min
Polecenie z arkusza
Utwórz folder i nazwij go numerem zdającego. W folderze utwórz podfoldery: konsolowa, mobilna, dokumentacja. Do zbudowania aplikacji zastosuj obrazy z archiwum pliki1.zip zabezpieczonego hasłem Gra^Kosci5.
Na pulpicie zakładasz folder o nazwie z numerem PESEL, a w nim konsolowa, mobilna i dokumentacja. Archiwum pliki1.zip rozpakowujesz hasłem z arkusza - jest w nim siedem obrazów: k1.jpg - k6.jpg (ścianki kości z jednym do sześciu oczek) i question.jpg (znak zapytania na stan początkowy).
Etap 2: Aplikacja konsolowa
Kroki 2-8 · po tym etapie masz 16 z 35 kryteriów (pkt)
Krok 2: Projekt konsola w C#
ok. 3 min
Polecenie z arkusza
Napisz program implementujący logikę gry w kości. Zastosowany obiektowy język programowania zgodny z zainstalowanym na stanowisku egzaminacyjnym: C++ lub C#, lub Java, lub Python. Dowolne podejście: strukturalne lub obiektowe.
Wybierasz C# - ten sam język posłuży w .NET MAUI. W Visual Studio: Utwórz nowy projekt → Aplikacja konsolowa, nazwa konsola (w terminalu: dotnet new console -n konsola).
Szablon tworzy Program.cs z jedną linią: to instrukcje najwyższego poziomu - kod programu głównego piszesz wprost w pliku, bez klasy Program i metody Main (kompilator dopisze je sam). Wybierasz podejście strukturalne: program główny i dwie funkcje. Linię z „Hello, World!” zaraz zastąpisz.
konsola/Program.csC#nowy plik
Console.WriteLine("Hello, World!");
Wynik programu po tym kroku
> konsola.exe
Hello, World!
Krok 3: Liczba kostek z klawiatury, powtarzana do skutku
Kryteria: , ,
R.2.4 Zastosowano przynajmniej jedną pętlę do wprowadzania liczby kostek lub sprawdzania zgody na dalsze działanie programu
R.1.7 Program nawiązuje zrozumiałą komunikację z użytkownikiem: monit o wprowadzenie danych, wyprowadzanie wyników opatrzone komentarzem. Jeżeli kod nie uruchamia się z powodu błędów kompilacji - sprawdzić w kodzie aplikacji
R.1.4 Użyto polskie lub angielskie, znaczące nazewnictwo zmiennych (pól). Wyjątkami od reguły są zmienne: bufor, tmp, iteratory pętli itp. Kryterium nie jest spełnione tylko wtedy, gdy nazwy zmiennych nic nie znaczą, np.: x, fun, foo, tab, tablica, …
ok. 3 min
Polecenie z arkusza
Pobiera z klawiatury liczbę kostek do rzucenia z przedziału od 3 do 10. Punkt 1 jest powtarzany dopóki podana liczba nie należy do przedziału <3, 10> - obraz 2.
Pętla do ... while wykonuje się co najmniej raz (pytanie musi paść), a powtarza się, dopóki odpowiedź jest zła (R.2.4, R.1.7):
int.TryParse(Console.ReadLine(), out count) próbuje zamienić wpisany tekst na liczbę: zwraca true i wpisuje liczbę do count albo zwraca false, gdy tekst nie jest liczbą (np. „pięć”). Program nie kończy się wtedy wyjątkiem, tylko pyta ponownie,
count < 3 || count > 10 - liczba poza przedziałem.
Podgląd to prawdziwe uruchomienie: 2, potem 11 i słowo „pięć” - program pyta ponownie - dopiero 5 kończy pętlę. Obie granice 3 i 10 są przyjmowane (R.2.7 sprawdza 2 i 11 oraz 3 i 10).
Typowe błędy
int.Parse(Console.ReadLine()) na słowie „pięć” kończy program wyjątkiem FormatException - w zrzucie widać czerwony komunikat zamiast pytania.
konsola/Program.csC#zmienione: 5 linii
int count;do{ Console.WriteLine("Ile kostek chcesz rzucić? (3 - 10)");} while (!int.TryParse(Console.ReadLine(), out count) || count < 3 || count > 10);
Wynik programu po tym kroku
> konsola.exe
Ile kostek chcesz rzucić? (3 - 10)
2
Ile kostek chcesz rzucić? (3 - 10)
11
Ile kostek chcesz rzucić? (3 - 10)
pięć
Ile kostek chcesz rzucić? (3 - 10)
5
Krok 4: Funkcja RollDice: losowanie liczb 1-6 do tablicy
Kryteria: , , , ,
R.2.1 Program składa się z programu głównego oraz przynajmniej dwóch funkcji (metod): losującej i liczącej punkty (mogą być niedokończone, lub z błędami) oraz zastosowano zmienną typu tablicowego dla liczb całkowitych, wypełnioną wartościami całkowitymi od 1 do 6
R.2.3 Wyświetlanie zawartości tablicy i wypełnianie jej wartościami losowymi zostało zaimplementowane w oparciu o pętlę. Pętla ma właściwą liczbę iteracji
R.2.5 Liczby są losowane z przedziału od 1 do 6. Losowane jest tyle liczb, ile kostek wskazał użytkownik. Losowanie odbywa się w metodzie / funkcji. W podejściu strukturalnym funkcja musi mieć parametry wejściowe (nie są stosowane zmienne globalne)
R.1.3 Użyto polskie lub angielskie, znaczące nazewnictwo funkcji (metod)
R.1.5 Zastosowano typy zmiennych pasujące do problemu (np. tablica dowolnego typu całkowitego, zmienne całkowite dla punktów, liczby losowań, zmienna znakowa dla zgody 't'/'n') W przypadku języka Python, tam gdzie jest to wymagane, zastosowano jawną konwersję do odpowiednich typów
ok. 3 min
Polecenie z arkusza
Losuje tyle liczb całkowitych z przedziału od 1 do 6, ile podano z klawiatury, co odpowiada rzutom kośćmi. Wynik pojedynczego losowania kostek jest zapisywany do tablicy lub kolekcji. Program zawiera funkcję / metodę losującą liczby z przedziału od 1 do 6 (rzucającą wszystkimi kośćmi). W przypadku podejścia strukturalnego funkcja nie może korzystać ze zmiennych globalnych.
Funkcja dostaje liczbę kostek jako parametr i zwraca tablicęint[] z wynikami (R.2.1, R.1.5). W pętli for wypełniasz tyle komórek, ile jest kostek (R.2.3).
Random.Shared.Next(1, 7) losuje liczbę od 1 do 6: dolna granica jest włączona, górna wyłączona - stąd 7. Random.Shared to gotowy, wspólny generator .NET (od .NET 6), więc nie tworzysz nowego obiektu Random przy każdym rzucie.
Słowo static przed funkcją lokalną w instrukcjach najwyższego poziomu oznacza, że funkcja nie widzi zmiennych programu głównego - kompilator zgłosi błąd, gdyby po nie sięgnęła. To dokładnie wymaganie arkusza „funkcja nie może korzystać ze zmiennych globalnych” (R.2.5), pilnowane przez kompilator.
Funkcje lokalne piszesz na końcu pliku, pod programem głównym; program główny wywołuje funkcję: int[] dice = RollDice(count);. Zmienna dice w programie głównym i tablica dice w funkcji to dwie różne zmienne.
Typowe błędy
Random.Shared.Next(1, 6) losuje tylko 1-5 - szóstka nigdy nie wypada, bo górna granica jest wyłączna.
konsola/Program.csC#zmienione: 12 linii
int count;do{ Console.WriteLine("Ile kostek chcesz rzucić? (3 - 10)");} while (!int.TryParse(Console.ReadLine(), out count) || count < 3 || count > 10);int[] dice = RollDice(count);staticint[] RollDice(int count){int[] dice = newint[count];for (int i = 0; i < count; i++) { dice[i] = Random.Shared.Next(1, 7); }return dice;}
R.2.3 Wyświetlanie zawartości tablicy i wypełnianie jej wartościami losowymi zostało zaimplementowane w oparciu o pętlę. Pętla ma właściwą liczbę iteracji
R.2.8 Program wyświetla tyle liczb z zakresu 1..6 ile użytkownik podał na początku działania aplikacji
ok. 2 min
Polecenie z arkusza
Wypisuje ile wyrzucono oczek na każdej kostce w formacie „Kostka <numer-kostki>: <liczba-oczek>”.
Pętlą wypisujesz tablicę zwróconą przez RollDice (R.2.3, R.2.8). Napis składasz interpolacją: $"Kostka {i + 1}: {dice[i]}" - wyrażenia w nawiasach klamrowych są wyliczane i wstawiane w tekst. Indeksy tablicy zaczynają się od 0, a kostki numerujesz od 1 - stąd i + 1.
konsola/Program.csC#zmienione: 4 linie
int count;do{ Console.WriteLine("Ile kostek chcesz rzucić? (3 - 10)");} while (!int.TryParse(Console.ReadLine(), out count) || count < 3 || count > 10);int[] dice = RollDice(count);for (int i = 0; i < dice.Length; i++){ Console.WriteLine($"Kostka {i + 1}: {dice[i]}");}staticint[] RollDice(int count){int[] dice = newint[count];for (int i = 0; i < count; i++) { dice[i] = Random.Shared.Next(1, 7); }return dice;}
R.2.1 Program składa się z programu głównego oraz przynajmniej dwóch funkcji (metod): losującej i liczącej punkty (mogą być niedokończone, lub z błędami) oraz zastosowano zmienną typu tablicowego dla liczb całkowitych, wypełnioną wartościami całkowitymi od 1 do 6
R.2.2 Funkcja/metoda licząca punkty jest typu liczbowego całkowitego i zawiera zapisaną instrukcję zwracającą wartość
R.2.6 Punkty są liczone jako suma oczek, dla tych wartości, które zostały wylosowane przynajmniej dwa razy
R.1.1 Kod źródłowy zapisano w sposób czytelny: instrukcje w osobnych liniach, stosowane spacje pomiędzy operatorami, konsekwentnie stosowana wybrana konwencja dla nawiasów klamrowych
R.1.2 Kod zapisano z wcięciami dla zagnieżdżeń bloków
ok. 4 min
Polecenie z arkusza
Punkty są sumą oczek, gdy dana liczba została wylosowana dwa razy lub więcej. Program zawiera funkcję / metodę liczącą punkty. Suma punktów jest zwracana z funkcji / metody. W przypadku podejścia strukturalnego funkcja nie może korzystać ze zmiennych globalnych.
Dla każdej kostki liczysz, ile kostek ma tyle samo oczek (pętla wewnętrzna, razem z nią samą). Jeśli takich kostek jest co najmniej dwie, oczka tej kostki dodajesz do punktów. Funkcja ma typ int i zwraca sumę (R.2.2, R.2.6); jest static, więc korzysta wyłącznie z parametru.
Przykład 1 z arkusza - 1, 5, 2, 2, 5: jedynka występuje raz, więc jej nie liczysz; każda dwójka - dwa razy: 2 + 2; każda piątka też: 5 + 5. Razem 14. Przykład 2 - 2, 1, 2, 3, 2: każda z trzech dwójek ma „towarzystwo”, więc 2 + 2 + 2 = 6.
Wynik funkcji wypisujesz z komunikatem z obrazu 1 (R.2.9). Podgląd to prawdziwe uruchomienie z pięcioma kostkami; punkty przeliczono niezależnie z wypisanych oczek - zgadzają się.
R.2.10 Podanie 't' kontynuuje grę, wybranie 'n' przerywa grę
R.2.4 Zastosowano przynajmniej jedną pętlę do wprowadzania liczby kostek lub sprawdzania zgody na dalsze działanie programu
R.2.7 Program kompiluje się i uruchamia w konsoli, co udokumentowano zrzutem ekranu. Pytanie o liczbę kostek jest powtarzane tak długo, aż zostanie podana liczba z zakresu 3..10 (sprawdzić dla granicznych: 2 i 11 oraz 3 i 10)
R.1.5 Zastosowano typy zmiennych pasujące do problemu (np. tablica dowolnego typu całkowitego, zmienne całkowite dla punktów, liczby losowań, zmienna znakowa dla zgody 't'/'n') W przypadku języka Python, tam gdzie jest to wymagane, zastosowano jawną konwersję do odpowiednich typów
ok. 4 min
Polecenie z arkusza
Pyta grającego czy powtórzyć grę, gdy podano: ‘t’: idź do punktu 2, ‘n’: skończ działanie programu.
Rzut, wypisanie i punkty obejmujesz drugą pętlą do ... while, która wraca do rzutu (punktu 2 arkusza - bez ponownego pytania o liczbę kostek), dopóki odpowiedź to 't' (R.2.10).
Odpowiedź trzymasz w zmiennej typu char - jeden znak, jak 't' i 'n' (R.1.5):
Console.ReadLine() może zwrócić null (koniec danych wejściowych), więc ?? "" podstawia wtedy pusty napis - kompilator przestaje ostrzegać o wartości null,
input[0] to pierwszy znak; dla pustej odpowiedzi przyjmujesz 'n',
char.ToLower sprawia, że wielkie T też kontynuuje grę.
Podgląd: najpierw zła liczba kostek (2), potem 5 kostek, „t”, „T” i „n” - trzy rzuty, jak na obrazie 1.
Typowe błędy
Porównanie answer == "t" (cudzysłów podwójny) nie skompiluje się przy typie char - znak zapisujesz w apostrofach 't'.
> konsola.exe
Ile kostek chcesz rzucić? (3 - 10)
2
Ile kostek chcesz rzucić? (3 - 10)
5
Kostka 1: 3
Kostka 2: 1
Kostka 3: 1
Kostka 4: 3
Kostka 5: 1
Liczba uzyskanych punktów: 9
Jeszcze raz? (t/n)
t
Kostka 1: 4
Kostka 2: 1
Kostka 3: 5
Kostka 4: 3
Kostka 5: 1
Liczba uzyskanych punktów: 2
Jeszcze raz? (t/n)
T
Kostka 1: 3
Kostka 2: 5
Kostka 3: 5
Kostka 4: 2
Kostka 5: 1
Liczba uzyskanych punktów: 10
Jeszcze raz? (t/n)
n
Etap 3: Aplikacja mobilna
Kroki 9-20 · po tym etapie masz 27 z 35 kryteriów (pkt)
Krok 9: Nowy projekt Kosci (.NET MAUI)
ok. 3 min
Polecenie z arkusza
Za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym wykonaj aplikację mobilną do gry w kości.
W Visual Studio: Utwórz nowy projekt → Aplikacja .NET MAUI, nazwa Kosci (w terminalu: dotnet new maui -n Kosci). Szablon tworzy dwa pliki, które będziesz zmieniać:
MainPage.xaml - wygląd strony w języku znaczników XAML,
MainPage.xaml.cs - kod C# skojarzony z tą stroną (code-behind).
Strona jest osadzona w Shell (plik AppShell.xaml) - stąd pasek z tytułem „Home” u góry, taki sam jak na obrazie 3 arkusza. Na liście urządzeń u góry Visual Studio wybierasz emulator Androida i uruchamiasz (F5) - na ekranie przykładowa strona szablonu z licznikiem kliknięć.
Kosci/MainPage.xamlXAMLnowy plik
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"><ScrollView><VerticalStackLayoutPadding="30,0"Spacing="25"><ImageSource="dotnet_bot.png"HeightRequest="185"Aspect="AspectFit"SemanticProperties.Description="dot net bot in a submarine number ten"/><LabelText="Hello, World!"Style="{StaticResource Headline}"SemanticProperties.HeadingLevel="Level1"/><LabelText="Welcome to .NET Multi-platform App UI"Style="{StaticResource SubHeadline}"SemanticProperties.HeadingLevel="Level2"SemanticProperties.Description="Welcome to dot net Multi platform App U I"/><Buttonx:Name="CounterBtn"Text="Click me"SemanticProperties.Hint="Counts the number of times you click"Clicked="OnCounterClicked"HorizontalOptions="Fill"/></VerticalStackLayout></ScrollView></ContentPage>
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 10: Obrazy kości w Resources/Images
ok. 2 min
Polecenie z arkusza
Do zbudowania aplikacji zastosuj obrazy z archiwum pliki1.zip zabezpieczonego hasłem Gra^Kosci5.
Siedem obrazów z archiwum przeciągasz w Eksploratorze rozwiązań do folderu Resources/Images. Plik projektu ma regułę <MauiImage Include="Resources\Images\*" />, więc każdy obraz z tego folderu sam trafia do aplikacji - w XAML i w kodzie wskazujesz go po nazwie pliku, np. "k3.jpg".
Nazwy obrazów w MAUI mogą mieć tylko małe litery, cyfry i podkreślenia i muszą zaczynać się literą - nazwy z archiwum spełniają ten warunek.
Typowe błędy
Obraz o nazwie K1.jpg albo 1.jpg przerywa budowanie aplikacji błędem narzędzia obrazów MAUI - nazwę trzeba zmienić na małe litery zaczynające się literą.
Krok 11: VerticalStackLayout na stronie w kolorze Beige
Kryteria: ,
R.3.1 Zastosowano język znaczników XML/XAML lub inny do opisu interfejsu użytkownika oraz zastosowano rozkład liniowy wertykalny (LinearLayout lub StackLayout, lub VerticalStackLayout, lub inny o tej idei) z zagłębionym rozkładem liniowym horyzontalnym dla obrazów
R.3.3 Zastosowano kolory tła: rozkład wertykalny lub strona: Beige (#F5F5DC), napis z tytułem: Brown (#A52A2A), oba przyciski: Chocolate (#D2691E), rozkład horyzontalny: biały oraz biały kolor czcionki dla napisu z tytułem gry (w MAUI nazwy kolorów obowiązkowo wielką literą)
ok. 2 min
Polecenie z arkusza
Interfejs użytkownika zapisany za pomocą języka znaczników wspieranego w danym środowisku (np. XAML, XML). Zastosowany rozkład liniowy wertykalny (Linear / Stack lub inny o tej idei). Kolory tła: Rozkład wertykalny lub strona: Beige (#F5F5DC).
Usuwasz przykładową treść szablonu. Zostaje strona ContentPage z jednym układem VerticalStackLayout - stawia elementy jeden pod drugim (R.3.1). Tło strony to BackgroundColor="Beige" (R.3.3) - klucz zaznacza, że w MAUI nazwę koloru piszesz wielką literą; zapis #F5F5DC też by zadziałał.
Z kodu MainPage.xaml.cs usuwasz licznik i metodę OnCounterClicked - przycisk, który ją wywoływał, zniknął z XAML. Zostaje konstruktor z InitializeComponent(), który buduje stronę z pliku XAML.
Typowe błędy
Usunięcie przycisku z XAML bez usunięcia CounterBtn z kodu kończy się błędem kompilacji: nazwa CounterBtn nie istnieje.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 12: Tytuł gry na brązowym pasku
Kryteria: , ,
R.3.2 Umieszczono napis "Gra w kości. Autor" z numerem zdającego, dwa przyciski, pięć obrazów wypełnionych grafiką question.jpg oraz dwa napisy
R.3.3 Zastosowano kolory tła: rozkład wertykalny lub strona: Beige (#F5F5DC), napis z tytułem: Brown (#A52A2A), oba przyciski: Chocolate (#D2691E), rozkład horyzontalny: biały oraz biały kolor czcionki dla napisu z tytułem gry (w MAUI nazwy kolorów obowiązkowo wielką literą)
R.3.4 Dobrano marginesy, odstępy i wielkość grafiki tak aby kontrolki nie stykały się ze sobą oraz było widoczne w całości 5 obrazów, napis z tytułem oraz przyciski są wyśrodkowane, pozostałe wypełniają w poziomie całą szerokość strony (np. fill, fillAndExpand, match_parent)
ok. 3 min
Polecenie z arkusza
Napis (etykieta) z tytułem gry: „Gra w kości. Autor ”, dalej wstawiony numer zdającego. Kolory tła: Napis z tytułem strony: Brown (#A52A2A). Biały kolor czcionki dla napisu z tytułem gry. Rozmiar czcionki napisu z tytułem gry jest największy względem innych napisów. Napis z tytułem oraz rozkład horyzontalny wypełniają w poziomie całą szerokość strony.
Label z tytułem - na egzaminie po „Autor” wpisujesz numer PESEL, tu stoi Bartosz Bryniarski (R.3.2):
etykieta w VerticalStackLayout domyślnie wypełnia całą szerokość (HorizontalOptions="Fill"), więc brązowy pasek sięga od krawędzi do krawędzi,
BackgroundColor="Brown" i TextColor="White" (R.3.3),
FontSize="24" - największa czcionka na ekranie; pozostałe napisy zostaną przy domyślnych 14,
Margin="0,10" - dwie liczby to margines poziomy i pionowy: 0 po bokach, 10 u góry i u dołu, jak w arkuszu; Padding="10" odsuwa tekst od krawędzi paska.
⚠️ Rozbieżność arkusz-klucz: arkusz każe tytułowi wypełniać szerokość, a wyśrodkowuje napisy z wynikami i przyciski; klucz (R.3.4) mówi odwrotnie - „napis z tytułem oraz przyciski są wyśrodkowane, pozostałe wypełniają szerokość”. Obie wersje spełnia pasek na całą szerokość z tekstem wyśrodkowanym w środku: HorizontalTextAlignment="Center" (R.3.4).
Kosci/MainPage.xamlXAMLzmienione: 7 linii
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"BackgroundColor="Beige"><VerticalStackLayout><LabelText="Gra w kości. Autor Bartosz Bryniarski"FontSize="24"BackgroundColor="Brown"TextColor="White"Padding="10"Margin="0,10"HorizontalTextAlignment="Center"/></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 13: Przycisk RZUĆ KOŚĆMI
Kryteria: , ,
R.3.2 Umieszczono napis "Gra w kości. Autor" z numerem zdającego, dwa przyciski, pięć obrazów wypełnionych grafiką question.jpg oraz dwa napisy
R.3.3 Zastosowano kolory tła: rozkład wertykalny lub strona: Beige (#F5F5DC), napis z tytułem: Brown (#A52A2A), oba przyciski: Chocolate (#D2691E), rozkład horyzontalny: biały oraz biały kolor czcionki dla napisu z tytułem gry (w MAUI nazwy kolorów obowiązkowo wielką literą)
R.3.4 Dobrano marginesy, odstępy i wielkość grafiki tak aby kontrolki nie stykały się ze sobą oraz było widoczne w całości 5 obrazów, napis z tytułem oraz przyciski są wyśrodkowane, pozostałe wypełniają w poziomie całą szerokość strony (np. fill, fillAndExpand, match_parent)
ok. 2 min
Polecenie z arkusza
Przycisk o treści „RZUĆ KOŚĆMI”. Kolory tła: Oba przyciski: Chocolate (#D2691E). Napisy z wynikami oraz przyciski są wyśrodkowane.
Button z tłem BackgroundColor="Chocolate" (R.3.3). Przycisk w VerticalStackLayout domyślnie rozciąga się na całą szerokość - HorizontalOptions="Center" zmniejsza go do szerokości napisu i stawia na środku (R.3.4).
Wygląd przycisku (zaokrąglone rogi, biały tekst, odstępy wewnątrz) pochodzi ze stylu szablonu w Resources/Styles/Styles.xaml - nadpisujesz w nim tylko kolor tła. Inaczej niż w Androidzie z Material 3, gdzie trzeba sięgać po backgroundTint, tu BackgroundColor działa wprost.
Kosci/MainPage.xamlXAMLzmienione: 5 linii
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"BackgroundColor="Beige"><VerticalStackLayout><LabelText="Gra w kości. Autor Bartosz Bryniarski"FontSize="24"BackgroundColor="Brown"TextColor="White"Padding="10"Margin="0,10"HorizontalTextAlignment="Center"/><ButtonText="RZUĆ KOŚĆMI"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 14: Poziomy rząd pięciu obrazów question.jpg
Kryteria: , , ,
R.3.1 Zastosowano język znaczników XML/XAML lub inny do opisu interfejsu użytkownika oraz zastosowano rozkład liniowy wertykalny (LinearLayout lub StackLayout, lub VerticalStackLayout, lub inny o tej idei) z zagłębionym rozkładem liniowym horyzontalnym dla obrazów
R.3.2 Umieszczono napis "Gra w kości. Autor" z numerem zdającego, dwa przyciski, pięć obrazów wypełnionych grafiką question.jpg oraz dwa napisy
R.3.3 Zastosowano kolory tła: rozkład wertykalny lub strona: Beige (#F5F5DC), napis z tytułem: Brown (#A52A2A), oba przyciski: Chocolate (#D2691E), rozkład horyzontalny: biały oraz biały kolor czcionki dla napisu z tytułem gry (w MAUI nazwy kolorów obowiązkowo wielką literą)
R.3.4 Dobrano marginesy, odstępy i wielkość grafiki tak aby kontrolki nie stykały się ze sobą oraz było widoczne w całości 5 obrazów, napis z tytułem oraz przyciski są wyśrodkowane, pozostałe wypełniają w poziomie całą szerokość strony (np. fill, fillAndExpand, match_parent)
ok. 4 min
Polecenie z arkusza
Pięć obrazów w stanie początkowym wypełnionych grafiką question.jpg. Zastosowany rozkład liniowy wertykalny, z zagłębionym rozkładem liniowym horyzontalnym dla pięciu obrazów. Rozkład horyzontalny: biały. Rozmiar i marginesy dla pięciu obrazów należy dobrać tak, aby wszystkie obrazy były widoczne w całości, nie stykały się ze sobą oraz wypełniały całą szerokość rozkładu. Dla emulacji Pixel5 z obrazu 3 zastosowano wysokość obrazu 60 i marginesy 9.
Zagnieżdżony układ poziomy HorizontalStackLayout z białym tłem (R.3.1, R.3.3), w nim pięć kontrolek Image z obrazem question.jpg (R.3.2). Każdy obraz ma nazwę x:Name="Die1" ... "Die5" - pod tą nazwą kod C# dostanie pole z kontrolką.
Rozmiar dobierasz do szerokości ekranu (R.3.4). Arkusz podaje 60 i margines 9 dla Pixela 5, który ma szerokość 393 jednostek: 5 × (60 + 2 · 9) = 390 - wypełnia. Emulator Pixel 8 użyty w podglądzie ma 411 jednostek, więc bierzesz obrazy 64 × 64: 5 × (64 + 2 · 9) = 410 - też wypełniają rząd bez ucinania i się nie stykają. Na egzaminie liczysz tak samo dla emulatora ze stanowiska.
HorizontalStackLayout nie dzieli wolnego miejsca między elementy (tak jak layout_weight w Androidzie) - ustawia je jeden za drugim. Dlatego rozmiar trzeba policzyć.
Typowe błędy
Obrazy 80 × 80 z marginesem 9: 5 × 98 = 490 jednostek - piąta kość wychodzi poza ekran i jest ucięta (R.3.4).
Kosci/MainPage.xamlXAMLzmienione: 8 linii
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"BackgroundColor="Beige"><VerticalStackLayout><LabelText="Gra w kości. Autor Bartosz Bryniarski"FontSize="24"BackgroundColor="Brown"TextColor="White"Padding="10"Margin="0,10"HorizontalTextAlignment="Center"/><ButtonText="RZUĆ KOŚĆMI"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/><HorizontalStackLayoutBackgroundColor="White"Margin="0,10"><Imagex:Name="Die1"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die2"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die3"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die4"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die5"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/></HorizontalStackLayout></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 15: Napisy z wynikiem losowania i wynikiem gry
Kryteria: ,
R.3.2 Umieszczono napis "Gra w kości. Autor" z numerem zdającego, dwa przyciski, pięć obrazów wypełnionych grafiką question.jpg oraz dwa napisy
R.3.4 Dobrano marginesy, odstępy i wielkość grafiki tak aby kontrolki nie stykały się ze sobą oraz było widoczne w całości 5 obrazów, napis z tytułem oraz przyciski są wyśrodkowane, pozostałe wypełniają w poziomie całą szerokość strony (np. fill, fillAndExpand, match_parent)
ok. 2 min
Polecenie z arkusza
Napis „Wynik tego losowania: ”. Napis „Wynik gry: ”. Marginesy dla pozostałych kontrolek i elementów strony należy dobrać tak, aby kontrolki nie przylegały do siebie w pionie i w poziomie. Dla emulacji Pixel5 z obrazu 3 zastosowano marginesy górny i dolny 10.
Dwie etykiety z nazwami RollResultLabel i GameResultLabel - kod będzie wpisywał do nich wyniki. Etykiety wypełniają szerokość (jak chce klucz), a tekst stoi na środku dzięki HorizontalTextAlignment="Center" (jak chce arkusz) - R.3.4. Marginesy 10 u góry i u dołu (R.3.2, R.3.4).
Kosci/MainPage.xamlXAMLzmienione: 10 linii
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"BackgroundColor="Beige"><VerticalStackLayout><LabelText="Gra w kości. Autor Bartosz Bryniarski"FontSize="24"BackgroundColor="Brown"TextColor="White"Padding="10"Margin="0,10"HorizontalTextAlignment="Center"/><ButtonText="RZUĆ KOŚĆMI"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/><HorizontalStackLayoutBackgroundColor="White"Margin="0,10"><Imagex:Name="Die1"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die2"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die3"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die4"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die5"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/></HorizontalStackLayout><Labelx:Name="RollResultLabel"Text="Wynik tego losowania: "HorizontalTextAlignment="Center"Margin="0,10"/><Labelx:Name="GameResultLabel"Text="Wynik gry: "HorizontalTextAlignment="Center"Margin="0,10"/></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 16: Przycisk RESETUJ WYNIK
Kryteria: ,
R.3.2 Umieszczono napis "Gra w kości. Autor" z numerem zdającego, dwa przyciski, pięć obrazów wypełnionych grafiką question.jpg oraz dwa napisy
R.3.3 Zastosowano kolory tła: rozkład wertykalny lub strona: Beige (#F5F5DC), napis z tytułem: Brown (#A52A2A), oba przyciski: Chocolate (#D2691E), rozkład horyzontalny: biały oraz biały kolor czcionki dla napisu z tytułem gry (w MAUI nazwy kolorów obowiązkowo wielką literą)
ok. 1 min
Polecenie z arkusza
Przycisk o treści „RESETUJ WYNIK”. Rozmieszczenie elementów zgodne z obrazami 3 i 4.
Drugi przycisk w tym samym stylu co pierwszy. Ekran ma już wszystkie elementy z obrazu 3: tytuł, dwa przyciski, pięć obrazów i dwa napisy (R.3.2, R.3.10).
Kosci/MainPage.xamlXAMLzmienione: 5 linii
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"BackgroundColor="Beige"><VerticalStackLayout><LabelText="Gra w kości. Autor Bartosz Bryniarski"FontSize="24"BackgroundColor="Brown"TextColor="White"Padding="10"Margin="0,10"HorizontalTextAlignment="Center"/><ButtonText="RZUĆ KOŚĆMI"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/><HorizontalStackLayoutBackgroundColor="White"Margin="0,10"><Imagex:Name="Die1"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die2"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die3"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die4"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die5"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/></HorizontalStackLayout><Labelx:Name="RollResultLabel"Text="Wynik tego losowania: "HorizontalTextAlignment="Center"Margin="0,10"/><Labelx:Name="GameResultLabel"Text="Wynik gry: "HorizontalTextAlignment="Center"Margin="0,10"/><ButtonText="RESETUJ WYNIK"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/></VerticalStackLayout></ContentPage>
Ekran telefonu po tym kroku
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 17: Kliknięcie RZUĆ KOŚĆMI: pięć wylosowanych obrazów
Kryteria: , ,
R.3.5 Program obsługuje przynajmniej jedno zdarzenie kliknięcia przycisku w sposób właściwy dla danego środowiska programistycznego. Wystarczy, że kontrolka przycisku jest odpowiednio powiązana ze zdarzeniem
R.3.6 Program odwołuje się do kontrolek w sposób właściwy dla danego środowiska programistycznego. Wystarczy, że zastosowano poprawnie dla jednej kontrolki
R.3.7 Po wciśnięciu przycisku RZUĆ KOŚĆMI wyświetlane są wylosowane liczby w postaci 5 obrazów kości, każdy obraz odpowiada wyrzuconej liczbie oczek (w uruchomionej aplikacji lub na zrzucie i obowiązkowo w kodzie)
ok. 4 min
Polecenie z arkusza
Do wykonania aplikacji można wykorzystać fragmenty kodu z aplikacji konsolowej. Dla uproszczenia aplikacji, gra odbywa się zawsze na pięciu kościach. Po wciśnięciu przycisku „RZUĆ KOŚĆMI” (obraz 5): Losowanych jest 5 liczb z zakresu od 1 do 6, które są wyświetlone w postaci pięciu obrazów kości.
Kliknięcie wiążesz w XAML atrybutem Clicked="OnRollClicked" (R.3.5). Visual Studio podpowiada wtedy Nowa procedura obsługi zdarzeń i dopisuje do kodu metodę o nagłówku void OnRollClicked(object? sender, EventArgs e): sender to kliknięty przycisk, e - dane zdarzenia.
Do kontrolek odwołujesz się wprost po nazwach z x:Name - Die1 ... Die5 są polami klasy, które kompilator tworzy z pliku XAML (R.3.6). Zbierasz je w tablicy diceImages w konstruktorze, po InitializeComponent() (wcześniej pola są puste). Zapis [Die1, Die2, ...] to wyrażenie kolekcji z C# 12.
W metodzie losujesz pięć liczb jak w konsoli i każdej kontrolce podajesz obraz o nazwie z liczbą oczek: $"k{dice[i]}.jpg" - dla trójki k3.jpg (R.3.7). Napis z nazwą pliku MAUI sam zamienia na obraz. Kliknij w podglądzie „RZUĆ KOŚĆMI”.
Typowe błędy
Literówka w Clicked="OnRolClicked" nie przechodzi kompilacji (brak metody o tej nazwie) - inaczej niż w Androidzie, gdzie błąd w android:onClick wychodzi dopiero przy kliknięciu.
Kosci/MainPage.xamlXAMLzmienione: 1 linia
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"BackgroundColor="Beige"><VerticalStackLayout><LabelText="Gra w kości. Autor Bartosz Bryniarski"FontSize="24"BackgroundColor="Brown"TextColor="White"Padding="10"Margin="0,10"HorizontalTextAlignment="Center"/><ButtonText="RZUĆ KOŚĆMI"Clicked="OnRollClicked"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/><HorizontalStackLayoutBackgroundColor="White"Margin="0,10"><Imagex:Name="Die1"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die2"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die3"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die4"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die5"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/></HorizontalStackLayout><Labelx:Name="RollResultLabel"Text="Wynik tego losowania: "HorizontalTextAlignment="Center"Margin="0,10"/><Labelx:Name="GameResultLabel"Text="Wynik gry: "HorizontalTextAlignment="Center"Margin="0,10"/><ButtonText="RESETUJ WYNIK"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/></VerticalStackLayout></ContentPage>
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 18: Punkty za rzut i wynik gry w napisach
Kryteria:
R.3.8 Po wciśnięciu przycisku RZUĆ KOŚĆMI wyświetlana jest liczba punktów za wykonany rzut (kryterium poprawne również, gdy algorytm nieprawidłowo zaimplementowany) oraz wyświetlany jest wynik gry, który jest powiększony o wynik aktualnego rzutu (w uruchomionej aplikacji lub na zrzucie i obowiązkowo w kodzie)
ok. 3 min
Polecenie z arkusza
Obliczana jest suma punktów dla rzutu kośćmi zgodnie z algorytmem podanym w opisie aplikacji konsolowej oraz wynik wyświetlany jest w napisie z wynikiem losowania. Wynik gry jest powiększany o obliczony wynik rzutu i wyświetlany w napisie z wynikiem gry.
Funkcję CountPoints kopiujesz z konsoli bez zmian - to ten sam język. W klasie strony jest prywatną metodą statyczną (static - nie korzysta z pól strony).
Wynik gry musi przetrwać między kliknięciami, więc trzymasz go w polu gameScore, a nie w zmiennej lokalnej metody. Po rzucie dodajesz punkty i wpisujesz oba wyniki we właściwość Text etykiet (R.3.8). Kliknij kilka razy „RZUĆ KOŚĆMI” - wynik gry rośnie (obraz 5).
Typowe błędy
int gameScore = 0; wewnątrz OnRollClicked zeruje wynik przy każdym kliknięciu - wynik gry zawsze równa się wynikowi ostatniego rzutu (R.3.8).
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 19: RESETUJ WYNIK: znaki zapytania i zera
Kryteria: ,
R.3.9 Po wciśnięciu przycisku „RESETUJ WYNIK” zerowany jest wynik gry oraz wyświetlane są oba wyniki jako 0 (w uruchomionej aplikacji lub na zrzucie i obowiązkowo w kodzie)
R.3.5 Program obsługuje przynajmniej jedno zdarzenie kliknięcia przycisku w sposób właściwy dla danego środowiska programistycznego. Wystarczy, że kontrolka przycisku jest odpowiednio powiązana ze zdarzeniem
ok. 2 min
Polecenie z arkusza
Po wciśnięciu przycisku „RESETUJ WYNIK” (obraz 6): Pięć obrazów kości wypełnione zostaje grafiką question.jpg. Wynik całej gry jest resetowany do wartości 0. W napisach dotyczących wyniku losowania i wyniku gry jest zapisana wartość 0.
Druga metoda, podpięta atrybutem Clicked drugiego przycisku (R.3.5): pętla foreach przechodzi po wszystkich pięciu obrazach i wstawia question.jpg, pole gameScore dostaje 0, a oba napisy - wartość 0 (R.3.9). Obraz 6 pokazuje dokładnie ten stan.
Kosci/MainPage.xamlXAMLzmienione: 1 linia
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="Kosci.MainPage"BackgroundColor="Beige"><VerticalStackLayout><LabelText="Gra w kości. Autor Bartosz Bryniarski"FontSize="24"BackgroundColor="Brown"TextColor="White"Padding="10"Margin="0,10"HorizontalTextAlignment="Center"/><ButtonText="RZUĆ KOŚĆMI"Clicked="OnRollClicked"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/><HorizontalStackLayoutBackgroundColor="White"Margin="0,10"><Imagex:Name="Die1"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die2"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die3"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die4"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/><Imagex:Name="Die5"Source="question.jpg"WidthRequest="64"HeightRequest="64"Margin="9"/></HorizontalStackLayout><Labelx:Name="RollResultLabel"Text="Wynik tego losowania: "HorizontalTextAlignment="Center"Margin="0,10"/><Labelx:Name="GameResultLabel"Text="Wynik gry: "HorizontalTextAlignment="Center"Margin="0,10"/><ButtonText="RESETUJ WYNIK"Clicked="OnResetClicked"BackgroundColor="Chocolate"HorizontalOptions="Center"Margin="0,10"/></VerticalStackLayout></ContentPage>
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
Krok 20: Uruchomienie w emulatorze i folder mobilna
Kryteria: ,
R.3.10 Aplikacja kompiluje się i uruchamia w emulatorze, co udokumentowano zrzutem ekranu. Jej układ jest zgodny z obrazem 3 w arkuszu egzaminacyjnym
R.4.7 Zapisano przynajmniej jeden zrzut ekranu z uruchomienia lub kompilacji aplikacji mobilnej, na zrzucie widoczne jest środowisko, w którym powstała aplikacja
ok. 4 min
Polecenie z arkusza
Podejmij próbę kompilacji i emulacji aplikacji. W podfolderze mobilna powinno znaleźć się archiwum całego projektu o nazwie mobilna.zip, skopiowane z projektu plik (lub pliki) z kodem źródłowym interfejsu użytkownika (XAML lub XML) oraz plik źródłowy kodu skojarzonego z interfejsem użytkownika.
Uruchamiasz aplikację (F5) na emulatorze Androida. Zrzuty całego ekranu z Visual Studio i emulatorem: stan początkowy (obraz 3), po kilku rzutach (obraz 5) i po resecie (obraz 6) - w folderze dokumentacja (R.3.10, R.4.7).
W folderze mobilna: mobilna.zip z całym projektem Kosci (przed spakowaniem można usunąć foldery bin i obj - to wyniki budowania, archiwum będzie wielokrotnie mniejsze), MainPage.xaml i MainPage.xaml.cs.
Kroki 21-23 · po tym etapie masz 35 z 35 kryteriów (pkt)
Krok 21: Nagłówek funkcji CountPoints według listingu 1
Kryteria: , , , ,
R.4.1 Dla jednej z funkcji/metody z aplikacji konsolowej zapisano nagłówek w postaci komentarza zgodny z Listingiem 1 z arkusza egzaminacyjnego (nie liczymy gwiazdek), komentarz może być wieloliniowy lub kilka jednoliniowych lub Docstrings (potrójny cudzysłów) - w tym przypadku opis znajduje się pod nazwą funkcji
R.4.2 W komentarzu ujęto nazwę i opis działania funkcji / metody
R.4.3 W komentarzu ujęto nazwy i opis wszystkich parametrów funkcji / metody
R.4.4 W przypadku gdy funkcja / metoda zwraca wartość, ujęto w komentarzu opis tej wartości. W przeciwnym przypadku zapisano void, brak itp.
R.4.5 W komentarzu ujęto numer zdającego
ok. 4 min
Polecenie z arkusza
W kodzie źródłowym aplikacji konsolowej za pomocą komentarza utwórz nagłówek wybranej funkcji (metody) według wzoru z listingu 1. Komentarz powinien znaleźć się nad lub pod nazwą funkcji. W miejscu nawiasów <> należy podać odpowiednie opisy.
Komentarz wieloliniowy /* ... */ nad funkcją, z polami listingu 1 (R.4.1): nazwa i opis działania (R.4.2), parametr dice z opisem (R.4.3), zwracany typ int z opisem (R.4.4) i autor (R.4.5). Na egzaminie w polu autor wpisujesz numer PESEL - tu stoi Bartosz Bryniarski.
W C# jest też zwyczaj dokumentowania komentarzem XML /// (<summary>, <param>, <returns>), który Visual Studio pokazuje w podpowiedziach. Arkusz wymaga jednak układu z listingu 1 - trzymasz się wzoru.
konsola/Program.csC#zmienione: 10 linii
int count;do{ Console.WriteLine("Ile kostek chcesz rzucić? (3 - 10)");} while (!int.TryParse(Console.ReadLine(), out count) || count < 3 || count > 10);char answer;do{int[] dice = RollDice(count);for (int i = 0; i < dice.Length; i++) { Console.WriteLine($"Kostka {i + 1}: {dice[i]}"); } Console.WriteLine($"Liczba uzyskanych punktów: {CountPoints(dice)}"); Console.WriteLine("Jeszcze raz? (t/n)");string input = Console.ReadLine() ?? ""; answer = input.Length > 0 ? char.ToLower(input[0]) : 'n';} while (answer == 't');staticint[] RollDice(int count){int[] dice = newint[count];for (int i = 0; i < count; i++) { dice[i] = Random.Shared.Next(1, 7); }return dice;}/************************************************* nazwa: CountPoints opis: liczy punkty za rzut kośćmi - sumę oczek tych kości, których liczba oczek wypadła co najmniej dwa razy parametry: dice - tablica z liczbami oczek wyrzuconymi na kolejnych kościach zwracany typ i opis: int - liczba punktów za rzut autor: Bartosz Bryniarski*************************************************/staticintCountPoints(int[] dice){int points = 0;for (int i = 0; i < dice.Length; i++) {int repeats = 0;for (int j = 0; j < dice.Length; j++) {if (dice[j] == dice[i]) { repeats++; } }if (repeats >= 2) { points += dice[i]; } }return points;}
Wynik programu po tym kroku
> konsola.exe
Ile kostek chcesz rzucić? (3 - 10)
2
Ile kostek chcesz rzucić? (3 - 10)
5
Kostka 1: 2
Kostka 2: 5
Kostka 3: 6
Kostka 4: 1
Kostka 5: 5
Liczba uzyskanych punktów: 10
Jeszcze raz? (t/n)
t
Kostka 1: 1
Kostka 2: 3
Kostka 3: 2
Kostka 4: 1
Kostka 5: 2
Liczba uzyskanych punktów: 6
Jeszcze raz? (t/n)
T
Kostka 1: 4
Kostka 2: 1
Kostka 3: 1
Kostka 4: 3
Kostka 5: 2
Liczba uzyskanych punktów: 2
Jeszcze raz? (t/n)
n
Krok 22: Zrzuty konsoli i folder konsolowa
Kryteria: , ,
R.1.6 Podjęto próbę skompilowania lub interpretowania kodu, co udokumentowano zrzutem ekranowym przedstawiającym uruchomiony program ew. kompilację lub skrypt
R.2.7 Program kompiluje się i uruchamia w konsoli, co udokumentowano zrzutem ekranu. Pytanie o liczbę kostek jest powtarzane tak długo, aż zostanie podana liczba z zakresu 3..10 (sprawdzić dla granicznych: 2 i 11 oraz 3 i 10)
R.4.6 Zapisano przynajmniej jeden zrzut ekranu z uruchomienia lub kompilacji aplikacji konsolowej, na zrzucie widoczne jest środowisko, w którym powstała aplikacja
ok. 3 min
Polecenie z arkusza
Wykonaj zrzuty ekranu dokumentujące uruchomienie aplikacji utworzonych podczas egzaminu. Zrzuty powinny obejmować cały obszar ekranu monitora z widocznym paskiem zadań. W podfolderze konsolowa powinno znaleźć się archiwum całego projektu o nazwie konsola.zip, skopiowany z projektu plik z kodem źródłowym programu oraz plik wykonywalny, jeżeli istnieje.
Uruchamiasz program w Visual Studio (Ctrl+F5): zła liczba kostek, potem poprawna, kilka rzutów z „t” i „n” na końcu. Zrzut całego ekranu z oknem konsoli, Visual Studio i paskiem zadań - do folderu dokumentacja (R.1.6, R.2.7, R.4.6).
W folderze konsolowa: konsola.zip (spakowany po dopisaniu komentarza), Program.cs i plik wykonywalny konsola.exe z bin\Debug\net8.0 (C# tworzy plik .exe, więc go dołączasz; obok niego leży konsola.dll, bez którego .exe się nie uruchomi - kopiujesz oba).
Wynik programu po tym kroku
> konsola.exe
Ile kostek chcesz rzucić? (3 - 10)
11
Ile kostek chcesz rzucić? (3 - 10)
3
Kostka 1: 2
Kostka 2: 2
Kostka 3: 5
Liczba uzyskanych punktów: 4
Jeszcze raz? (t/n)
t
Kostka 1: 4
Kostka 2: 4
Kostka 3: 1
Liczba uzyskanych punktów: 8
Jeszcze raz? (t/n)
n
Krok 23: Dokument egzamin
Kryteria:
R.4.8 Dokumentacja zawiera nazwy: systemu operacyjnego, środowisk programistycznych, emulatora oraz języków programowania
ok. 2 min
Polecenie z arkusza
W edytorze tekstu pakietu biurowego utwórz plik z dokumentacją i nazwij go egzamin. Dokument powinien zawierać nazwy: systemu operacyjnego, środowisk programistycznych, emulatora oraz języków programowania.
W Wordzie albo Writerze dokument egzamin w folderze dokumentacja z systemem, środowiskiem, emulatorem i językami (R.4.8). Plik obok to treść tekstowa dokumentu.
egzamin.txtTekstnowy plik
System operacyjny: Windows 11Środowisko programistyczne: Visual Studio (aplikacja konsolowa i aplikacja .NET MAUI)Emulator: Android Emulator - Pixel 8 (Android 16, API 36)Języki programowania: C# (aplikacja konsolowa i mobilna), XAML (wygląd aplikacji mobilnej)
Kroki 24-25 · po tym etapie masz 35 z 35 kryteriów (pkt)
Krok 24: Te same kryteria, inny zapis
ok. 3 min
Polecenie z arkusza
Zastosowany obiektowy język programowania zgodny z zainstalowanym na stanowisku egzaminacyjnym: C++ lub C#, lub Java, lub Python.
Co robi to samo, a wygląda inaczej:
wymaganie
C# + .NET MAUI
Java + Android
układ pionowy i poziomy
VerticalStackLayout, HorizontalStackLayout
LinearLayout z orientation
pięć obrazów na szerokość
rozmiar policzony do ekranu
layout_width="0dp" + layout_weight="1"
kolor przycisku
BackgroundColor="Chocolate"
backgroundTint="#D2691E"
kliknięcie
Clicked="OnRollClicked"
android:onClick="rollDice"
dostęp do kontrolki
pole z x:Name
findViewById(R.id.die1)
obraz w kodzie
Source = "k3.jpg"
setImageResource(R.drawable.k3)
Najważniejsza różnica na egzaminie: w MAUI błąd w nazwie metody zdarzenia albo kontrolki wychodzi przy kompilacji, w Androidzie z android:onClick - dopiero po kliknięciu, w działającej aplikacji. Za to Android dzieli szerokość wagami sam, a w HorizontalStackLayout rozmiar trzeba policzyć.
Za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym wykonaj aplikację mobilną do gry w kości.
Klucz ocenia oba środowiska tymi samymi kryteriami, więc wybór zależy od tego, co znasz:
C# + .NET MAUI - jeden język na całe zadanie; funkcję CountPoints przenosi się do aplikacji przez skopiowanie. Pierwsze budowanie projektu MAUI na Androida trwa kilka minut (kolejne - kilkanaście sekund) - warto uruchomić emulator i zbudować pusty projekt zaraz na początku egzaminu.
Java + Android Studio - szablon Empty Views Activity i XML z podglądem w edytorze; na stanowiskach to najczęstsze środowisko mobilne.
Uwaga na emulator: Visual Studio i Android Studio korzystają z tego samego Android Emulatora, a nazwę urządzenia (tu Pixel 8) wpisujesz do dokumentu egzamin.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.
Autor rozwiązania: Bartosz Bryniarski. Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.