Programe pentru jocuri pascal abc. Crearea unui joc pe calculator în Pascal

O postare de nostalgie pentru jucării pe care le-am scris pentru noi în copilărie.
Urcând prin întinderile App Store căutând o altă jucărie pentru iPad-ul meu, am dat de o jucărie veche „Pilot Brothers”. Imediat cumpărat, instalat și transmis dintr-o suflare (probabil deja de 3 ori). Dar mai ales am zăbovit pe episodul cu frigiderul. M-am săturat de acest puzzle.

Și deodată mi-am amintit că și în anii de școală, după ce am trecut prin frigider, puzzle-ul mă acoperea atât de mult încât mi-am scris propria jucărie în Pascal - un emulator de puzzle. Dar nu a repetat doar jocul original, ci ți-a permis să alegi dimensiunea câmpului, a avut un ajutor, abilitatea de a salva și de a continua jocul de la locul anterior după ieșire.

Luând copii de rezervă vechi, am găsit jocul original. L-am lansat în dosbox și a dispărut din lumea exterioară pentru câteva ore.


Puzzle original, notează coloana din stânga deschisă și pozițiile supapelor

Care este scopul?

Esența puzzle-ului este destul de simplă. Există un câmp de supape 4 pentru 4 bucăți, este necesar să puneți toate supapele de pe frigider în poziție orizontală. „Dar există o nuanță” (c): atunci când rotiți o supapă, atunci toate supapele din coloana și rândul în care se află această supapă se rotesc cu ea. Și aici începe distracția!
Când m-am așezat pentru prima dată pentru acest puzzle în căutarea originală, jucându-mă la școală, am trecut prin el, probabil timp de 40 de minute, nu mai puțin. Dar mi-a plăcut atât de mult încât l-am jucat, l-am jucat, l-am jucat și l-am jucat...
Dar îmi doream mai mult: capacitatea de a salva jocul, de a genera diferite niveluri și de a schimba dimensiunea câmpului pentru a înțelege algoritmul jocului.
Apoi mi-am dat seama că dacă îmi place puzzle-ul și vreau să încerc diferite scări ale terenului de joc, atunci nu ar trebui să aștept vremea lângă mare. Există o singură cale de ieșire - să implementați singur acest joc.

Ei bine, să începem!

Nu pot preciza data exactă la care a fost creat jocul, dar cu siguranță este sfârșitul școlii, începutul colegiului. În acei ani, vorbeam fluent Pascal. La institut, am rezolvat probleme pentru bani, am ajutat la scrierea cursurilor și, în general, a fost un limbaj logic minunat. Prin urmare, s-a decis să scrie jucăria pe ea.
În ciuda faptului că știam să implementez grafica în DOS, am decis să nu fac o aplicație grafică. Acest lucru se datorează faptului că ar fi teribil de bug-uri și ar încetini pentru că, în primul rând, am vrut să implementez această aplicație cât mai repede posibil, iar implementarea graficii ar dura mult timp; și în al doilea rând, îmi place mai mult vizualizarea textului. Deși privind în urmă, mi se pare că ar fi mai bine dacă aș face grafică și aș adăuga și suport pentru mouse.
Sarcina a fost simplă: să faci un joc simplu și elegant, pe care să nu-i fie rușine să-l arate. Dintre posibilități: ajutor, capacitatea de a salva și după începerea continuării jocului din momentul în care s-a oprit, capacitatea de a schimba dimensiunea terenului de joc. Plus puțină culoare și grație.

Implementarea

Nu voi analiza complet codurile sursă și logica întregului program, pentru că sunt evidente, iar ceea ce nu este evident este clar din cod. Dar mă voi opri mai detaliat asupra câteva puncte.
Baza jocului este o matrice text de elemente NxN, unde N poate fi egal cu 2, 4, 8 și 16. Matricea este umplută cu doar două caractere X și Y. Poziția cursorului este poziția elementului de matrice curent. i si j. Când un element de matrice este inversat, X este înlocuit cu Y și Y cu X cu coloana și rândul matricei. Ei bine, în plus, există taste rapide (F1-F4, F10) care vă permit să apelați Ajutor, Salvare/încărcare, creare și ieșire. Totul este clar aici, iar modul de implementare este simplu și nu ne vom opri asupra acestui lucru în detaliu.

De cel mai mare interes, din punct de vedere cognitiv, este procedura WRIFT.*

* - rețineți de ce scrieți

În acele vremuri, ca economie, SMS-ul era scris în transliterație. Cum ne amintim scrisoarea " W” este înlocuit cu „ SH”, dar pentru a economisi spațiu, am înlocuit-o cu o literă nefolosită cu o ortografie similară „ W". De aici și numele Wrift(Font). La fel, scrisoarea X” (X) a înlocuit litera „ X" (Rusă " Ha”).

Din moment ce am decis să folosesc modul text pentru joc, aveam nevoie de o scrisoare pentru a înlocui supapa. Ce înseamnă o astfel de scrisoare, care ar arăta supapa într-o poziție verticală și orizontală. Singurii candidați care sunt potriviți în aceste scopuri sunt literele latine „N” și „Z”. Litera „Z” seamănă cu litera N așezată pe o parte, doar întinsă.
Am încercat această opțiune și nu am fost mulțumit de ea. Și mi-am dat seama că trebuie să fac ceva propriu, un fel de soluție alternativă. Mă gândeam deja să scriu o versiune grafică, când am dat peste programul Pascal „Matrix” de la autorul Abrarov A.M. . Programul începe în același mod ca prima „Matrice” - afișând o linie pe ecran, căutând un cod. Și apoi simbolurile hieroglifice încep să se reverse. La ceea ce este implementat numai în modul text.

Un mic program educațional despre programul Matrix.pas

Programul a fost foarte frumos și elegant pentru vremea lui. Și apoi mi-a dat multe. Cel mai interesant lucru este că fontul complet este implementat acolo, pentru 208 caractere! Dar presupun că autorul a luat implementarea unui program ca „crack”-ul nostru doar pentru hieroglife și l-a refăcut pentru el însuși.

