Domino - opis


Podrozdziały:

 


Widok oryginalnej planszy gry Domino z konsoli ATARI

Wbrew nazwie nie jest to gra w Domino. W latach 70-tych ubiegłego wieku w firmie Atari, specjalizującej się w produkcji maszyn do gier zręcznościowych, powstała gra video o takiej właśnie nazwie.

Gra toczy się na planszy zbudowanej z 22 wierszy po 76 kolumn. W rozgrywce uczestniczy dwóch graczy (jeden z nich może być komputerem). Prawy gracz dysponuje białymi kośćmi domina, a lewy gracz czarnymi. Gracze naprzemian sterują kierunkiem układania swoich kości. Gra toczy się dotąd, aż jeden z graczy (lub obaj równocześnie) uderzy w dowolną przeszkodę. Wtedy ułożone przez gracza kości przewracają się, dając ciekawy efekt walącego się domina. W grze mamy 12 rund. Wygrywa gracz, który osiągnie więcej wygranych rozgrywek.

Strategia w tej grze polega na zamykaniu wolnej drogi przeciwnikowi. Jeśli uda nam się go otoczyć swoimi kośćmi domina, to przeciwnik musi przegrać, pod warunkiem, że mamy wystarczającą przestrzeń na własne kości.

Koncepcyjnie gra jest bardzo podobna do zaprezentowanej w poprzednim rozdziale gry Wąż. Również tutaj musimy zapamiętywać położenie poszczególnych kostek na planszy, aby po zderzeniu zrealizować efekt walącego się domina. Jednakże zapamiętane pozycje będziemy pobierać w kierunku odwrotnym do ich zapisu. Struktura o takiej własności nosi nazwę stosu.

Stos, podobnie jak kolejka, tworzony jest w n-elementowej strukturze danych. Do operacji na stosie potrzebujemy tylko jednego wskaźnika (w kolejce potrzebne były dwa - początku i końca kolejki). Umówmy się, iż wskaźnik stosu wskazuje zawsze na wolne miejsce na stosie. W poniższej tabelce definiujemy dwie podstawowe operacje ze stosem, zapis i odczyt danych.

 

Definicje operacji zapisu i odczytu danej ze stosu
Zapis na stos Odczyt ze stosu
stos[ws] := dana;
ws       := ws + 1;
ws   := ws - 1
dana := stos[ws];

stos - n-elementowa struktura, wewnątrz której zrealizowany jest stos.
ws - wskaźnik stosu, czyli indeks elementu w strukturze stos
dana - dane zapisywane lub odczytywane ze stosu

 

Zauważ, iż wskaźnik stosu nie jest przewijany tak jak wskaźniki kolejki cyklicznej. Struktura zawierająca stos powinna posiadać wystarczająco dużo elementów, aby pomieścić wszystkie dane, które chcemy na stosie umieszczać.

 

Sterowanie układaniem kostek domina

Ponieważ zdecydowaliśmy się na aplikacje konsoli, zatem kostki domina musimy utworzyć z dostępnych znaków. Wykorzystamy do tego celu znak | (kod 124) dla kostek układanych poziomo oraz znak minus - dla kostek układanych pionowo. Przy zmianie kierunku układania zastosujemy odpowiednio znaki / i \. Początek układania symbolizuje znak X - w oryginalnej grze były w tym miejscu strzałki. Całość wygląda na ekranie następująco:


       \|||/
       -   -
       -   -  \||||||
   ||||\   -  -
 \|||X     -  - 
 -X||||||||\  -
 /||||||||||||\

 

Oczywiście pewna doza wyobraźni jest jak najbardziej wskazana. Na pewno oryginał był lepszy. Nie przejmujmy się tym zbytnio - nasz cel to nauka programowania a nie tworzenie super gry Domino.

