![]() |
Wyjście Spis treści Poprzedni Następny
Autor: mgr Jerzy Wałaszek, wersja 3.0 |
©2008 mgr
Jerzy Wałaszek
|

Twórcą gry był 16 letni uczeń liceum - Wadim Gierasimow. Gra powstała w roku 1985 i zdobyła olbrzymią popularność na całym świecie. Można rzec, iż jej popularność nie wygasła do dnia dzisiejszego. Wciąż w sieci znajdujemy witryny oferujące rozgrywkę bezpośrednio w przeglądarce WWW. Również grę Tetris spotykamy w wielu różnych odmianach na automatach do gier - ostatnio także w telefonach komórkowych. Zasady gry są bardzo proste, pomimo to gra jest niezwykle wciągająca i ciekawa. Osiągnięcie sprawności wymaga zarówno refleksu jak i szybkiego, logicznego myślenia z elementami przewidywania skutków obecnego ruchu.
Rozgrywka dokonywana jest na prostokątnej planszy podzielonej na 22 wiersze po
10 pól w każdym. Z góry planszy spadają w dół figury złożone z czterech
przyległych do siebie kwadratów. Figury są wybierane losowo z 7 typów - obok
planszy wyświetlana jest zwykle informacja o następnej figurze, którą gracz
będzie grał w kolejnym ruchu.
. . . . . . . . . . . . . . . . . . .. . . . . . . . . .. |
Gracz może spadającą figurę obracać wokół jej osi (przeciwnie
do wskazówek zegara), przesuwać w prawo, w lewo i w dół oraz upuszczać.
Po upadku nie można już zmienić położenia figury. Figury znajdujące się na dnie
planszy zapełniają wiersze. Jeśli wiersz jest w całości zapełniony, to zostanie
usunięty, a kwadraty leżące nad nim przesuną się w dół.
Gra kończy się, gdy nowa figura nie może zostać wprowadzona na
planszę, ponieważ brak dla niej miejsca. Za każdy usunięty wiersz gracz
otrzymuje odpowiednią liczbę punktów:
| Punkty | Opis |
|---|---|
| 1 | za każdy wiersz spadku figury po upuszczeniu jej |
| 5 | za postawienie figury na spodzie planszy gry |
| 50 | za usunięcie pojedynczego wiersza |
| 150 | za usunięcie naraz dwóch wierszy |
| 300 | za usunięcie naraz trzech wierszy |
| 600 | za usunięcie naraz czterech wierszy |
| 2500 | za zaliczenie poziomu, czyli zbicie 50 wierszy |
Po zaliczeniu 25 wierszy następuje zmiana poziomu. Na każdym poziomie figury
spadają szybciej, zatem gracz ma mniej czasu na zastanowienie się i ułożenie
spadającej figury. Poziomów jest 9. Ostatni to poziom dla samobójców. Figury
spadają bardzo szybko i tylko tytani tej gry potrafią tutaj wytrwać.
Ponieważ jako środowisko pracy tworzonych programów wybraliśmy okno konsoli znakowej, nasza wersja Tetris nie będzie zbytnio atrakcyjna graficznie, jednakże grywalność pozostanie taka sama. W grze musimy reprezentować planszę oraz figury. Potrzebujemy dla nich odpowiednich struktur danych.
Planszę zrealizujemy w formie tablicy 24 łańcuchów znakowych. Każdy łańcuch ma długość 14 znaków - 10 na pole gry oraz po dwa znaki na barierkę ograniczającą. Plansza na początku gry ma następującą zawartość:
p[1] := 'XX XX'; p[2] := 'XX XX'; ... p[22] := 'XX XX'; p[23] := 'XXXXXXXXXXXXXX'; p[24] := 'XXXXXXXXXXXXXX'; |
Spuszczane figury nie są wpisywane od razu na planszę, lecz dopiero po
usadowieniu się na dnie. Wtedy stają się one częścią planszy i ograniczają
swobodę ruchów następnych figur biorących udział w grze.
W grze bierze udział 7 różnych figur. Każda z nich może znajdować się w jednym z 4 obrotów. Figura zrealizowana jest w formie 4 elementowej tablicy łańcuchów znakowych. Każdy łańcuch zawiera 16 znaków i definiuje jeden wiersz obrazu figury. Kolejne cztery obrazy obrotów zapisane są w 4 znakowych porcjach wewnątrz łańcucha.
wiersz[1] := 'XXX XX X'; wiersz[2] := ' X X X X'; wiersz[3] := ' X XXX XX'; wiersz[4] := ' '; |
Porcje te pokolorowaliśmy na powyższym rysunku odpowiednimi kolorami tła. Sama
figura będzie zdefiniowana za pomocą
Zwróć uwagę, iż definicja figury nie zawiera jej koloru tylko sam kształt. Kolor definiowany będzie losowo w trakcie gry, dzięki temu zwiększy się wizualna różnorodność figur uczestniczących w grze.
Kolejne obroty dobrane są, tak aby otrzymać wrażenie obrotu
figury przeciwnie do ruchów wskazówek zegara. Figury zgrupowane są w tablicy
type
figura = array[1..4] of string[16];
const
zestaw : array[1..7] of figura = (
('XXXX X X ',
' X X ',
' X XXXX X ',
' X X '),
('XXX X XX ',
'X X X X ',
' XX XXX X ',
' '),
('XXX XX X ',
' X X X X ',
' X XXX XX ',
' '),
(' XX X XX X ',
'XX XX XX XX ',
' X X ',
' '),
('XX X XX X ',
' XX XX XX XX ',
' X X ',
' '),
('XXX X X ',
' X XX X XX ',
' X XXX X ',
' '),
('XX XX XX XX ',
'XX XX XX XX ',
' ',
' ')); |
Mając numer figury i numer jej obrotu możemy w prosty sposób wydzielić z tablicy
zestaw[] kształt figury. Dokonujemy tego następująco:
var ksztalt : array[1..4] of string[4]; ... for nr_wiersza := 1 to 4 do ksztalt[nr_wiersza] := Copy(zestaw[nr_figury][nr_wiersza],1 + 4 * (nr_obrotu - 1),4); ... |
Jeśli wiersz planszy zostanie zapełniony fragmentami figur, to należy go usunąć. Usunięcie to polega na przemieszczeniu treści pola gry znajdującej się ponad usuwanym wierszem w dół o jedną linijkę. Do wykonania tego zadania wykorzystamy wewnętrzne mechanizmy biblioteki Win32 API. Przygotowałem następującą procedurę:
procedure PrzesunOkno(xp,yp,xk,yk,attr : integer);
var
Standardowe_Wyjscie : HANDLE ;
Prostokat_Przewijania,
Prostokat_Ograniczenia : SMALL_RECT ;
Struktura_Wypelniania : CHAR_INFO ;
Wspolrzedne_Przesuniecia : COORD ;
begin
Standardowe_Wyjscie := GetStdHandle(STD_OUTPUT_HANDLE);
Prostokat_Przewijania.Top := yp - 1;
Prostokat_Przewijania.Bottom := yk - 1;
Prostokat_Przewijania.Left := xp - 1;
Prostokat_Przewijania.Right := xk - 1;
Wspolrzedne_Przesuniecia.X := xp - 1;
Wspolrzedne_Przesuniecia.Y := yp;
Prostokat_Ograniczenia := Prostokat_Przewijania;
Struktura_Wypelniania.Attributes := attr;
Struktura_Wypelniania.AsciiChar := ' ';
ScrollConsoleScreenBuffer(Standardowe_Wyjscie, Prostokat_Przewijania, Prostokat_Ograniczenia,
Wspolrzedne_Przesuniecia, Struktura_Wypelniania);
end; |
Do procedury podajemy współrzędne prostokątnego obszaru okna konsoli, którego
treść zostanie przesunięta o jeden wiersz w dół. Po przesunięciu ostatni wiersz
zostaje zapisany wierszem poprzednim, a pierwszy wiersz będzie wypełniony
spacjami w kolorze attr.
![]() | 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