Adevărat, acum, pentru ca programul să funcționeze normal, chiar și în dosbox, trebuie să reduceți toate întârzierile cu un factor de 10 (întârziere), altfel nepoții tăi vor aștepta până la sfârșitul lucrării. Întrucât îmi este prea lene să refac programul, este de interes pur academic. Sau poate cineva o va reface și va arăta lumii că soft-ul este frumos (mai ales că dau un link către soiuri). Și dacă dintr-o dată autorul său citește această postare, atunci îi transmit cuvintele mele de recunoștință.

Cel mai important, în acel program, pentru „krakozyabr” este implementat propriul font! Și se încarcă. Aceasta este procedura de boot pe care am împrumutat-o, desigur, schimbând-o puțin.
Câteva cuvinte despre lucrul cu fonturile.

În MS-DOS, BIOS-ul acceptă lucrul cu fonturi bitmap. Funcțiile BIOS vă permit să obțineți și să instalați fonturi personalizate, precum și să obțineți fonturi din generatorul de caractere al adaptorului video. Toate fonturile instalate au aceeași lățime de 8 puncte, iar înălțimea poate avea trei valori fixe - 8, 14 sau 16 puncte. Valoarea specifică a înălțimii fontului este determinată de modul video pentru care este încărcat fontul. Înălțimea fontului de 8 puncte corespunde modului video de 50/43 linii, modului video de 14 puncte la 25 de linii pentru EGA și modului video VGA de 16 puncte la 25 de linii.

Vom folosi modul video 16 culori 40x25 simboluri. În acest mod video, fiecare caracter este o matrice de 8x16 puncte. Mai simplu spus, fiecare caracter reprezintă 16 octeți, unde un bit setat la unu într-un octet înseamnă că este colorat în negru. Dacă aveți o mizerie în cap acum, nu vă alarmați - va deveni mai clar mai târziu.
Litera „X” (litera majusculă latină „X”) a fost aleasă pentru a desemna o supapă închisă (verticală), iar litera „Y” (litera majusculă latină „Y”) a fost aleasă pentru o supapă orizontală deschisă. Alegerea a fost făcută pentru aceste scrisori din mai multe motive. În primul rând, sunt familiarizați din programa școlară și după ureche. În al doilea rând, și mai important, acestea se află într-un rând în tabelul de caractere ASCII (pozițiile 88d și, respectiv, 89d), ceea ce simplifică înlocuirea lor. Iar cele latine au fost alese pentru a putea face un meniu in limba rusa, fara a reincarca fontul.
Deci, ne-am hotărât asupra simbolurilor, acum să trecem la hainele lor, alias fontul. Luăm o foaie de hârtie într-o cușcă și facem un câmp de 8x16 pe ea și procedăm la desenarea simbolului unei supape orizontale și apoi a unei supape verticale. Deoarece poarta trebuie să fie aceeași atât în ​​​​starea verticală, cât și în cea orizontală, vom folosi doar primele 8 rânduri pentru a obține pătratul. Și apoi desenăm două porți în acest câmp, pe verticală și pe orizontală. Ar trebui să iasă așa ceva


Font de două porți

În plus, pătratul negru este notat cu unu, cel alb cu zero. Și formăm 8 octeți. Apoi le traducem în format zecimal și formăm o matrice. Mai întâi, 8 octeți de caracter, apoi 8 octeți de zero (am lăsat subsolul gol), repetăm ​​această procedură pentru al doilea caracter.


Tabel de coduri binare și convertit în format zecimal

Ca rezultat, obținem următorul antet de procedură:

ProcedureWRIFT; (Zagruzka shrifta ("pesochnye chasy")) Const Font:array of Byte=(129,195,231,153,153,231,195,129,0,0,0,0,0,0,0,0, 255,102,36,24,102,36,24,10,2,3 0.0.0.0.0.0); VarSegScr:Word; OfsScr:Cuvânt; screen1: Array of Byte absolute Font;

Fontul este o matrice de două caractere de poartă (fiecare caracter pe propria linie). Cea mai interesantă variabilă este matricea screen1 - o matrice care se află la adresa absolută a variabilei Font (directiva absolut). Urmează partea distractivă.

Început ofsscr:=ofs(ecran1); segscr:=seg(ecran1); Asm push bp mov ax,segscr mov es,ax mov bp,ofsscr mov bx,1000h mov dx,88 (s kakogo simvola na4at" zapis" 88d-X,89d-Y) mov cx,2 (koli4estvo simvolov) mov ax, 1100h int 10h pop bp mov ah,1 (ustanovit videomode txt, tsvetnoj (16 cvetov) 40x25 ) mov cx,1000h int 10h End; sfârşit;(WRIFT)

După cum reiese din rândurile de mai sus, încărcăm segmentul în registrul ES, iar adresa este compensată în registrul BP, locația fontului nostru. Cu comanda mov bx, 1000h spunem ca avem 16 linii in font (incarcam numarul 10h = 16d in BH, iar BL = 0).In continuare, incarcam numarul caracterului din care incepem sa schimbam fontul in registrul DX. Și în CX - numărul de caractere de înlocuit. Încărcăm registrul AX - numărul funcției BIOS pentru schimbarea fontului și provocăm o întrerupere a BIOS-ului. În continuare, restaurăm registrul BP și setăm modul adaptorului video în același mod. Mai multe detalii sunt descrise aici: shackmaster.narod.ru/fonts.htm. Pentru o mai bună înțelegere a structurii fonturilor, ar fi mai bine să citiți acest site.

Într-un mod atât de simplu, puteți schimba întregul font în DOS cu al dvs. Pentru a descărca un font, utilizați procedura Restaurare:

Procedura Restaurare; (Reset shrifta) Begin asm mov ax,3 int 10h End; Sfârșit;(Restaurare)

Care se execută când meniul este afișat și programul se iese.

Apropo, pentru referință, așa-numiții „rusificatori” au lucrat într-un mod similar în DOS. Pur și simplu au înlocuit fontul actual cu un font cu litere rusești.

Una dintre glume

Unul dintre camarazii mei, mai exact, când a studiat programarea Borland C++, a făcut un font sub formă de MPX, folosind și un exemplu din „Matrix”. Acestea. tocmai am înlocuit toate caracterele cu un singur caracter MPX. Norton Commander arăta înfricoșător! Păcat că nu există fotografii de atunci.
Dacă aș putea rula un astfel de link de program pe informatică, atunci profesorul ar fi fericit.