Kierunkiem układania kostek domina sterujemy, podobnie jak w poprzednio opisanej grze Wąż, za pomocą klawiszy kursora. Układania kostek gracz nie może zatrzymać, dlatego w przypadku braku miejsca gra szybko zakończy się uderzeniem w przeszkodę.  Np. w sytuacji jak wyżej gracz czarny przegrywa i jego kości wywrócą się:


       -\\\|
       /   \
       /   \  \||||||
   \\\\-   \  -
 \||||X    \  - 
 -X////////|  -
 /||||||||||||\

 

Trochę bardziej skomplikowany jest przypadek sterowania układaniem kostek komputera. Odpowiedni algorytm wygrywający w tę grę zostawmy sekcji problemów dla ambitnych. My wykorzystamy liczby pseudolosowe. Dla gracza komputerowego będziemy losować dwie wartości:

  1. Długość ruchu w zakresie od 1 do 10 posunięć.
  2. Kierunek ruchu 0 - w górę, 1 w prawo, 2 w dół, 3 w lewo.

Pierwszy punkt nie wymaga wyjaśnień. Natomiast przy generacji kierunku ruchu musimy utworzyć listę możliwych kierunków, a następnie wybrać losowo jeden z elementów tej listy. Jeśli lista jest pusta (bo gracz zapędził nasz komputer w kozi róg), to nie ma znaczenia, jaki kierunek wybierzemy, gdyż komputer i tak przegra. W trakcie wykonywania ruchu przez komputer długość jest zmniejszana o 1 i gdy osiągnie 0, cały proces powtarza się. Da to złudzenie, iż komputer kieruje ruchami swojego domina (faktycznie to będzie robił, tyle że bezrozumnie). Dodatkowo musimy sprawdzać, czy ruch w danym kierunku jest jeszcze możliwy (komputer napotyka przeszkodę). Jeśli nie, to znów generujemy nową długość i kierunek ruchu.

W trakcie gry wystąpi potrzeba odczytywania zawartości okienka konsoli na danych współrzędnych (np. w celu wykrycia zderzenia z przeszkodą). Problem ten rozwiązaliśmy w poprzedniej grze Wąż tworząc funkcję Znak_na_pozycji(p : COORD) o następującej definicji:

 

function Znak_na_pozycji(p : COORD) : char;
var
  c : char;
  k : integer;
begin
  dec(p.x); dec(p.y); // Dostosowujemy współrzędne
  ReadConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),
                             addr(c),1,p,k);
  Result := c;
end;


Wyświetlanie kostek domina

Kostki mogą być układane w jednym z 4 kierunków. Przy kierunku poziomym lub pionowym będziemy po prostu wyświetlali kreseczki pionowe lub poziome. Jednakże przy zmianie kierunku układania należy wyświetlić kreseczkę ukośną. Zastanówmy się teraz nad regułami rządzącymi wyświetlaniem kostek:

Reguły wyświetlania kostek domina
ruch w górę
0:0 (kod 0)
ruch w prawo
1:1 (kod 5)
ruch w dół
2:2 (kod 10)
ruch w lewo
3:3 (kod 15)
X
-
-
-
|||X -
-
-
X
X|||
w górę i w prawo
0:1 (kod 1)
w prawo i w górę
1:0 (kod 4)
w dół i w prawo
2:1 (kod 9)
w lewo i w górę
3:0 (kod 12)
\||X
-   
-   
-   
   X
   -
   -
|||
\
-   
-   
-   
/||
X
X   
-   
-   
/|||
w górę i w lewo
0:3 (kod 3)
w prawo i w dół
1:2 (kod 6)
w dół i w lewo
2:3 (kod 11)
w lewo i w dół
3:2 (kod 14)
X||/
   -
   -
   -
|||/
   -
   -
   
X
   -
   -
   -
X||
\
\|||
-   
-   
X   

 

Jeśli dokładnie przeanalizujesz powyższą tabelkę, to dojdziesz do wniosku, iż rodzaj znaku zależy od kierunku układania poprzedniej kostki domina oraz bieżącej. Kierunkom przypiszmy następujące wartości:

kod kierunek
0 w górę
1 w prawo
2 w dół
3 w lewo

 

