![]() |
Wyjście Spis treści Poprzedni Następny
Autor: mgr Jerzy Wałaszek, wersja 3.0 |
©2008 mgr
Jerzy Wałaszek
|
![]() 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. |
|
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ć.
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
\|||/ - - - - \|||||| ||||\ - - \|||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:
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; |
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?
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 | / | - | / | - | | | \ | - | \ | \ | - | \ | | | | | / | | | / |
![]() | I Liceum Ogólnokształcące |
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