Modificări astăzi

De fapt, jocul pe care îl dau nu este în forma în care a fost scris cu mulți ani în urmă. A găsit niște stâlpi foarte neplăcuți:
1. Programul tocmai sa blocat dacă fișierul GAME.SAV nu a fost găsit;
2. Generatorul de numere aleatoare nu a fost inițializat, prin urmare a generat constant același nivel.
În plus, din cauza problemelor cu codificările, am creat o a doua versiune a jocului, complet în engleză. Și dacă citiți codul sursă într-un editor care nu este compatibil cu DOS, vă recomand să folosiți sursele sale - nu vor fi probleme de codare.

Este atât de frumos că DOSbox este peste tot, am editat personal majoritatea programului pe iPAD în metrou. Vă puteți imagina cât de amuzant arată ardeiul cu un iPad și Borland Pascal deschis pe el?


Bătrânul Borland Pascal pe iPad

Așa că stâlpii sunt corectați prompt.

Mai multe capturi de ecran ale programului, cu o scurtă descriere

Pentru cei care nu au posibilitatea sau dorința de a juca jocul, iată câteva capturi de ecran cheie ale jocului.
După lansare, deschidem terenul de joc cu ultimul joc salvat


start

Cursorul este evidențiat și clipește.

Dacă apăsați F1, puteți obține acest ajutor simplu




Ajutor

Pentru a genera un nivel, apăsați F4 și intrați în acest meniu


Meniu de generare a nivelului

Ei bine, după victorie, jocul te va felicita


Felicitări pentru victoria ta

Și va aștepta să fie apăsată orice tastă. În acest caz, progresul jocului nu este salvat.

Cum se instalează și se joacă

Datorită particularităților și aplicării încărcării fonturilor, jucăria funcționează doar în DOS tub pur. Prin urmare, pentru funcționarea sa este necesar să utilizați dosbox sau un program similar.
Instalarea este banala. Descărcați arhiva cu programul. Instalare dosbox. Și, dacă doriți, rusifică-l, tehnica pentru Linux este aici: old-game.org/?p=1717.
În principiu, toate aceste fișiere pot fi folosite și pentru Windows: Pentru a face acest lucru, fișierul russian.txt este plasat în folderul cu programul și configurația, iar scurtătura pentru dosbox este editată. Calea comenzii rapide ar trebui să fie ceva de genul: „ „C:\Program Files\DOSBox-0.74\DOSBox.exe” -userconf”Îndepărtăm „-userconf”și configurația dvs. va funcționa.

În Ubuntu, fac doar clic dreapta pe program și aleg să-l rulez în dosbox, ca și în Windows, nu știu, pentru că nu este pe niciuna dintre mașini. Ei bine, în cazuri extreme, calea către joc este montată, cu comanda mount path.
Aveți de ales între versiuni în rusă și engleză. Nu poți păcăli cu rusificarea și hemoroizii cu configurații, ci doar trage în engleză. Practic nu există nicio diferență între ele. Deși, personal, ca autor, prefer varianta rusă.
Gestionarea se face cu săgețile de la tastatură, selectarea și inversarea cu tasta de inserare sau făcând dublu clic pe bara de spațiu (da, există un jamb aici). Dacă poziția rămâne brusc, faceți clic o dată pe bara de spațiu.

Amintiți-vă că ultimul joc salvat este încărcat de fiecare dată. Pentru a genera unul nou, apăsați F4. Recomand să începeți cu un câmp 4x4. Acum joc 8x8, iar deocamdată mi-e teamă să trec la 16x16. Pentru 4x4 trec în mai puțin de un minut, 8x8 minute în 7-10, și mi-e teamă să-mi imaginez chiar 16x16.
Amintiți-vă că câmpul de încărcare cu inscripția HABR și porecla mea (poza din intrarea articolului) va dispărea după salvare sau ieșire legală. Este stocat într-un fișier GAME.SAV. Dacă doriți să restaurați, înlocuiți acest fișier cu un fișier din arhivă.

Teren special pentru habr

Nu am vrut doar să încep jocul, chiar dacă a fost finalizat și terminat pentru habr. Am vrut un truc. Și am decis să fac o inscripție în cel mai mare câmp 16x16.
Formatul fișierului de salvare este simplu: începutul este dimensiunea câmpului, de exemplu, numărul 16, întoarcerea carului, apoi 256 (pentru un câmp de 16x16) caractere X și Y care alcătuiesc modelul câmpului, iar la sfârșit numărul de Y în câmp (un fel de sumă de control).
Pentru a face acest lucru, în OF Calc am format un astfel de câmp, am făcut o inscripție în celule cu culoare. Și apoi puneți literele X și respectiv Y.

Pregătirea pentru teren.

Apoi l-am salvat în CSV. S-au eliminat toate separatoarele. Numărat numărul de Y (este foarte simplu, faci o căutare în OF Writer, înlocuiește cu și înlocuiește Y cu ceva, scrie numărul de înlocuiri - acesta este numărul pe care îl cauți). Mai întâi puneți numărul 16, întoarcerea căruciorului și la final numărul jucătorilor. Puteți evalua singur rezultatul :).

Dezavantajele versiunii actuale a programului.

Am scris versiunea actuală... Este puțin probabil să rescriu programul și să-l îmbunătățesc, pentru că este deja teribil de depășit. Dar, pe de altă parte, acum dosbox poate fi pus aproape pe o lanternă, astfel încât să poată lua o viață nouă și ar putea avea sens să rescrieți și să corectați principalele deficiențe.

