GRY KOMPUTEROWA
Potrafimy już przemieszczać obiekty po ekranie monitora. Co prawda są to kwadraty, nic nie stoi na przeszkodzie, aby napisać odpowiednie procedury i zamienić kwadraty na skomplikowane statki kosmiczne. Potrafimy sprawdzić, kiedy znajdą się w odpowiednim punkcie ekrany (zderzą się z innym obiektem). Jeśli dołożymy jeszcze umiejętność reagowania na wciskane klawisze, będziemy mogli pisać prawdziwe gry komputerowe!
Kody wciskanych klawiszy przechowywane są w tzw. "buforze klawiatury", do momentu aż system je przetworzy i odpowiednio na nie zareaguje. Jeśli zbyt znęcałeś się nad klawiaturą, być może zdarzyło się, że usłyszałeś charakterystyczne piski. To znak, że bufor się przepełnił - program nie jest w stanie zapamiętać więcej i należy poczekać aż "strawi" wszystko to, co już nawciskałeś.
Ten prosty program służy do sprawdzania kodów wciskanych klawiszy. Należy pamiętać o tym, że część klawiszy (np. funkcyjne i kursory) "zostawia" po sobie dwa kody, z których pierwszy ma wartość 0 (zero). Funkcja READKEY zapamiętuje kod naciśniętego klawisza. Koniec programu nastąpi gdy wciśniemy klawisz ESC (kod 27).
program kody;
uses crt;
var
znak:char;
begin
repeat
znak:=readkey;
writeln(znak:3,ord(znak):5);
until znak=#27;
end.
Jeszcze jedna przydatna funkcja dotycząca klawiatury dotyczy sprawdzenia, czy cokolwiek znajduje się w buforze, czy naciśnięto jakiś znak KEYPRESSED. Jeśli jest coś w buforze to funkcja jest prawdziwa.
Poniższy program przesuwa kwadrat zgodnie z naciskanymi na klawiaturze kursorami:
program przesuwanie;
uses crt,graph;
{kwadratowa pilka o dlogosci sciany i kolorze}
procedure pilka(x,y,dlugosc,kolor:integer);
begin
setcolor(kolor);
line(x,y,x+dlugosc,y);
line(x+dlugosc,y,x+dlugosc,y+dlugosc);
line(x+dlugosc,y+dlugosc,x,y+dlugosc);
line(x,y+dlugosc,x,y);
end;
var
d,m:integer;
xp,yp,dp,kp:integer; {dane pilki}
koniec:boolean; {kiedy koniec gierki}
znak:char; {jaki znak na klawiaturze}
begin
d:=detect;
initgraph(d,m,'');
{wspolrzedne pilki}
xp:=0;
yp:=0;
dp:=50;
kp:=13;
koniec:=false;
repeat
{rysowanie}
pilka(xp,yp,dp,kp);
{wstrzymanie}
delay(10);
{wymazanie}
pilka(xp,yp,dp,0);
{sprawdzanie klawiatury-gdy nacisnieto jakis klawisz}
if keypressed then
begin
{odczytanie klawisza-kod klawisza w zmiennen znak}
znak:=readkey;
{gdy to byl kod kursora to czytamy kolejny znak bo pierwszy ma kod 0}
if znak=#0 then znak:=readkey;
case znak of
'H':yp:=yp-5;{kod kursora gora}
'P':yp:=yp+5;{kod kursora dol}
'M':xp:=xp+5;{kod kursora w lewo}
'K':xp:=xp-5;{kod kursora w prawo}
#27:koniec:=true;{kod klawisza ESC}
end;
{oczyszczamy bufor klawiatury zeby nie piszczalo}
while keypressed do znak:=readkey;
end;
until koniec;
closegraph;
end.
Po niewielkich modyfikacjach programu otrzymamy najprostszą grę. Poruszająca się piłka, którą odbijamy od rakietki sterowanej kursorami.
program odbijanie;
uses crt,graph;
{piojowa linia o dugosci i kolorze}
procedure rakietka(x,y,dlugosc,kolor:integer);
begin
setcolor(kolor);
line(x,y,x,y+dlugosc);
end;
{kwadratowa pilka o dlogosci sciany i kolorze}
procedure pilka(x,y,dlugosc,kolor:integer);
begin
setcolor(kolor);
line(x,y,x+dlugosc,y);
line(x+dlugosc,y,x+dlugosc,y+dlugosc);
line(x+dlugosc,y+dlugosc,x,y+dlugosc);
line(x,y+dlugosc,x,y);
end;
var d,m:integer;
xr,yr,dr,kr, {dane rakietki}
xp,yp,dp,kp, {dane pilki}
kxp,kyp:integer; {szybkosc ruchu pilki}
koniec:boolean; {kiedy koniec gierki}
znak:char; {jaki znak na klawiaturze}
begin
d:=detect;
initgraph(d,m,'');
{wspolrzedne rakietki}
xr:=630;
yr:=200;
dr:=50;
kr:=14;
{wspolrzedne pilki}
xp:=0;
yp:=0;
dp:=10;
kp:=12;
kxp:=1;
kyp:=1;
koniec:=false;
repeat
{rysowanie}
rakietka(xr,yr,dr,kr);
pilka(xp,yp,dp,kp);
{wstrzymanie}
delay(10);
{wymazanie}
rakietka(xr,yr,dr,0);
pilka(xp,yp,dp,0);
{sprawdzanie klawiatury-gdy nacisnieto jakis klawisz}
if keypressed then
begin
{odczytanie klawisza-kod klawisza w zmiennen znak}
znak:=readkey;
{gdy to byl kod kursora to czytamy kolejny znak bo pierwszy ma kod 0}
if znak=#0 then znak:=readkey;
case znak of
'H':yr:=yr-5;{kod kursora gora}
'P':yr:=yr+5;{kod kursora dol}
#27:koniec:=true;{kod klawisza ESC}
end;
{oczyszczamy bufor klawiatury zeby nie piszczalo}
while keypressed do znak:=readkey;
end;
{ruch pilki}
xp:=xp+kxp;
yp:=yp+kyp;
{odbicia od brzegów ekranu}
if xp<=0 then kxp:=-kxp;
if (yp<=0) or (yp>=479-dp) then kyp:=-kyp;
{koniec gdy przeleci za rakietką}
if xp>=639 then koniec:=true;
{odbicie od rakietki}
if (xp+dp>=xr) and
((yp+dp>yr) and (yp<yr+dr)) then kxp:=-kxp;
until koniec;
closegraph;
end.
Kolejna modyfikacja programy z
rakietką będzie polegała na zmianie płaskiej rakietki na trójkątną armatę,
z której będziemy strzelali pociskami do poruszającej się piłki. Po
trafieniu piłka będzie zmieniała kolor.
Jeśli chcesz koniecznie obejrzeć ten wielce już skomplikowany program, to
wybierz tą stronę STRZELANIE
Podobnej modyfikacji
dokonamy w pierwszej gierce, w której poruszaliśmy kwadratem za pomocą
klawiszy. Wrzucimy na ekran losowe prostokąty i będziemy sprawdzać czy
kwadrat dotyka przeszkody. Dodatkowo można będzie zmieniać wymiary kwadratu.
Jeśli chcesz koniecznie obejrzeć ten wielce już skomplikowany program, to
wybierz tą stronę LABIRYNT
Ćwiczenia