Mini Master Mind - algorytm


Podrozdziały:

 

Blok główny

Symbol Przeznaczenie w algorytmie
z kod 4 kolorowy generowany przez komputer
runda zlicza kolejne rundy rozgrywki
t kod 4 kolorowy podawany przez gracza
obrazek

Grę rozpoczynamy od wygenerowania przez komputer 4-ro kolorowego kodu. Operację tę opisujemy poniżej. Kod kolorów komputera umieszczany jest w czteroelementowej tablicy z. Ustawiamy numer pierwszej rundy i rozpoczynamy pętlę główną gry.

W pętli odczytujemy kod gracza. Tę operację również dokładnie omawiamy poniżej, ponieważ zastosujemy w tym punkcie algorytmu specjalny edytor kodu kolorów. Kod kolorów gracza umieszczany jest w czteroelementowej tablicy t.

Oceniamy kod wprowadzony przez gracza. Operacja jest złożona i opisujemy ją poniżej. W wyniku oceny gracz otrzymuje informację o ilości trafionych kolorów za pomocą pionów białych (kolor nie na swoim miejscu) oraz czarnych (kolor na swoim miejscu).

Jeśli kod t zgadza się z kodem komputera z, gracz odgadł kod z, zatem kończymy rozgrywkę wypisując na ekranie gratulacje. Wypisujemy również kod komputera, aby gracz mógł porównać sobie swoje ruchy i otrzymane odpowiedzi. W dalszej kolejności przechodzimy do końcowego etapu gry.

Jeśli kod t nie jest równy kodowi z, zwiększamy numer rundy o 1. Jeśli numer ten jest większy od 6, to gracz wyczerpał wszystkie kolejki i grę kończymy wypisując kod z, którego graczowi nie udało się odgadnąć.

Na końcu gry komputer zadaje pytanie, czy gracz chce zakończyć grę. Jeśli otrzyma odpowiedź potwierdzającą, gra zostaje zakończona. W przeciwnym razie następuje powrót na początek gry do generacji kodu kolorów z.

Generacja kodu z

Symbol Przeznaczenie w algorytmie
i zmienna licznikowa pętli
zi i-ty element czteroelementowej tablicy liczb całkowitych z0,z1,z2 i z3.
random(n) funkcja pseudolosowa, która zwraca liczbę pseudolosową z zakresu od 0 do n-1.
obrazek

Kod kolorów z (również t) zrealizujemy w pamięci komputera w formie czteroelementowej tablicy liczb całkowitych ponumerowanych od 0 do 3. Kolory będą kodowane kolejnymi liczbami od 0 do 5 wg poniższej tabelki:

 

0 1 2 3 4 5
                             

 

Wygenerowanie kodu z będzie zatem polegało na wypełnieniu tej tablicy liczbami pseudolosowymi z zakresu od 0 do 5. Dokonujemy tego w prostej pętli iteracyjnej sterowanej zmienną i.

Odczyt kodu t

Symbol Przeznaczenie w algorytmie
i zmienna licznikowa pętli
ti i-ty element czteroelementowej tablicy liczb całkowitych t0,t1,t2 i t3.
x pozycja kursora określająca, który z elementów tx będzie podlegał zmianie
c przechowuje kod naciśniętego klawisza.
mod operacja modulo, czyli reszta z dzielenia całkowitoliczbowego.
obrazek

obrazek

 

Kod t gracza będziemy odczytywać za pomocą specjalnego edytora. Dzięki temu unikniemy konieczności sprawdzania poprawności kodu gracza. Z drugiej strony gracz nie musi znać sposobu reprezentacji kolorów kodu w pamięci komputera.

Na początku inicjujemy tablicę t ustawiając wszystkie jej elementy na 0. Operację tę realizujemy w prostej pętli iteracyjnej sterowanej zmienną i.

Zmienna x przechowuje numer elementu tablicy t, który w danym momencie możemy edytować. Przed wejściem do pętli edycyjnej ustawiamy ją na pierwszy element.

Na początku pętli edycyjnej wyświetlamy zawartość tablicy t w postaci kwadratów o odpowiednich kolorach. Kwadrat o numerze x powinien być wyróżniony za pomocą kursora. W naszym programie wokół tego kwadratu zostanie wyrysowana czerwona ramka.