Asa de:
1. Primul și cel mai neplăcut dezavantaj este managementul prost. În primul rând, inversarea se face cu tasta Inserare sau cu un spațiu dublu. Mai mult, dacă apăsați bara de spațiu de un număr impar de ori, atunci programul se „lipește” până când faceți un număr par de apăsări. Este deranjant.
2. Al doilea dezavantaj semnificativ este redarea întregului joc folosind funcțiile write/writeln. Cu fiecare eveniment, ecranul este redesenat. Când jucați pe un teren de 16x16, frânele și blițurile de randare sunt deja vizibile. În plus, această abordare a complicat logica programului, iar acum este o problemă uriașă să o remediați.
A fost necesar să se implementeze randarea folosind goto (x; y); Atunci ar fi posibil să se schimbe un singur caracter fără a redesena întregul ecran.
3. Jocul cere doar suport pentru mouse. Din nou, suportul mouse-ului trebuie implementat împreună cu paragraful 2, astfel încât să puteți „prinde” cu precizie coordonatele.
4. O mică eroare care decurge din paragraful 2 - când cobori în colțul din dreapta jos, un caracter iese din cadru. Am încercat să-l repar și mi-am dat seama că este mai ușor să rescrii acest loc de desen cu totul decât să-mi dau seama cum funcționează.

Ce ai vrea sa faci

Desigur, mi-ar plăcea o astfel de aplicație pentru o găleată sau iPad. Ca să-l poți juca cu degetul. Sau, dacă nu o aplicație, atunci o jucărie browser (dar astfel încât să funcționeze sub Android și iOS). Pentru a avea un meniu frumos și o navigare ușoară. Era un tabel de înregistrări. Exista un contor de timp pe care îl puteai etala cu prietenii. Erau și statistici pentru a putea estima timpul mediu și viteza aptitudinii.
În general, un zbor uriaș pentru creativitate, cu o lipsă totală de timp liber pentru a învăța programarea pentru aceste dispozitive. Pe de altă parte, dosbox este peste tot și probabil că va fi dificil să obțineți o portabilitate mai universală și poate că are sens să finalizați acest program? Cum crezi?

Rezultate...

Scopul articolului nu este să arăt ce tip bun sunt, ci pur și simplu să-mi amintesc cum a fost. Cu siguranță aproape fiecare dintre noi a scris așa ceva în copilărie. Acesta nu este un program complicat și fiecare elev îl poate scrie, cu suficientă perseverență. Aceasta este mai mult o postare de memorie.
Obișnuiam să folosim foarte mult assembler în programele mele. Îmi plăcea să „vorbesc” cu fierul direct, fără intermediari. Am simțit mașina mai bine. Și chiar și atunci, pentru AVR, am scris exclusiv în assembler. Acum nu înțeleg cum funcționează un computer. Desigur, reprezint blocurile de bază, etc., dar nu cunosc imaginea detaliată, iar amuzant este că nimeni nu o știe!
Și acum... Limbajele de nivel înalt și super înalt de abstractizare, în general, ne obligă să nu ne gândim la cum și unde este executat codul. Acest lucru este, fără îndoială, bun, pentru că vă permite să vă concentrați direct asupra sarcinii, dar, pe de altă parte, acel farmec cald al lămpii de lucru cu fierul dispare...

Lista referințelor și referințelor:
1. Descrierea modului de descărcare a unui font pentru DOS shackmaster.narod.ru/fonts.htm
2. Un ghid excelent pentru asamblare, care mi-a oferit o înțelegere a modului de lucru cu funcțiile BIOS și, într-adevăr, cu hardware-ul computerului: „Programare la nivel hardware: un ghid special.” pumnii
3. Emulator Dosbox www.dosbox.com/download.php?main=1
4. Program și surse narod.ru/disk/65499856001.6f143511c7c3c2ad7866f07008d8db29/INVERTOR.zip.html
5. Sursele programului Matrix narod.ru/disk/65499898001.a6c953f20e2ee023bd00e3518e22fea8/Matrix.pas.html

P.S. Puff, probabil mi-am amintit câteva zile și am căutat pe google cum am făcut acest font. Există un cod, funcționează, dar nu-mi amintesc și nu înțeleg cum.
P.P.S. Dacă oamenii sunt interesați, voi adăuga un videoclip despre cum trec printr-un câmp 4x4 în mai puțin de un minut (folosind frigiderul Pilot Brothers ca exemplu).
P.P.P.S. As fi recunoscator pentru toate comentariile la ortografie si punctuatie trimise prin mesaj privat!

Numai utilizatorii înregistrați pot participa la sondaj. Intrati va rog.

Acum există o opinie printre dezvoltatorii de jocuri începători că, pentru a scrie un joc arcade tipic 2D pe un computer, trebuie să obțineți un motor sau un constructor cool și, de asemenea, este bine să cunoașteți un C++ atât de prestigios, motiv pentru care este aproape imposibil să găsești un articol care să merite despre Pascal. Dar astăzi am decis să încerc să sparg stereotipurile stagnante scriind o mică lecție despre dezvoltarea unui simplu platformer. Așadar, așează-te confortabil, începe cursul „iluminării”...

1. De ce este nevoie?
Există o mulțime de medii diferite care folosesc Pascal ca limbaj de programare. Dar din toată această grămadă pentru lecție, am decis să folosesc PascalABC.net. De ce? Răspunsul este simplu: în primul rând, acest mediu de programare nu folosește Pascal pur, ci descendentul său modern și mai convenabil - Object Pascal; în al doilea rând, Pascal.Net este absolut gratuit, ceea ce înseamnă că nu trebuie să vă faceți griji cu privire la fisuri sau să cheltuiți bani pe o licență.

2. Algoritm.
Deci, avem o zonă de 640x480, care, conform ideii mele, va fi împărțită în celule 8x8, care sunt legăturile matricei s. Astfel, prin modificarea valorii unei celule, o putem face „liberă” sau „ocupată” (de exemplu, să o folosim ca perete).

Ca urmare, vom putea determina fără manipulări inutile unde jucătorul se poate mișca și unde nu (vezi fig.).

3. Variabile și module.
Pentru funcționarea completă a viitorului nostru joc, trebuie să conectăm un singur modul GraphABC, care ne permite să afișăm primitive grafice pe ecran.

Lista 1:

200?"200px":""+(this.scrollHeight+5)+"px");">folosește GraphABC;

Var
s: matrice[,] de întreg;
i,x,y,vviteza: întreg;
game_end: boolean;

4. Apăsări de taste.
Așadar, pentru a nu fi nevoit să parcurgeți propria dvs. scriere pentru a modifica codul, vom crea două proceduri separate responsabile de manipularea poziției jucătorului.

Lista 2:

200?"200px":""+(this.scrollHeight+5)+"px");">//Gestionarea tastelor
procedura KeyPress(key: char); ÎNCEPE

Dacă (key="d") și (s[(x div 8)+1,(y div 8)]=0) atunci //Dacă este apăsată tasta D...
x:=x+8; //... Și există și spațiu liber, apoi trecem la...
//... celula înainte (valoarea x crește cu 8)

Dacă (key="a") și (s[(x div 8)-1,(y div 8)]=0) atunci //vezi comenta mai sus
x:=x-8;

Dacă (key="w") și (vspeed=0) și (s[(x div 8),(y div 8)+1]=1) atunci //Dacă există o "celulă ocupată"...
vviteza:=-16; //... sub picioarele noastre, apoi facem un salt.

ProcedureKeyDown(cheie: întreg); ÎNCEPE
if (key=vk_enter) then game_end:=true; // Când apăsați ENTER...
//Valoarea variabilei game_end este adevărată
Sfârşit;

5. Gravitația.
O parte integrantă a jocului de platforme este ceea ce nu, dar forța gravitației. Prin urmare, acum trebuie să scriem o procedură separată care va ajuta ulterior jucătorul să se ridice în sens literal.

Lista 3:

200?"200px":""+(this.scrollHeight+5)+"px");">//Gravitate
procedura Gravity(); ÎNCEPE

Dacă vspeed=0 atunci începe //Dacă viteza de salt este zero...
dacă s[(x div 8),(y div 8)+1]=0 atunci y+=8; //... mișcă în jos o „celulă” (cădere)
Sfârşit;

Dacă s[(x div 8),(y div 8)+vviteza]=0 atunci y+=vviteza; //Dacă există o celulă liberă deasupra, atunci...
//… urcă cu vspeed.

Daca vsviteza<>0 atunci //Dacă viteza de salt este diferită de zero (în cazul nostru: mai mică decât zero)...
vviteza+=2; //… apoi o reducem putin cate putin.

6. Desen.
Cred că este clar fără alte prelungiri, dar pentru spectacol, voi observa că jocul este împărțit în părți „vizuale” și „non-vizuale”. „Non-vizual” este responsabil pentru tot ceea ce se întâmplă în jocul în sine, iar „vizual”, de fapt, pentru afișarea a ceea ce se întâmplă pe ecran. Deci, procedura de mai jos este responsabilă pentru partea „vizuală” și nimic mai mult.

Lista 4:

200?"200px":""+(this.scrollHeight+5)+"px");">procedure Draw(); începe

Redesenează;
lockdrawing;

// Desenați un dreptunghi alb...
setbrushcolor(clwhite); //… dimensiune 640 pe 480
umple dreptunghi(0,0,640,480);

Setbrushcolor(clblack); // Desenați pereți negri...
fillrectangle(0,192,640,224);//... după coordonate...
//… 0 – 640 prin X; 192 - 224 Y
//(ATENȚIE! Aceste manipulări nu fac pereții tangibili, ci doar...
//… creează imaginea lor grafică.

setbrushcolor(clred); // Desenează jucătorul după coordonate...
umple dreptunghi(x,y,x+8,y+8);//… x și y

7. Corpul programului.
Așa că am ajuns, de fapt, la programul în sine. Aici trebuie să umplem tabloul cu valorile de care avem nevoie și, de asemenea, să folosim procedurile scrise anterior.

Lista 5:

200?"200px":""+(this.scrollHeight+5)+"px");">Începe //începe program

// Specificarea valorilor pentru variabile
game_end:=false;
x:=0; //Poziția de pornire a jucătorului în X
y:=0; //Poziția de pornire a jucătorului în Y

//Creează o matrice
s:= întreg nou;

//Creează platforma desenată în procedura Draw
pentru i:=0 la 79 do
s := 1;

În timp ce game_end=false începe //Creează o buclă...
//... care se va rupe dacă game_end = false

// Desenați ecranul
A desena();

//Gravația pentru jucător
gravitatie();

OnKeyPress:=KeyPress; //Gestionarea clicurilor...
OnKeyDown:=KeyDown; //… chei

Somn (30); //Așteptați aproximativ o jumătate de secundă pentru a juca...
//… a lucrat la viteză normală

Sfârșit;//sfârșitul buclei.

Sfârşit. // sfârşitul programului

8. Concluzie.
În total, avem un simplu platformer cu un punct în rolul principal. Ne putem deplasa orizontal si sari:

În general, nu aș dori să diluez sfârșitul acestei lecții cu niciun fel de dă, deoarece de multe ori pur și simplu nu citesc „apă inutilă”, așa că voi renunța cerându-vă să lăsați comentarii. Vă mulțumim pentru atenție! Sper ca te-am ajutat!

Un programator începător nu ar trebui să înceapă imediat să scrie un program de joc complex, cu mai multe niveluri în Pascal. Ar trebui să începeți cu un joc logic sau matematic cu o interfață text. Dobândind treptat experiență, poți continua să lucrezi la proiecte mai mari.