Dla każdej możliwej sytuacji podaliśmy w tabelce kody kierunku układania poprzedniej kostki i kostki bieżącej rozdzielone dwukropkiem. Następnie na ich podstawie wyznaczyliśmy kod wg wzoru:

 

  kod := kierunek_poprzedni * 4 + kierunek_bieżący;

 

Kod ten posłuży do określania wyświetlanego znaku dla kostki (również będzie przydatny za chwilkę, gdy przejdziemy do wyświetlania przewróconych kostek domina). Poniżej w tabelce ujęliśmy odpowiednie zależności:

Znaki dla kostek domina
Znak Wyświetlany dla kodów
| 5 15
- 0 10
/ 3 6 9 12
\ 1 4 11 14

 

Mając te informację moglibyśmy obliczać kod na podstawie kierunku układania kostek domina w poprzedniej kolejce i obecnie, sprawdzać wynik i wyświetlać w zależności od niego odpowiedni znak. Takie podejście, chociaż poprawne i narzucające się początkowo, jest jednak zbyt skomplikowane. My zrobimy inaczej - przygotujemy zmienną łańcuchową o długości 16 znaków. Znaki w takiej zmiennej posiadają indeksy od 1 do 16. Załóżmy teraz, iż indeks znaku jest naszym kodem zwiększonym o 1, a sam znak jest kostką domina, którą dla tego kodu należy wydrukować. Zawartość zmiennej może być następująca:

indeks 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
znak  -   \   X   /   \   |   /   |   X   /   -   \   /   |   \   | 

 

Literkami X oznaczyliśmy pozycje, które nigdy nie wystąpią (oznaczają one przypadki zderzenia kostek domina z samymi sobą np. przy ruchu wstecznym).

Teraz wystarczy wyliczyć kod i wyświetlić znak z tej zmiennej znajdujący się na pozycji kod + 1. Prawda, że jest to prostsze?

 

Animacja walących się kostek domina

Prędzej czy później jednemu z graczy skończy się miejsce i uderzy głowicą stawiającą kostki w przeszkodę. Wtedy wyświetlimy specjalny efekt walących się kostek domina. Aby był on w miarę realistyczny, musimy rozważyć kierunki układania kostek, podobnie jak w przypadku wyświetlania kostek przy układaniu. Kostki walą się zawsze w kierunku odwrotnym do ich układania (odpowiednie elementy będziemy pobierali ze stosu). Poniżej przedstawiamy tabelkę ze znakami, które należy wyświetlić w zależności od kodów kierunkowych. Kody kierunkowe odnoszą się do etapu układania kostek - będą one zapamiętywane na stosie wraz ze współrzędnymi kostki. 

Reguły wyświetlania walących się kostek domina
ruch w górę
0:0 (kod 0)
ruch w prawo
1:1 (kod 5)
ruch w dół
2:2 (kod 10)
ruch w lewo
3:3 (kod 15)
X
/
/
-
|\\X -
\
\
X
X//|
w górę i w prawo
0:1 (kod 1)
w prawo i w górę
1:0 (kod 4)
w dół i w prawo
2:1 (kod 9)
w lewo i w górę
3:0 (kod 12)
-\\X
-   
-   
-   
   X
   /
   /
|||
|
-   
-   
-   
-\\X
X   
/   
/   
||||
w górę i w lewo
0:3 (kod 3)
w prawo i w dół
1:2 (kod 6)
w dół i w lewo
2:3 (kod 11)
w lewo i w dół
3:2 (kod 14)
X//-
   -
   -
   -
|||-
   \
   \
   
X
   -
   -
   -
X
//
|
||||
/   
/   
X   
w górę i w dół
0:2 (kod 2)
w prawo i w lewo
1:3 (kod 7)
w dół i w górę
2:0 (kod 8)
w lewo i w prawo
3:1 (kod 13)
/
/
/
\\\ \
\
\
///

 

I zawartość zmiennej łańcuchowej:

 

indeks 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
znak  /   -   /   -   |   \   -   \   \   -   \   |   |   /   |   / 


List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



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

©2017 mgr Jerzy Wałaszek

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