Tetris - opis


Podrozdziały:

 

 

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ć.

 

Realizacja gry Tetris

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.

 

Plansza gry

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.

Figura

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ą znaków X. Wybrałem je ze względu na ich dużą czytelność.

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 7-mio elementowej. Definicja tych typów danych będzie następująca:


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);
...

 

Przesuwanie treści okna konsoli

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.

 



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.