Instruire

  • Începeți să lucrați la program cu un titlu și specificați lista de pluginuri utilizate: program reshiprimer; folosește crt;
  • Spuneți compilatorului care variabile vor fi incluse în program: vara, b, c: întreg; d: șir; Aici a și b sunt termeni, c este suma, d este răspunsul la întrebarea dacă utilizatorul dorește să joace mai departe.
  • Marcați începutul programului și bucla infinită și, de asemenea, inițializați generatorul de numere aleatoare: beginrandomize;while 0=0 dobegin
  • Program pentru a genera două numere aleatoare între 0 și 1000: a:=round(random(1000));b:=round(random(1000));
  • Arată utilizatorului un exemplu de rezolvat, apoi cere rezultatul: writeln("Cât"),a,("+"),b,("?");readln(c);
  • Spuneți utilizatorului dacă a rezolvat corect exemplul: if a+b=c then writeln("Corect!") else writeln("Wrong!");
  • Întrebați utilizatorul dacă dorește să joace mai mult: writeln(„Vom juca mai mult?”); readln(d);
  • Dacă răspunsul este nu, închideți programul: dacă upcase(d)"Y" atunci stop(0);
  • Încheiați mai întâi bucla și apoi programul în sine: end. Notați punctul de după a doua instrucțiune end.
  • Rulați programul apăsând Ctrl+F9. Primul exemplu va fi afișat pe ecran. Numără în mintea ta și introduce răspunsul la acesta. Aparatul vă va spune imediat dacă este rezolvat corect. Apoi veți fi întrebat dacă doriți să continuați să jucați. Răspunsul cu Y sau Y va avea ca rezultat următorul exemplu, iar introducerea oricărei alte litere va ieși din program.
  • După ce ați realizat funcționarea corectă a jocului, continuați să-l îmbunătățiți. De exemplu, adăugați un ecran clar înainte de a afișa fiecare exemplu nou cu comanda cls. Folosind procedura textcolor, faceți ca etichetele să apară în culori diferite. Gândiți-vă cum puteți face programul să schimbe automat complexitatea exemplelor: cu răspunsuri corecte, complicați-le și cu cele incorecte, simplificați-le. Pentru a diversifica jocul, adăugați funcția de generare de exemple pentru diverse operații matematice.
  • Astăzi, jocurile simple, unde nu există efecte grafice sau sonore, se confruntă cu o renaștere. Când le joacă, utilizatorul se concentrează pe intriga, și nu pe tehnicile artistice. Pascal este foarte potrivit pentru a crea astfel de jocuri.

    Instruire

  • Descărcați compilatorul Pascal de pe următoarea pagină - http://edn.embarcadero.com/article/20803. Citiți termenii de utilizare pentru acest pachet software și apoi instalați-l.
  • Încercați să creați un joc în care jucătorului i se cere să ghicească un număr între 0 și 100. Mai întâi, introduceți numele programului: program ugadayka;
  • Conectați modulul CRT: folosește crt;
  • Etichetați variabilele astfel: var
  • zagadka,mnenie,popytki:integer;

  • Porniți programul ștergând ecranul și variabilele și atribuind o valoare pseudo-aleatorie numărului ascuns: începe
  • zagadka:=int(rnd*100);

  • Rugați computerul să întrebe utilizatorul care crede că este numărul, până când îl ghicește: în timp ce nu mnenie=zagadka do
  • popytki:=popytki+1;

    writeln("Încercați numărul ",popytki,".");

    scrie ("Ce crezi că este numărul?");

    dacă zagadka>opinie, atunci scrieți(„Nu, numărul ghicit este mai mare!”)

    else writeln ("Nu, numărul dat este mai mic!")

  • După ce numărul este ghicit, repetarea automată a evenimentelor de mai sus se va opri. Va începe execuția următoarelor linii ale programului. În ele, faceți ca mașina să imprime informațiile despre care utilizatorul a ghicit numărul: writeln("Felicitări! Ați ghicit numărul din numărul de încercare ",popytki,". Este într-adevăr egal cu ",zagadka,".");
  • knopochka:=tasta de citire

  • Introduceți instrucțiunea pentru a încheia programul: end.
  • Salvați programul sub orice nume dorit folosind fișierul cu elemente de meniu -> Salvare ca. Pe viitor, după fiecare editare, salvați-l apăsând tasta F2.
  • Pentru a rula programul pentru execuție, apăsați simultan tastele Control și F9.
  • După ce programul se termină, pentru a vedea ce a afișat chiar înainte, apăsați simultan tastele Alt și F5. Pentru a reveni la editor, apăsați din nou pe aceeași comandă rapidă de la tastatură.
  • Trimiteți-vă munca bună în baza de cunoștințe este simplu. Utilizați formularul de mai jos

    Studenții, studenții absolvenți, tinerii oameni de știință care folosesc baza de cunoștințe în studiile și munca lor vă vor fi foarte recunoscători.

    postat pe http://www.allbest.ru/

    postat pe http://www.allbest.ru/

    Introducere

    1. Enunțarea problemei

    2. Descrierea datelor

    3. Algoritmi și diagrame bloc

    4. Program Pascal cu comentarii

    Concluzie

    Lista literaturii folosite

    INTRODUCERE

    Scopul principal al acestui proiect de curs este de a consolida și demonstra cunoștințele dobândite în cursul studierii informaticii.

    Lucrarea necesită o abordare creativă și utilizarea unor cunoștințe suplimentare din domeniul graficii. Proiectul de curs nu implică utilizarea comercială ulterioară a acestui produs software.

    1. Enunțarea problemei

    Este necesar să se creeze un joc, a cărui semnificație principală este că într-o parte a ecranului se mișcă un obiect de un tip („Aeronava”), iar în altă parte a ecranului există un obiect de alt tip („ Echipamentul de apărare aeriană”), iar „Echipamentul de apărare aeriană” trebuie să doboare „Aeronave”.

    a) Selectarea, justificarea și prezentarea metodei de rezolvare a problemei.

    Am preferat să folosesc memoria dinamică, desenând texturi într-o procedură separată.

    Cu memoria dinamică, în acest caz este foarte convenabil să organizați mișcarea simultană a obiectelor dinamice pe ecran cu o pâlpâire minimă a ecranului.

    Desenarea texturilor într-o procedură separată este convenabilă, deoarece, dacă se dorește, este posibil să desenați un obiect în mișcare fără a explora caracteristicile programului.

    b) Construirea algoritmului problemei.

    Programul începe cu meniul, dar dacă alegerea a căzut în meniul Start Game, atunci mai întâi pătratele „curate” ale ecranului sunt introduse în memoria dinamică, apoi imaginile obiectelor dinamice sunt afișate secvenţial pe ecran și introduse secvenţial în memorie dinamică. În același timp, pătratele „curate” sunt suprapuse pe zona schițată a ecranului, astfel încât la scanarea imaginilor ulterioare, să nu existe jene.

    c) Crearea și depanarea programului.

    Crearea programului a constat din trei etape: crearea meniului, crearea corpului principal al jocului ca procedură separată fără a desena texturi și desenul final al texturilor.

    d) Realizarea unei note explicative și susținerea proiectului de curs.

    2. Descrierea datelor:

    Size1, Size2, Size3, Size4 sunt variabile de tip întreg care stochează zona alocată pentru variabilele dinamice.

    Pustota, Sam1, Rocket, F16 - variabile dinamice care stochează obiecte de joc.

    Key este o variabilă booleană care se evaluează la TRUE atunci când sunt apăsate tastele.

    Nume, Head, Cl - variabile șir scrise în fișier:

    NUME - stochează numele jucătorului introdus de la tastatură;

    HEAD și CL - conțin un șir, care este un set de descriptori de limbaj HTML, care, după ce au fost scrisi într-un fișier, îl convertesc într-o pagină HTML.

    F1 - variabilă fișier

    Eveniment - variabilă care descrie evenimente (tip: Tevent);

    3. Diagrama bloc

    4. Program Pascal cu comentarii

    Utilizează Crt, Aplicație, Dialoguri, Obiecte, Drivere, Vizualizări, Grafic;

    Procedura Super_Mega_Game;

    Eticheta b1;

    var Driver1,Mode,Size,Size2,x,y,size3,n,xs,d2,d11,d12,m,xt,p,h,Size4:Integer; s:char; Gol, Sam1, Rocket, F16: Pointer; cheie: boolean; Nume, Cap, Cl: String; F1:text;

    ÎNCEPE

    randomizare;

    xs:=1;

    Driver1:=Detectare;

    Mod:=Detectare;

    InitGraph(Driver1,Mode,"");

    ClearDevice;

    SetBkColor(3);

    Size:=ImageSize(0,0,53,53);

    GetMem(Gol, dimensiune);

    GetImage(0,0,53,53,Empty^);

    Size2:=ImageSize(640,0,600,40);

    GetMem(Sam1,Size2);

    setcolor(galben);

    Linie(605,35,630,35);

    Linie(630,35,635,40);

    Linie(600,40,605,35);

    Linie(600,40,635,40);

    Linie(615,35,615,29);

    Linie(615,29,620,35);

    SetColor(6);

    Linie(610,32,620,24);

    Linie(610,29,620,21);

    SetColor(Red);

    Linie(620,24,624,20);

    Linie(620,21,624,20);

    Arc(610,30,0,90,2);

    GetImage(640,0,600,40,Sam1^);

    Size4:=ImageSize(100,100,150,150);

    GetMem(F16,Size4);

    (CADRU)

    SetColor(6);

    Linie(105,120,135,120);

    Linie(105,114,130,114);

    (CABINĂ)

    setcolor(Albastru);

    Arc(131,117,0,90,3);

    setcolor(6);

    Linie(134,117,144,118);

    Linie(134,120,144,118);

    (PRIMA ARIPĂ)

    Linie(115,119,113,130);

    Linie(113,130,117,130);

    Linie(117,130,121,119);

    Linie(115,119,121,119);

    (COADĂ)

    Linie(105,114,101,110);

    Linie(101,110,105,120);

    (ARIPA A DOUA)

    Linie(119,114,117,109);

    Linie(117,109,113,109);

    Linie(113,109,114,114);

    GetImage(100,100,150,150,F16^);

    PutImage(100,100,Empty^,NormalPut);

    Size3:=ImageSize(640,0,600,40);

    GetMem(Rocket,Size3);

    SetColor(6);

    Linie(610,32,620,24);

    Linie(610,29,620,21);

    SetColor(Red);

    Linie(620,24,624,20);

    Linie(620,21,624,20);

    Arc(610,30,0,90,2);

    GetImage(640,0,600,40,Rocket^);

    setcolor(6);

    Linie (1.460.640.460);

    x:=6;

    y:=400;

    n:=0;

    m:=0;

    xt:=5;

    p:=1;

    h:=0;

    PutImage(585,10,Empty^,NormalPut);

    RepeatRepeatif p=1 apoi începe Delay(100); PutImage(xt,100,F16^,NormalPut); xt:=xt+1; h:=h+1; dacă h=550 atunci p:=0; sfarsit;daca p=0 atunci incepe intarziere(100); PutImage(xt,100,F16^,NormalPut); xt:=xt-1; h:=h-1; dacă h=0 atunci p:=1; end;key:=KeyPressed;if (key=True) atunci mergi la b1;până la s=chr(27);

    b1:

    s:=ReadKey;

    dacă s=chr(77) atunci x:=x+4;

    dacă s=chr(75) atunci x:=x-4;

    if s=chr(72) then begin Repeat PutImage(x+51+n,y-35-n,RocKet^,NormalPut); inc(n); PutImage(x+51+n,y-35-n,Empty^,NormalPut); dacă (x+51+n)=550 atunci n:=300; până la n=300; PutImage(x+n,y-35-n,Empty^,NormalPut); dacă ((y+51+n)>100) și ((x+51+n)>(xt-10)) și ((x+51+n)<(xt+60)) then begin OutTextXY(250,200,"F16-vipe out!!!"); s:=chr(27); end; n:=0; end;

    PutImage(x-4,y,Empty^,NormalPut);

    PutImage(x,y,Sam1^,NormalPut);

    până la s=chr(27);

    readln;

    Închide grafic;

    TextColor(Verde);

    Scrie ("Introduceți numele dvs.: ");

    readln(Nume);

    cap:="
    vinar!!!

    ";

    CL:="
    ";

    Head:=concat(Cap," MegaMen: ",nume,cl);

    atribui(F1,"Nume.htm");

    rescrie(f1);

    Scrie(f1,cap);

    close(f1);

    Sfârşit;

    tip

    PProg=^TProg;

    TProg=obiect(TAplicație)

    Constructor Init;

    Sfârşit;

    Pdial=^TDial;

    TDial=obiect(Tdialog)

    Gândește ProcedureEvent(var Event:TEvent);

    virtual;

    Sfârşit;

    constcmPrint = 100;

    Constructor TProg.Init;

    varR:TRect;Dia:Pdial;g:char;

    ÎNCEPE

    Init moștenit;

    R.assign(20,9,60,17);

    Dia:=New(PDial,Init(R,""));

    R.assign(3,4,22,6);

    Dia^.Insert(New(PButton,Init(R,"Start Game",cmPrint,bfDefault)));

    R.assign(23,4,35,6);

    Dia^.Insert(New(PButton,Init(R,"Quit",cmCancel,bfNormal)));

    dacă execView(Dia)=cmPrint atunci începe Super_Mega_Game; Writeln(„Apăsați „b” pentru a reveni la meniul principal”); repetă g:=ReadKey; dacă g="b" atunci începe clrscr; Sfârşit; până la g="b"; Writeln(„Apăsați „Alt-x” pentru Ieșire”); Sfârşit;

    Sfârşit;

    Procedura TDial.HandleEvent (var Event:TEvent);

    ÎNCEPE

    HandleEvent(Eveniment) moștenit;

    if (Event.What=evCommand) și (Event.Command=cmPrint) atunci EndModal(cmPrint);

    Sfârşit;

    Procedura liliecilor;

    var

    Prog:TProg;

    ÎNCEPE

    Prog.Init;

    Prog.Run;

    Prog gata;

    Sfârşit;

    ÎNCEPE

    batva;

    Sfârşit.

    5. Ghid de utilizare pentru lucrul în program

    Când porniți programul, apare un meniu care oferă o gamă largă de opțiuni.

    Cursorul este mutat cu tastele cursor, selectarea se face cu tasta ENTER.

    Când selectați orice element de meniu, apare un mesaj corespunzător, totuși, când selectați elementul „Program”, jocul în sine începe direct.

    Esența jocului este de a doborî avioanele prin intermediul apărării aeriene.

    Instrumentul de apărare aeriană se poate deplasa orizontal pe ecran folosind cursorul. Când apăsați pe bara de spațiu, sistemul de apărare antiaeriană trage un foc. Dacă proiectilul lovește, atunci apare inscripția „F-16 wipe out”. După ce avionul este doborât, vi se cere să vă scrieți numele și apoi să apăsați „b” - ceea ce vă duce la un ecran în care apăsând ALT + X vă scoate din program.

    program de textura joc pentru pc

    Concluzie

    În procesul de depanare a programului, au apărut dificultăți din cauza faptului că la scanarea întregului ecran și apoi utilizarea acestui obiect, programul a început să încetinească drastic viteza de lucru. Depășirea acestui obstacol a constat în scanarea unor părți mici ale ecranului și apoi utilizarea lor.

    Procesul de desenare detaliată a graficii este, de asemenea, lung.

    Este necesar ca în folderul în care se află acest program, să existe un fișier egavga.bgi . Acest fișier este disponibil în multe versiuni de TR în folderul bin, este responsabil pentru inițializarea graficelor.

    Lista literaturii folosite.

    1. Mezhenny O.A. „Turbo Pascal-învață să programezi”; Moscova-S. Petersburg-Kiev; "Dialectică"; 2001; 448s.

    2. Babușkin I.A.; „Workshop on TR” - un manual pentru cursuri IWT; Moscova, 1998.

    3. http://www.freepascal.org;

    4. http://www.geocities.com/~franzglaser/tp.htm;

    5. http://www.garbo.uwasa.fi/pc/turboobj.html;

    Găzduit pe Allbest.ru

    Documente similare

      Dezvoltarea și implementarea jocului de calculator „Snake” folosind limbajul de programare Pascal și modulul CRT. Întocmirea unui algoritm general de program, evidențiind părțile sale funcționale. Dezvoltarea cazurilor de testare. Folosind fișiere tastate.

      lucrare de termen, adăugată 23.02.2011

      Caracteristicile sistemului de calcul și instrumentele de dezvoltare. Programare în Pascal în Turbo Pascal și Object Pascal în Delphi. Folosind proceduri, funcții, matrice, căutare binară. Crearea unei baze de date ca fișier.

      raport de practică, adăugat la 05.02.2014

      Istoria dezvoltării limbajului de programare Java. Istoria lui Tetris - un joc de calculator cult inventat în URSS. Regulile jocului, caracteristicile punctajului. Crearea interfeței programului, implementarea acesteia în mediul Java, codificare, testare.

      lucrare de termen, adăugată 27.09.2013

      Reprezentarea algoritmică și descrierea regulilor jocului „Evoluție”. Construirea unei diagrame a precedentelor. Dezvoltarea unei interfețe grafice pentru utilizator. Implementarea interfeței în mediul Unity. Structura fișierului de salvare a jocului. Proiectarea comportamentului computerului.

      teză, adăugată 18.02.2017

      Descrierea regulilor jocului „bătălie pe mare”. Caracteristicile computerelor moderne și inteligența artificială. Crearea unei diagrame bloc generale a programului, aspectul acestuia. Variabile, proceduri și funcții necesare. O caracteristică a obiectelor utilizate în aplicație.

      lucrare de termen, adăugată 11.05.2012

      Dezvoltarea unui program pentru un joc logic de „tic-tac-toe” cinci la rând pe un câmp de dimensiuni 15x15 celule folosind grafica Pascal folosind programare orientată pe obiecte. Structura algoritmului programului și descrierea activității acestuia.

      lucrare de termen, adăugată 13.02.2012

      Fundamentele lucrului în limbajul de nivel înalt Turbo Pascal. Hardware și software de bază. Operatorii trebuie să lucreze în mediul grafic Turbo Pascal. Porniți modul grafic. Textul programului în mediul grafic Turbo Pascal.

      lucru de laborator, adaugat 14.05.2011

      Dezvoltarea programului pentru jocul casual „Zuma Deluxe” în C\C++. Folosind stilul vechilor incași și azteci, capabilitățile motorului grafic HGE versiunea 1.53. Numirea claselor principale ale jocului. Manual de utilizare, conținutul meniului principal.

      lucrare de termen, adăugată 28.10.2014

      Limbajul de programare Pascal și shell-ul său turbo. Analiză analitică a software-ului pentru jocuri. Funcțiile modulului Crt. Declarație a problemei creării unui program de joc simplu „Turbozmey”, algoritm de implementare și descrierea interfeței cu utilizatorul.

      lucrare de termen, adăugată 15.05.2014

      Implementarea structurilor algoritmice de bază. Instrucțiune condiționată trunchiată și instrucțiune de ieșire. Ciclu cu un parametru (ciclu de numărare). Tipărirea tabelelor de funcții. Instrumente de dezvoltare a programelor în Free Pascal. Dezvoltarea aplicației de joc „Tauri și vaci”.

    • Serghei Savenkov

      un fel de recenzie „rare”... parcă s-ar grăbi undeva