Your SlideShare is downloading. ×
Dok
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Dok

296
views

Published on

Published in: Education, Business

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
296
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Michał Jezierski Gostyń 25.11.09r. Tel.: 784484950 Program SAPER z obsługą myszy i klawiatury w Turbo Pascalu Wykonali:  Michał Jezierski 1
  • 2.  Sławomir Piotrowski 2
  • 3. Spis treści Kilka słów wstępu...................................................................................................................................4 Algorytm.................................................................................................................................................5 Procedura losująca miny:...................................................................................................................5 Procedura uzupełniająca wskazane przez użytkownika pole:.............................................................6 Procedura rysująca dane siatkę:.........................................................................................................7 Procedura czyszcząca:........................................................................................................................8 Grafika....................................................................................................................................................9 Procedura menu:................................................................................................................................9 Procedura „przegrałeś”:...................................................................................................................12 Obsługa myszy......................................................................................................................................13 Procedury „silnikowe”:.....................................................................................................................13 Procedura obsługująca mysz w czasie gry:.......................................................................................13 Wykaz użytych typów zmiennych globalnych:..................................................................................14 Zakończenie..........................................................................................................................................15 Dodatek................................................................................................................................................16 3
  • 4. Kilka słów wstępu Nasz program został zainspirowany programem „saper” środowiska Windows. Jest to realizacja projektu stworzenia pierwszej prostej gry. Tworzenie gier 2D i 3D oraz silników do nich to dla nas cel w najbliższej przyszłości. Pomysł na oddanie wam tej jakże znanej i przyjaznej gry należy do Sławka. Niedługo po tym jak zaczął on pracę nad Saperem ja wpadłem na dokładnie to samo. Zadzwoniłem do niego z jednym pytaniem – problemem odnośnie algorytmu. Wtedy połączyliśmy siły, abyście teraz mogli się cieszyć z przyjaciółmi Niezwykłą grafiką jaką daje wam nasz Saper. Oddajemy w wasze ręce wiele godzin przyjemnej gry. Mamy nadzieję, że dacie się wciągnąć i docenicie nasze wysiłki. 4
  • 5. Algorytm Główny algorytm programu został napisany w większości przez Sławka. To właśnie on zaczął wcześniej pracę nad nim i miał już koncepcję. Później został ciągle udoskonalany… Procedura losująca miny: procedure losuj1(); Var i, aX, aY:Byte; Begin randomize(); for i:=1 to 10 do Begin aX:=random(9) + 1; aY:=random(9) + 1; pola[aX, aY]:=-1; End; End; Opiera się na prostej metodzie losowania dostępnej w środowisku Pascal. Jest ona przekładana do tablicy zawierającej dane siatki tabeli programu. 5
  • 6. Procedura uzupełniająca wskazane przez użytkownika pole: procedure uzupelnij(); Var i, j, liczba:Byte; di, dj, oi, oj:Boolean; Begin for i:=1 to x do for j:=1 to y do Begin liczba:=0; di:=true; dj:=true; oj:=true; oi:=true; if i = 1 then oi:=false; if i = 10 then di:=false; if j = 1 then oj:= false; if j = 10 then dj:=false; if oi then if pola[i - 1, j] = -1 then Begin liczba:=liczba + 1; if oj then if pola[i - 1, j - 1] = -1 then liczba:=liczba + 1; End; if oj then if pola[i, j - 1] = -1 then liczba:=liczba + 1; if di then if pola[i + 1, j] = -1 then Begin liczba:=liczba + 1; if dj then if pola[i + 1, j + 1] = -1 then liczba:=liczba + 1; End; 6
  • 7. if dj then if pola[i, j + 1] = -1 then liczba:=liczba + 1; if Not (pola[i,j] = -1) then pola[i, j]:=liczba; End; End; Procedura ta ustala czy na wybranym polu znajduje się mina, czy też nie. Dodatkowo oblicza ilość min w sąsiadujących polach. Napisanie tej procedury zajęło masę czasu i w porównaniu do całości programu ten skrawek zajął połowę czasu poświęconego Saperowi. Procedura rysująca dane siatkę: procedure rysuj(); Var prX, prY, i, j:Integer; znak:String[2]; Begin prX:=100; prY:=100; SetColor(14); SetLineStyle(2, 1, 10); for i:=1 to x do Begin for j:=1 to y do Begin Rectangle(prX, prY, prX + 30, prY + 30); if widocznePola[i, j] then Begin Str(pola[i, j], znak); OutTextXY(prX + 10, prY + 10, znak); End; prY:=prY + 30; 7
  • 8. End; prX:=prX +30; prY:=100; End; End; Nie ma tutaj za dużo do omawiania, procedura po prostu za każdym ruchem rysuję nową siatkę Sapera wpisując w pola wartości zwracane jej przez ‘uzupełnij()’. Procedura czyszcząca: procedure czysc(); Var i,j:Byte; Begin for i:=1 to x do for j:=1 to y do Begin pola[i,j]:=0; widocznePola[i, j]:= false; End; End; Rozumie się sama przez siebie. Jest to ostatnia procedura wchodząca w skład silnika programu. W następnej części omówię skład procedur służących obsłudze grafiki w Saperze. 8
  • 9. Grafika Szata graficzna to bardzo ważna część programu. To ona decyduje o naszym pierwszym wrażeniu po uruchomieniu aplikacji. To od niej również zależy czy gra nie będzie się nudzić po 15 minutach. Tutaj zaczęło się moje poważne zadanie w tworzeniu Sapera. Zadbaliśmy o to aby była bardzo przyjemna i odpowiednio dobrana kolorystycznie. Skupiliśmy się na oknie graficznym jak i również tekstowym, w którym nie zabrakło grafik ASCII Art. Procedury inicjującej grafikę nie będę przedstawiał, jest to dokumentacja a nie przyspieszony kurs TP. Procedura menu: procedure menugl; label mg; begin mg: menu1[1]:=' Info '; menu1[2]:=' Program '; menu1[3]:=' Wyjscie '; ClrScr; TextColor(15); For pp:=1 to 3 do Begin TextColor(15); TextBackGround(0); GotoXY(32,11+pp); Write(menu1[pp]); End; pp:=1; Repeat TextColor(0); TextBackGround(15); GotoXY(32,11+pp); 9
  • 10. Write(menu1[pp]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+pp); Write(menu1[pp]); If c2='H' Then Dec(pp); If c2='P' Then Inc(pp); If pp=0 Then pp:=3; If pp=4 Then pp:=1; If c1=Chr(27) Then pp:=3; Until (c1=chr(27)) or (c1=chr(13)); If pp=1 Then begin Clrscr; textcolor(15); gotoxy(14,10); writeln('Program SAPER z obsluga myszy zostal stworzony przez'); gotoxy(14,11); writeln('Michala Jezierskiego i Slawka Piotrowskiego a zainspirowany '); gotoxy(14,12); writeln('"przez program saper" platformy Windows. '); gotoxy(14,13); writeln('----------------------------------------------------'); gotoxy(14,14); writeln('Menu obsluguje sie za pomoca strzalek + klawisz ENTER'); gotoxy(14,17); writeln('Nacisnij ENTER aby powrocic do menu glownego'); c1:=ReadKey; If c1=chr(13) Then goto mg; readln; end; If pp=2 Then Begin //menu poziomu menu1[1]:=' Latwy '; menu1[2]:=' Sredni '; menu1[3]:=' Trudny '; ClrScr; TextColor(15); For pp2:=1 to 3 do Begin TextColor(15); TextBackGround(0); GotoXY(32,11+pp2); Write(menu1[pp2]); End; pp2:=1; Repeat TextColor(0); 10
  • 11. TextBackGround(15); GotoXY(32,11+pp2); Write(menu1[pp2]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+pp2); Write(menu1[pp2]); If c2='H' Then Dec(pp2); If c2='P' Then Inc(pp2); If pp2=0 Then pp2:=3; If pp2=4 Then pp2:=1; If c1=Chr(27) Then pp2:=3; Until (c1=chr(13)); if pp2=1 then poziom:=1; if pp2=2 then poziom:=2; if pp2=3 then poziom:=3; End; //menu poziomu If pp=3 Then halt; End; Obsługiwana jest za pomocą strzałek oraz klawiszy enter, esc. Rysuje przystępne dla użytkownika menu w konsoli tekstowej z elementami graficznymi. Jest bardzo przystępna dla użytkownika. Warto tutaj opisać jej część: wybór poziomu trudności. Saper umożliwia 3 poziomy: łatwy, średni i trudny. Każdy z nich zawiera inną ilość min do odnalezienia. To rozwiązanie wymagało napisania trzech algorytmów liczących położenie min, po jednym na każdy poziom trudności. Procedura menu jest wyposażona w instrukcje maksymalnie zmniejszające ryzyko błędów programu. 11
  • 12. Procedura „przegrałeś”: PROCEDURE przegrales; Begin Repeat ClrScr; TextColor(red); Writeln(''); Writeln(''); Writeln(''); Writeln(''); Writeln(''); Writeln(' _____ _____ ____________ _____ _____ _ ______ _____ '); Writeln(' | __ | __ |___ / ____/ ____| __ / | | | ____|/ ____|'); Writeln(' | |__) | |__) | / /| |__ | | __| |__) | / | | | |__ | (___ '); Writeln(' | ___/| _ / / / | __|| | |_ | _ / / / | | | __| ___ '); Writeln(' | | | | / /__| |___| |__| | | / ____ | |____| |____ ____) |'); Writeln(' |_| |_| _/_____|___________|_| _/_/ _______|______|_____/ '); TextColor(white); GotoXY(17,14); Write('Nacisnij ENTER aby powrocic do menu glownego'); lose:=Readkey; If lose=Chr(13) Then powrot:=1; Until lose=Chr(13); CloseGraph; End; W tej właśnie procedurze zawarty jest ASCII Art. Wielki czerwony napis PRZEGRALES pokazujący się w konsoli po natrafieniu przez was na minę cieszy oko. Stworzenie tego napisu również było zajęciem pracochłonnym. 12
  • 13. Obsługa myszy Procedury „silnikowe”: PROCEDURE wylaczona; Var r:registers; Begin r.ax:=$0002; Intr($33,r); End; PROCEDURE ustaw(x1,y1,x2,y2:word); Var r:registers; Begin r.ax:=$0007; r.cx:=x1; r.dx:=x2; Intr($33,r); r.ax:=$0008; r.cx:=y1; r.dx:=y2; Intr($33,r); End; PROCEDURE dane(var x,y,butt:word); Var r:registers; Begin r.ax:=$0003; Intr($33,r); x:=r.cx; y:=r.dx; butt:=r.bx; End; Procedura obsługująca mysz w czasie gry: procedure menu(); Var ux,uy:longint; Begin repeat q:=0; w:=0; ux:=0; uy:=0; klikx:=0; 13
  • 14. kliky:=0; repeat dane(q,w,przyciski); until przyciski=1; q:=ux; w:=uy; ux:=ux-100; uy:=uy-100; if (ux>0) and (ux<300) then Begin repeat ux:=ux-30; klikx:=klikx+1; until ux<0; End; if (uy>0) and (uy<300) then Begin repeat uy:=uy-30; kliky:=kliky+1; until uy<0; End; IF (klikx<>0) and (kliky<>0) then odkryj(klikx, kliky); rysuj(); until odkryj(klikx, kliky) = -1; End; Jest to skomplikowana procedura odczytująca aktualne położenie kursora myszy. Pozwala również odczytać dane dot. przycisków. Dzięki temu program wie kiedy odkryć dane pole, lub je „zaflagować”. Wykaz użytych typów zmiennych globalnych: pola:Pole; widocznePola:Array[1..x,1..y] of Boolean; c1,c2:char; pp,pp2:byte; menu1:Array[1..3]of string; poziom:byte; q,w,przyciski:word; lose:char; klikx,kliky:integer; 14
  • 15. Zakończenie Stworzenie takiego programu kosztuje wiele nerwów, wysiłku i ciężkiej pracy. Mamy jednak wielką nadzieje, że program Saper przypadł wam do gustu i spędzicie przy nim wiele miłych chwil w gronie przyjaciół. W najbliższym czasie mamy zamiar udostępnić na naszej stronie www.microsoft.ru dodatek umożliwiający zmianę wielkości siatki oraz bardzo ważny element tego typu gier – rozgrywkę w sieci. Będziecie mogli cieszyć się grą z innymi nie wychodząc z domu. Pozdrawiamy i życzymy miłej rozgrywki 15
  • 16. Dodatek Specjalnie dla programistów chcących modyfikować ciało programu zdecydowaliśmy się je tutaj udostępnić: program saper; uses graph, crt, dos; Const x=10; y=10; Type Pole=Array[1..x,1..y] of shortint; Var pola:Pole; widocznePola:Array[1..x,1..y] of Boolean; c1,c2:char; pp,pp2:byte; menu1:Array[1..3]of string; poziom:byte; q,w,przyciski:word; lose:char; powrot:integer; klikx,kliky:integer; PROCEDURE przegrales; Begin Repeat ClrScr; TextColor(red); Writeln(''); Writeln(''); Writeln(''); Writeln(''); Writeln(''); Writeln(' _____ _____ ____________ _____ _____ _ ______ _____ '); Writeln(' | __ | __ |___ / ____/ ____| __ / | | | ____|/ ____|'); Writeln(' | |__) | |__) | / /| |__ | | __| |__) | / | | | |__ | (___ '); Writeln(' | ___/| _ / / / | __|| | |_ | _ / / / | | | __| ___ '); Writeln(' | | | | / /__| |___| |__| | | / ____ | |____| |____ ____) |'); Writeln(' |_| |_| _/_____|___________|_| _/_/ _______|______|_____/ '); TextColor(white); GotoXY(17,14); 16
  • 17. Write('Nacisnij ENTER aby powrocic do menu glownego'); lose:=Readkey; If lose=Chr(13) Then powrot:=1; Until lose=Chr(13); CloseGraph; End; PROCEDURE wlaczona; Var r:registers; Begin r.ax:=$0001; Intr($33,r); End; PROCEDURE wylaczona; Var r:registers; Begin r.ax:=$0002; Intr($33,r); End; PROCEDURE ustaw(x1,y1,x2,y2:word); Var r:registers; Begin r.ax:=$0007; r.cx:=x1; r.dx:=x2; Intr($33,r); r.ax:=$0008; r.cx:=y1; r.dx:=y2; Intr($33,r); End; PROCEDURE dane(var x,y,butt:word); Var r:registers; Begin r.ax:=$0003; Intr($33,r); x:=r.cx; y:=r.dx; butt:=r.bx; End; procedure menugl; label mg; begin 17
  • 18. mg: menu1[1]:=' Info '; menu1[2]:=' Program '; menu1[3]:=' Wyjscie '; ClrScr; TextColor(15); For pp:=1 to 3 do Begin TextColor(15); TextBackGround(0); GotoXY(32,11+pp); Write(menu1[pp]); End; pp:=1; Repeat TextColor(0); TextBackGround(15); GotoXY(32,11+pp); Write(menu1[pp]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+pp); Write(menu1[pp]); If c2='H' Then Dec(pp); If c2='P' Then Inc(pp); If pp=0 Then pp:=3; If pp=4 Then pp:=1; If c1=Chr(27) Then pp:=3; Until (c1=chr(27)) or (c1=chr(13)); If pp=1 Then begin Clrscr; textcolor(15); gotoxy(14,10); writeln('Program SAPER z obsluga myszy zostal stworzony przez'); gotoxy(14,11); writeln('Michala Jezierskiego i Slawka Piotrowskiego a zainspirowany '); gotoxy(14,12); writeln('"przez program saper" platformy Windows. '); gotoxy(14,13); writeln('----------------------------------------------------'); gotoxy(14,14); writeln('Menu obsluguje sie za pomoca strzlek + klawisz ENTER'); gotoxy(14,17); writeln('Nacisnij ENTER aby powrocic do menu glownego'); c1:=ReadKey; If c1=chr(13) Then goto mg; readln; 18
  • 19. end; If pp=2 Then Begin //menu poziomu menu1[1]:=' Latwy '; menu1[2]:=' Sredni '; menu1[3]:=' Trudny '; ClrScr; TextColor(15); For pp2:=1 to 3 do Begin TextColor(15); TextBackGround(0); GotoXY(32,11+pp2); Write(menu1[pp2]); End; pp2:=1; Repeat TextColor(0); TextBackGround(15); GotoXY(32,11+pp2); Write(menu1[pp2]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+pp2); Write(menu1[pp2]); If c2='H' Then Dec(pp2); If c2='P' Then Inc(pp2); If pp2=0 Then pp2:=3; If pp2=4 Then pp2:=1; If c1=Chr(27) Then pp2:=3; Until (c1=chr(13)); if pp2=1 then poziom:=1; if pp2=2 then poziom:=2; if pp2=3 then poziom:=3; End; //menu poziomu If pp=3 Then halt; End; procedure VGAInit; var blad, sterownik, tryb:smallint ; begin sterownik:= VGA; tryb:= VGAHi ; InitGraph (sterownik, tryb, 'C:TPBGI'); blad:= GraphResult ; if blad <> 0 then begin 19
  • 20. Writeln ('Blad podczas inicjacji grafiki.'); Writeln ('Kod bledu: ',blad); Halt ; end end; procedure czysc(); Var i,j:Byte; Begin for i:=1 to x do for j:=1 to y do Begin pola[i,j]:=0; widocznePola[i, j]:= false; End; End; procedure losuj1(); Var i, aX, aY:Byte; Begin randomize(); for i:=1 to 10 do Begin aX:=random(9) + 1; aY:=random(9) + 1; pola[aX, aY]:=-1; End; End; procedure losuj2(); Var i, aX, aY:Byte; Begin randomize(); for i:=1 to 20 do Begin aX:=random(9) + 1; aY:=random(9) + 1; pola[aX, aY]:=-1; End; End; procedure losuj3(); Var i, aX, aY:Byte; Begin randomize(); for i:=1 to 40 do 20
  • 21. Begin aX:=random(9) + 1; aY:=random(9) + 1; pola[aX, aY]:=-1; End; End; procedure uzupelnij(); Var i, j, liczba:Byte; di, dj, oi, oj:Boolean; Begin for i:=1 to x do for j:=1 to y do if oj then if pola[i, j - 1] = -1 then liczba:=liczba + 1; if di then if pola[i + 1, j] = -1 then Begin liczba:=liczba + 1; if dj then if pola[i + 1, j + 1] = -1 then liczba:=liczba + 1; End; if dj then if pola[i, j + 1] = -1 then liczba:=liczba + 1; if Not (pola[i,j] = -1) then pola[i, j]:=liczba; End; End; procedure rysuj(); Var prX, prY, i, j:Integer; znak:String[2]; Begin prX:=100; prY:=100; SetColor(14); SetLineStyle(2, 1, 10); for i:=1 to x do 21
  • 22. Begin for j:=1 to y do Begin Rectangle(prX, prY, prX + 30, prY + 30); if widocznePola[i, j] then Begin Str(pola[i, j], znak); OutTextXY(prX + 10, prY + 10, znak); End; prY:=prY + 30; End; prX:=prX +30; prY:=100; End; End; function odkryj(a, b:byte):shortint; Begin widocznePola[a,b]:= true; odkryj:=pola[a,b]; End; procedure menu(); Var ux,uy:longint; Begin repeat q:=0; w:=0; ux:=0; uy:=0; klikx:=0; kliky:=0; repeat dane(q,w,przyciski); until przyciski=1; q:=ux; w:=uy; ux:=ux-100; uy:=uy-100; if (ux>0) and (ux<300) then Begin repeat ux:=ux-30; klikx:=klikx+1; until ux<0; End; if (uy>0) and (uy<300) then 22
  • 23. Begin repeat uy:=uy-30; kliky:=kliky+1; until uy<0; End; IF (klikx<>0) and (kliky<>0) then odkryj(klikx, kliky); rysuj(); until odkryj(klikx, kliky) = -1; End; begin menugl; VGAInit(); czysc(); if poziom=1 then losuj1(); if poziom=2 then losuj2(); if poziom=3 then losuj3(); ustaw(1,1,635,475); wlaczona; uzupelnij(); rysuj(); menu(); przegrales; if powrot=1 then BEGIN wylaczona; menugl; END; readln; end. 23