Oczekujemy na naciśnięcie klawisza, którego kod umieszczamy w zmiennej c. Bezpośrednio po naciśnięciu klawisza usuwamy kursor, czyli ramkę z ekranu. W programie zrealizujemy procedurę wyświetlającą treść tablicy t, której jeden z parametrów będzie sterował rysowaniem kursora. Za pierwszym razem wywołamy tę procedurę z wartością parametru true - kursor zostanie narysowany. Za drugim razem wywołanie będzie z wartością parametru false, czyli kursora po prostu nie będzie. Ponieważ są to szczegóły implementacyjne, nie będziemy się nimi martwić na etapie projektowania algorytmu.

Teraz nadeszła pora na przeanalizowanie odczytanego kodu klawisza. Nasz edytor reaguje jedynie na klawisze kursora oraz klawisz Enter. Jeśli został naciśnięty klawisz ze strzałką w lewo lub w prawo, to dokonujemy odpowiedniej modyfikacji zmiennej x, czyli pozycji edytowanego elementu. Zwróć uwagę, iż podane operacje odpowiednio zwiększają lub zmniejszają zawartość zmiennej x o 1. Co ciekawe, wartość zmiennej x nigdy nie wykracza poza zakres od 0 do 3 - o to właśnie chodziło.

W przypadku naciśnięcia klawiszy ze strzałkami w górę lub w dół modyfikujemy zawartość tablicy t. Jest ona również zwiększana lub zmniejszana o 1. Stosujemy identyczną sztuczkę z operacją modulo, dzięki temu wartość elementu tx nigdy nie wykroczy poza dopuszczalny zakres od 0 do 5.

Po wykonaniu dowolnej z tych operacji algorytm wraca na początek pętli. Jeśli naciśniętym klawiszem nie był żaden z klawiszy kursora, to następuje ostatni test - sprawdzenie, czy gracz zatwierdził ustawiony kod klawiszem Enter. Jeśli nie, pętla edycyjna jest kontynuowana. W przeciwnym razie wychodzimy z niej i kończymy edycję tablicy t - jest ona ustawiona wg życzeń gracza.

Ocena kodu t

Symbol Przeznaczenie w algorytmie
kz,kt kopie tablic z i t
czarne zlicza elementy na właściwych pozycjach
biale zlicza elementy o zgodnym kolorze
i,j zmienne sterujące pętli
obrazek

Ponieważ algorytm oceniania kodu gracza musi zmieniać zawartość badanych tablic (dla prostoty tak jest najlepiej), tworzymy sobie lokalne kopie tablicy z w zmiennej kz i tablicy t w zmiennej kt.

Zmienna czarne będzie zliczać elementy w t, które są dokładnie równe elementom w z na tych samych pozycjach, czyli odgadnięte kolory w kodzie t na dobrych pozycjach.

W tym celu w pętli porównujemy kolejno i-ty element tablicy kt z i-tym elementem tablicy kz. Jeśli są równe, zwiększamy o 1 licznik czarne. Aby w dalszej fazie nie zaliczać ponownie tych elementów, nadajemy im wartości, które nie odpowiadają żadnym kolorom. Dzięki temu wypadną one z dalszej ewaluacji.

Po zakończeniu pętli nr 1, zmienna czarne zawiera liczbę kolorów kodu na właściwych pozycjach. Teraz przechodzimy do drugiej fazy ewaluacji, która ma na celu określenie liczby kolorów zgodnych, lecz na niewłaściwych pozycjach. Kolory te będziemy zliczać w zmiennej biale, której na początku nadajemy wartość 0.

Rozpoczynamy pętlę nr 2. Porównuje ona w pętli wewnętrznej nr 3 kolejne elementy kt ze wszystkimi elementami kz. Jeśli znajdzie zgodność, zwiększa o 1 zmienną biale i usuwa te elementy z ewaluacji nadając im wartości nieistniejących kolorów. Dzięki temu elementy nie będą ponownie zliczane.

Po zakończeniu pętli nr 2 zmienna czarne zawiera liczbę trafionych kolorów na dobrych pozycjach, a biale zawiera liczbę trafionych kolorów, lecz na niewłaściwych pozycjach. Operacja Pisz polega na wyświetleniu obok kodu gracza odpowiedniej liczby czarnych i białych gwiazdek, co wykonujemy w prostych pętlach.
 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe