Lage et dataspill i Pascal. Hvordan lage spill i Pascal

Textual (Mine Mines Game) bruker GraphABC,ABCObjects,ABCButons; Konst N = 10; //Felt N x N sz = 40; //Cellestørrelse d0 = 10; //Innrykk fra venstre og øvre kant zz = 2; //Avstand mellom celler NMines = 10; //Antall miner Type OneSellField = rekordmine: boolean; //Er det en mine fl: boolean; //Er det en avmerkingsboks naboer: heltall; //positiv - Hvor mange naboer; neg - nødvendig for sporingsalgoritmen - åpne tomme celler klikk: boolean; //Var det åpen ende; Var BtNewGame: ButtonABC; Selg: rekke SquareABC; Felt: array av OneSellField; c: shortint; //For å telle miner i naboceller Åpnet: shortint; //Hvor mange avmerkingsbokser er merket av på riktig måte Nfl: Heltall; //Antall sjekkede flagg (for å vinne må være lik antall minutter) Prosedyre CreateField; start for var y:= 1 til N do for var x:= 1 til N do start Selg := ny SquareABC(d0+(x-1)*(sz+zz),d0+(y-1)*(sz+zz ), sz, clLightSeaGreen); Sell.BorderColor:= clGrønn; Sell.BorderWidth:= 2; Sell.TextScale:= 0,7; slutt; slutt; Prosedyre NewGame; var Rx, Ry: heltall; start for var j:=1 til N do for var i:=1 til N do begin Field.mine:= false; Field.click:= usann; Field.fl:= usann; Felt.naboer:= 0; Sell.BorderColor:= clGrønn; Sell.Text:= ""; Sell.Color:= clLightSeaGreen; slutt; //Plasser miner for var i:= 1 til NMines begynner Rx:= Random(N)+1; Ry:= Tilfeldig(N)+1; //Hvis det er miner i den valgte cellen, generer nye minekoordinater mens Field.mine begynner Rx:= Random(N)+1; Ry:= Tilfeldig(N)+1; slutt; Field.mine:= sant; slutt; ( //Midlertidig hint hvor miner er for var j:=1 til N do for var i:=1 til N begynner hvis Field.mine deretter Sell.BorderColor:= clYellow; end; ) var ii, jj:shortint; //Tell gruvene rundt for var j:=1 til N do for var i:=1 til N do begynner c:= 0; for var dx:= -1 til 1 begynner for var dy:= -1 til 1 gjør hvis ikke ((dx = 0) og (dy = 0)), så begynner ii:= i + dx; jj:= j + dy; hvis ((ii > 0) og (ii<= N) and (jj >0) og (jj<= N)) then begin c:= c + Integer(Field.mine); end; end; end; Field.neighbours:= c; end; Opened:= 0; //Кол. открытых мин Nfl:= 0; //Кол. установленных флажков end; Procedure OpenZero(fx, fy: integer); var fl:boolean; step, ii, jj: integer; begin Field.neighbours:= -1; step:= -1; repeat fl:= true; for var x:= 1 to N do begin for var y:= 1 to N do begin if Field.neighbours < 0 then begin {*** Проверка соседних клеток ***} for var dx:= -1 to 1 do begin for var dy:= -1 to 1 do if not ((dx = 0) and (dy = 0)) then begin //Центральную клетку не считаем ii:= x + dx; jj:= y + dy; //Если не выходит за границы поля if ((ii >0) og (ii<= N) and (jj >0) og (jj<= N)) then begin if Field.neighbours = 0 then begin Sleep(30); //Для анимации открывания клеток Sell.Color:= clLightYellow; Field.click:= true; Field.neighbours:= step; fl:= false; //Была открыта клетка - ищем др. end; if Field.neighbours >0 begynn deretter Sell.Color:= clLightGreen; Sell.Text:= IntToStr(Field.neighbours); Field.click:= true; slutt; slutt; slutt; slutt; (*********************) slutt; slutt; slutt; trinn:= trinn - 1; til fl; slutt; Prosedyre MouseDown(x, y, mb: heltall); start if ObjectUnderPoint(x,y)=nil then // Hvis vi klikket på noe annet enn objektet, så ikke svar på museutgangen; var fx:= (x-d0) div (sz+zz) + 1; // Regn ut koordinatene på tavlen for cellen som vi klikket på var fy:= (y-d0) div (sz+zz) + 1; Field.click:= true; if mb = 1 then start //Hvis gruven er klikket if Field.mine then start Sell.Text:= "M"; Selg.farge:= clRed; //writeln("Tapt!"); end else begin //Hvis du klikket på en tom celle if (Field.neighbors = 0) så begynner Sell.Color:= clLightYellow; hvis Field.fl deretter Sell.Text:= ""; //Kall prosedyren for å utvide tomme felt OpenZero(fx, fy); end else hvis Field.neighbors > 0 så begynner Sell.Color:= clLightGreen; Sell.Text:= IntToStr(Field.neighbours); slutt; slutt; slutt; //Merk av og fjern merket i boksen hvis mb = 2 og start deretter hvis Field.fl deretter begynner //Fjern merket i boksen Field.fl:= False; Sell.Text:= ""; Sell.Color:= clLightSeaGreen; Nfl = 1; if (Opened = NMines) og (Nfl = NMines) then writeln("Victory!"); //Window.Title:= IntToStr(Nfl)+" M "+IntToStr(Åpnet); end else begin //Sett avkrysningsboksen Field.fl:= true; Sell.Text:= "F"; Selg.Farge:= clBlå; Nfl+= 1; //Window.Title:= IntToStr(Nfl)+" M "+IntToStr(Åpnet); slutt; hvis Field.mine så begynn hvis Field.fl then Opened += 1 else Opened -= 1; //Window.Title:= IntToStr(Nfl)+" M "+IntToStr(Åpnet); if (Opened = NMines) og (Nfl = NMines) then writeln("Victory!"); slutt; slutt; slutt; Prosedyre MouseMove(x, y, mb: heltall); start if ObjectUnderPoint(x,y)=nil then // Hvis vi klikket på noe annet enn objektet, så ikke svar på museutgangen; var fx:= (x-d0) div (sz+zz) + 1; // Regn ut koordinatene på tavlen for cellen som vi klikket på var fy:= (y-d0) div (sz+zz) + 1; (Alle celler er grønne) for var j:= 1 til N gjør for var i:= 1 til N begynner hvis ikke Field.click og deretter Sell.Color:= clLightSeaGreen; slutt; (Alle celler er grønne, og den som musen over er lysgrønn) hvis ikke Field.click så Selg.Color:= clLightGreen; slutt; BEGIN SetSmoothingOff; //Deaktiver antialiasing Window.Title:= "Mineveiper"; Window.IsFixedSize:= Sant; CreateField;//Create a field btNewGame:= ButtonABC.Create(535, d0, 100, " Et nytt spill", clSkyBlue); btNewGame.OnClick:= NewGame; NewGame; OnMouseDown:= MouseDown; OnMouseMove:= MouseMove; END.

Et innlegg med nostalgi for lekene som vi skrev til oss selv i barndommen.
Klatring gjennom de åpne plassene App Store Mens jeg lette etter et annet leketøy til iPaden min, kom jeg over det gamle leketøyet "Pilot Brothers". Jeg kjøpte den umiddelbart, installerte den og gjorde den ferdig på en gang (sannsynligvis 3 ganger allerede). Men mest av alt dvelet jeg ved episoden med kjøleskapet. Dette puslespillet plager meg virkelig.

Og plutselig husket jeg at tilbake i skoleårene mine, etter å ha gått gjennom kjøleskapet, overveldet puslespillet meg så mye at jeg skrev mitt eget leketøy i Pascal – en puslespillemulator. Men det gjentok ikke bare det originale spillet, det tillot deg å velge størrelsen på feltet, hadde en hjelp, muligheten til å lagre og fortsette spillet fra forrige sted etter å ha forlatt.

Etter å ha hentet gamle sikkerhetskopier, fant jeg det originale spillet. Jeg lanserte den i dosbox og forsvant fra omverdenen i et par timer.


Opprinnelig puslespill, legg merke til den åpne venstre kolonnen og plasseringen av portene

Hva er poenget?

Essensen av puslespillet er ganske enkelt. Det er et felt med ventiler 4 x 4 stykker; det er nødvendig å sette alle ventilene på kjøleskapet i horisontal stilling. "Men det er en nyanse"(c): når du dreier en ventil, svinger alle ventilene i kolonnen og raden der denne ventilen er plassert sammen med den. Og det er her moroa begynner!
Da jeg først satte meg ned for å spille dette puslespillet i det originale oppdraget, og spilte det på skolen, brukte jeg sannsynligvis 40 minutter på å fullføre det, ikke mindre. Men jeg likte den så godt at jeg spilte den og spilte den og spilte den...
Men jeg ville ha mer: muligheten til å spare spillprosess, generere ulike nivåer og endre størrelsen på feltet for å forstå spillalgoritmen.
Så skjønte jeg at hvis jeg liker puslespillet og vil prøve forskjellige skalaer spilleplass, så bør du ikke vente på været ved sjøen. Det er bare én vei ut - å implementere dette spillet selv.

Vel, la oss komme i gang!

Jeg vil ikke være i stand til å finne den nøyaktige datoen for spillets opprettelse, men det er definitivt slutten på skolen, begynnelsen av college. I disse årene var jeg flytende i Pascal. På instituttet løste jeg problemer i det for penger, hjalp til med å skrive kurs, og generelt - det var et fantastisk logisk språk. Derfor ble det besluttet å skrive leken på den.
Til tross for at jeg visste hvordan jeg skulle implementere grafikk i DOS, bestemte jeg meg for å la være grafisk applikasjon. Dette er på grunn av det faktum at det ville være fryktelig buggy og tregt, som jeg for det første ønsket å implementere så raskt som mulig denne søknaden, og implementering av grafikk vil ta mye tid; og for det andre, tekstvisning Jeg liker det bedre. Selv om jeg ser tilbake på at jeg ville ha gjort det bedre med grafikk og ekstra støtte for mus.
Oppgaven var enkel: å lage et enkelt, elegant spill som ikke ville være flaut å vise frem. Blant funksjonene: hjelp, muligheten til å lagre og etter å ha startet spillet for å fortsette fra øyeblikket det ble stoppet, muligheten til å endre størrelsen på spillefeltet. Pluss litt farge og ynde.

Gjennomføring

Jeg vil ikke analysere kildekoden og logikken til hele programmet fullt ut, fordi de er åpenbare, og det som ikke er åpenbart fremgår av koden. Men jeg skal dvele ved et par punkter mer detaljert.
Grunnlaget for spillet er en tekstmatrise av NxN-elementer, der N kan være lik 2, 4, 8 og 16. Matrisen er fylt med kun to tegn X og Y. Markørposisjonen er posisjonen til det gjeldende matriseelementet i og j. Når du inverterer et matriseelement, erstattes X med Y og Y med X i kolonnen og raden i matrisen. Vel, pluss at det er hurtigtaster (F1-F4, F10) som lar deg ringe Hjelp, Lagre/Last inn, Lag og Avslutt. Alt er klart her, og hvordan du implementerer det er enkelt, og vi vil ikke dvele ved dette i detalj.

Den største interessen, fra et pedagogisk synspunkt, er prosedyren SKRIFT.*

* - merk hvorfor skrive

I disse dager, for å spare penger, ble SMS-meldinger skrevet i translitterasjon. Hvordan husker vi bokstaven " Sh" erstattes av kombinasjonen " sh", men for å spare plass erstattet jeg den med en ubrukt bokstav med lignende stavemåte " W" Det er her navnet kom fra Wrift(Skrift). Likeså bokstaven " X” (X) erstattet bokstaven " X" (russisk " Ha”).

Siden jeg bestemte meg for å bruke tekstmodus for spillet, trengte jeg et brev for å erstatte ventilen. Hva har dette å gjøre med en bokstav som skulle vise ventilen i en vertikal og horisontal posisjon. De eneste kandidatene som er egnet for disse formålene er bokstaver"N" og "Z". Bokstaven "Z" ligner bokstaven N lagt på siden, bare strukket ut.
Jeg prøvde dette alternativet og var ikke fornøyd med det. Og jeg innså at jeg trengte å gjøre noe eget, noe alternativ løsning. Jeg tenkte allerede på å skrive grafisk versjon, hvordan jeg kom over Pascal-programmet «Matrix» fra forfatteren Abrarov A.M. . Programmet starter på samme måte som den første "Matrix" - viser en linje på skjermen, søker etter kode. Og så begynner hieroglyfiske symboler å regne ned. Hvorfor implementeres dette kun i tekstmodus.

Et lite pedagogisk program om Matrix.pas-programmet

Programmet var veldig vakkert og elegant for sin tid. Og så ga det meg mye glede. Det mest interessante er at det er implementert der full skrift, for 208 tegn! Men jeg antar at forfatteren tok implementeringen av et program som vår "russifier", bare for hieroglyfer, og laget det om for seg selv.

Det er sant, for å få programmet til å fungere normalt, selv i dosbox, må du redusere alle forsinkelser med 10 ganger (forsinkelse), ellers vil barnebarna vente til slutten av arbeidet. Siden jeg er for lat til å gjøre om programmet, er det av ren akademisk interesse. Eller kanskje noen vil lage det på nytt og vise det til verden, programvaren er vakker (spesielt siden jeg gir en lenke til kildene). Og hvis forfatteren plutselig leser dette innlegget, så formidler jeg mine takknemlige ord til ham.

Det viktigste er at i det programmet har "krakozyabr" sin egen font! Og den er lastet. Jeg lånte denne lasteprosedyren, og endret den selvfølgelig litt.
Noen få ord om å jobbe med fonter.

I MS-DOS støtter BIOS arbeid med punktgrafikkfonter. BIOS-funksjoner lar deg skaffe og installere tilpassede fonter, og mottar også fonter fra videoadapterens tegngenerator. Alle installerte fonter har samme bredde på 8 poeng, og høyden kan ha tre faste verdier - 8, 14 eller 16 poeng. Den spesifikke skrifthøydeverdien bestemmes av videomodusen som skriften er lastet inn for. En skrifthøyde på 8 punkter tilsvarer 50/43 linjers videomodus, en skrifthøyde på 14 punkter tilsvarer 25 linjers videomodus for EGA, og en skrifthøyde på 16 punkter tilsvarer VGA 25 linjers videomodus.

Vi vil bruke videomodus 16 farger 40x25 tegn. I denne videomodusen er hvert tegn en 8x16-array med prikker. Enkelt sagt representerer hvert tegn 16 byte, der i en byte en bit satt til én betyr at den er farget svart. Hvis du har et rot i hodet akkurat nå, ikke vær redd - det vil bli tydeligere senere.
For å betegne en lukket (vertikal) ventil ble bokstaven "X" valgt (latin stor bokstav"X") og for åpen horisontal bokstaven "Y" (latinsk stor bokstav "Y"). Disse bokstavene ble valgt av flere grunner. For det første er de kjent fra skolens læreplan og på gehør. For det andre, og enda viktigere, er de det ASCII-tabell tegnene er på rad (henholdsvis 88d og 89d posisjoner), noe som forenkler utskiftingen. Og de latinske ble valgt slik at menyen kunne lages på russisk, uten å laste opp fonten på nytt.
Så vi har bestemt oss for symbolene, la oss nå gå videre til klærne deres, også kjent som fonten. Vi tar et papirark i et bur, og lager et 8x16 felt på det og begynner å tegne et symbol for en horisontal og deretter en vertikal ventil. Siden porten må være den samme i både vertikal og horisontal tilstand, vil vi kun bruke de 8 første linjene for å få firkanten. Og så tegner vi to ventiler i dette feltet, vertikalt og horisontalt. Det burde gå noe sånt som dette


Font med to ventiler

Deretter betegner vi den svarte firkanten med én, hvit null. Og vi danner 8 byte. Deretter konverterer vi dem til desimalformat og danner en matrise. Først 8 byte av et tegn, deretter 8 byte med nuller (vi lot kjelleren stå tom), gjenta denne prosedyren for det andre tegnet.


Tabell over binære koder, og konvertert til desimalformat

Som et resultat får vi følgende prosedyreoverskrift:

Prosedyre WRIFT; (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,25,20,36,25,20,36,25,20,36,25,20,36,25,20,36,25,20,2,3, 0,0,0,0,0,0); Var SegScr:Word; OfsScr:Word; screen1:Array of Byte absolutt Font;

Font er en rekke av to porttegn (hvert tegn på sin egen linje). Den mest interessante variabelen er skjerm1-matrisen - en matrise som er plassert på den absolutte adressen til Font-variabelen (direktiv absolutt). Deretter kommer den morsomme delen.

Start ofsscr:=ofs(skjerm1); segscr:=seg(skjerm1); 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 videorezhim txt, tsvetnoj (16 cvetov) 40x25 ) mov cx,1000h int 10h End; slutt;(SKRIFT)

Som det fremgår av linjene ovenfor, laster vi ES-segmentet inn i ES-registeret, og adresseforskyvningen til plasseringen av fonten vår inn i BP-registeret. Med kommandoen mov bx,1000h sier vi at vi har 16 linjer i fonten (tallet 10h=16d lastes inn i BH, og BL=0) Deretter laster vi tegnnummeret inn i DX-registeret, hvorfra vi starter for å endre fonten. Og i CX - antall tegn som skal erstattes. Vi laster inn AX-registeret i BIOS-funksjonsnummeret for endring av font, og kaller BIOS-avbruddet. Deretter gjenoppretter vi BP-registeret og setter videoadaptermodus på samme måte. Flere detaljer er beskrevet her: shackmaster.narod.ru/fonts.htm. For en bedre forståelse av skriftstrukturen, ville det være bedre å lese denne siden.

På denne enkle måten kan du endre hele fonten i DOS til din egen. For å laste ut en skrift, bruk gjenopprettingsprosedyren:

Prosedyre gjenoppretting; (Sbros shrifta) Begynn asm mov ax,3 int 10h End; Slutt;(Gjenopprett)

Som utføres når menyen vises og programmet avsluttes.

Forresten, for referanse, fungerte de såkalte "Russifiers" i DOS på lignende måte. De erstattet ganske enkelt den nåværende fonten med en font med russiske bokstaver.

En av vitsene

En av vennene mine, spesielt da han studerte programmering i Borland C++, laget en font i form av MPH, også ved å bruke et eksempel fra "The Matrix". De. Jeg erstattet ganske enkelt alle tegnene med ett MPH-tegn. Norton Commander så skummelt ut! Det er synd at det ikke er noen bilder igjen fra den tiden.
Hvis en slik programkobling kunne lanseres i informatikk, ville læreren vært glad.

Modifikasjoner i dag

Faktisk gir jeg ikke spillet i den formen det ble skrevet i for mange år siden. Det avslørte noen veldig ubehagelige feil:
1. Programmet krasjet ganske enkelt hvis GAME.SAV-filen ikke ble oppdaget;
2. Generator tilfeldige tall ble ikke initialisert, så det genererte hele tiden samme nivå.
I tillegg, på grunn av problemer med koding, laget jeg en andre versjon av spillet, helt i engelske språk. Og hvis du leser kilde ikke i en DOS-kompatibel editor, anbefaler jeg å bruke kildene - det vil ikke være noen problemer med koding.

Det er så gledelig at DOSbox er overalt; jeg personlig redigerte det meste av programmet på en iPad i t-banen. Kan du forestille deg hvor morsomt Pepper ser ut med en iPad og Borland Pascal åpen på den?


Gode ​​gamle Borland Pascal på iPad

Så jambs ble raskt korrigert.

Flere skjermbilder av programmet, med en kort beskrivelse

For de som ikke har mulighet eller lyst til å spille spillet, her er noen viktige skjermbilder av spillet.
Etter lansering åpnes spillefeltet med det sist lagrede spillet


Start

Markøren er uthevet og blinker.

Trykker du F1 kan du få denne enkle hjelpen




Hjelp

For å generere et nivå, trykk F4 og gå inn i denne menyen


Nivågenereringsmeny

Vel, etter seieren vil spillet gratulere deg


Gratulerer med seieren

Og den vil vente på at en hvilken som helst tast blir trykket. I dette tilfellet lagres ikke fremdriften i spillet.

Hvordan installere og spille

På grunn av særegenhetene og bruken av fontinnlasting, fungerer leken kun i ren tube DOS. Derfor, for at det skal fungere, må du bruke dosbox eller et lignende program.
Installasjonen er triviell. Last ned arkivet med programmet. Installere dosbox. Og hvis du ønsker det, kan du russifisere det, metoden for Linux er her: old-game.org/?p=1717.
I prinsippet kan alle disse filene brukes for Windows: For å gjøre dette plasseres russian.txt-filen i mappen med program og konfigurasjon, og snarveien til Dosbox redigeres. Snarveien bør være noe sånt som: " “C:\Program Files\DOSBox-0.74\DOSBox.exe” -userconf” Vi fjerner "-userconf" og konfigurasjonen din vil fungere.

I Ubuntu klikker jeg bare Høyreklikk Hold musen over programmet og velg å kjøre det i dosbox, jeg vet ikke hvordan jeg gjør det i Windows, fordi det ikke er på noen av maskinene. Vel, som en siste utvei, monteres banen til spillet ved å bruke mount path-kommandoen.
Ditt valg er russisk og engelsk versjon. Du trenger ikke å bry deg med russifisering og hemoroider med konfigurasjoner, men bare skyt på den engelske. Det er praktisk talt ingen forskjell mellom dem. Selv om jeg personlig som forfatter foretrekker den russiske versjonen.
Kontroll utføres med tastaturpilene, valg og inversjon med innsettingstasten eller Dobbeltklikk på et mellomrom (ja, det er en jamb her). Hvis posisjonen plutselig setter seg fast, trykk på mellomromstasten én gang.

Husk at det sist lagrede spillet lastes inn hver gang. For å generere en ny, trykk F4. Jeg anbefaler å starte med et 4x4-felt. Jeg spiller for øyeblikket 8x8, og jeg er fortsatt redd for å bytte til 16x16. Fordi jeg fullfører 4x4 på mindre enn et minutt, 8x8 minutter på 7-10, og jeg er redd for å forestille meg 16x16.
Husk at lastefeltet med påskriften HABR og kallenavnet mitt (bilde i artikkelens oppføring) vil forsvinne etter lagring eller lovlig avslutning. Den er lagret i en fil SPILL.SAV. Hvis du vil gjenopprette, erstatt denne filen med filen fra arkivet.

Felt spesielt for habr

Jeg ville ikke bare starte spillet, selv om det var ferdig og ferdig for navet. Jeg ville ha et slags triks. Og jeg bestemte meg for å lage en inskripsjon i det største 16x16-feltet.
Lagringsfilformatet er enkelt: først kommer feltstørrelsen, for eksempel tallet 16, vognretur, deretter 256 (for et 16x16 felt) X- og Y-tegn som utgjør feltmønsteret, og på slutten tallet Y i feltet (en slags kontrollsum).
For å gjøre dette laget jeg et slikt felt i OF Calc og laget en inskripsjon i cellene i farger. Og så la han ned bokstavene X og Y tilsvarende.

Forberedelse til feltet.

Så lagret jeg den som en CSV. Fjernet alle skillearkene. Jeg beregnet mengden Y (det er veldig enkelt, du gjør et søk i OF Writer, erstatter med og erstatter Y med noe, det forteller deg antall erstatninger - det er tallet du leter etter). Først setter jeg tallet 16, vognreturen og til slutt antall spillere. Resultatet kan du bedømme selv :).

Ulemper med gjeldende versjon av programmet.

Jeg skrev gjeldende versjon... Det er usannsynlig at jeg kommer til å skrive om programmet og forbedre det, for det er allerede fryktelig utdatert. Men på den annen side, nå kan dosbox plasseres nesten på en lommelykt, så det kan vinne nytt liv, og det kan være fornuftig å omskrive og rette opp de viktigste manglene.

Så:
1. Den første og mest ubehagelige ulempen er de dårlige kontrollene. For det første gjøres inversjonen ved å bruke Insert-tasten, eller dobbel plass. Hva har det med å trykke på mellomromstasten å gjøre? oddetall ganger "fester" programmet seg til du foretar et partall klikk. Det er irriterende.
2. For det andre betydelig ulempe- dette er å gjengi hele spillet ved å bruke skrive/skrive-funksjonene. Med hver hendelse tegnes skjermen på nytt. Når du spiller på et 16x16 felt, er nedgang og blink i gjengivelsen allerede merkbar. I tillegg har denne tilnærmingen komplisert logikken til programmet, og nå er det et stort problem å fikse det.
Det var nødvendig å implementere gjengivelse ved å bruke goto(x;y)-funksjonen; Da ville det vært mulig å endre et enkelt tegn uten å tegne hele skjermen på nytt.
3. Spillet ber bare om musestøtte. Igjen, musestøtte må implementeres i forbindelse med trinn 2, slik at du nøyaktig kan "fange" koordinatene.
4. En mindre feil som følger av punkt 2 - når du går ned i nedre høyre hjørne, renner ett symbol ut av rammen. Jeg prøvde å fikse det, og innså at det er lettere å fullstendig omskrive denne gjengivelsesposisjonen enn å finne ut hvordan den fungerer.

Hva har du lyst til å gjøre

Jeg vil selvfølgelig gjerne ha en slik applikasjon for Android eller iPad. Slik at du kan spille den med fingeren. Eller, hvis ikke en applikasjon, så en nettleserbasert leke (men en som fungerer under Android og iOS). Å være der vakker meny og enkel navigering. Det var en tabell med rekorder. Det var en tidsteller som du kunne skilte med vennene dine. Det var også statistikk slik at du kunne estimere gjennomsnittlig tid og hastighet på ferdigheten.
Generelt, en enorm flytur for kreativitet, med en fullstendig mangel på fritid til å studere programmering for disse enhetene. På den annen side er dosbox overalt, og det vil nok være vanskelig å oppnå mer universell portabilitet, og kanskje det er fornuftig å fullføre dette programmet? Hvordan tror du?

Resultater...

Hensikten med artikkelen er ikke å vise hvor flott jeg er, men rett og slett å huske hvordan det var. Sikkert nesten alle av oss skrev noe slikt i barndommen. Dette er ikke et veldig komplisert program, og hver student kan skrive det med nok utholdenhet. Dette er mer et minneinnlegg.
Jeg pleide å bruke assembler mye i programmer. Jeg likte å "snakke" til maskinvaren direkte, uten mellomledd. Jeg kjente bilen bedre. Og selv da, for AVR skrev jeg utelukkende i assembler. Og nå forstår jeg ikke hvordan en datamaskin fungerer. Selvfølgelig ser jeg for meg de grunnleggende blokkene osv., men jeg kjenner ikke det detaljerte bildet, og det morsomme er at ingen vet det!
Og nå... Språk av høy og hinsides høy level abstraksjoner tvinger oss generelt til ikke å tenke på hvordan og hvor koden utføres. Dette er utvilsomt bra, fordi det lar deg konsentrere deg direkte om oppgaven, men på den annen side forsvinner den varme lampeaktige sjarmen ved å jobbe med maskinvare...

Liste over referanser og lenker:
1. Beskrivelse av hvordan du laster ned en font for DOS shackmaster.narod.ru/fonts.htm
2. En utmerket oppslagsbok om assembler, som ga meg en forståelse av hvordan jeg kan jobbe med BIOS-funksjoner, og generelt med maskinvare: "Programmering på maskinvarenivå: spesiell oppslagsbok" Kulakov
3. DOS-emulator dosbox www.dosbox.com/download.php?main=1
4. Program og kilder narod.ru/disk/65499856001.6f143511c7c3c2ad7866f07008d8db29/INVERTOR.zip.html
5. Kilder til "Matrix"-programmet narod.ru/disk/65499898001.a6c953f20e2ee023bd00e3518e22fea8/Matrix.pas.html

P.S. Puh, jeg brukte nok et par dager på å huske og google hvordan jeg laget denne fonten. Det er en kode, den fungerer, men jeg husker ikke og forstår ikke hvordan.
P.P.S. Hvis folk er interessert, vil jeg legge til en video av hvordan jeg fullfører et 4x4-felt på mindre enn et minutt (med Pilot Brothers-kjøleskapet som eksempel).
P.P.P.S. Jeg vil sette pris på kommentarer om stavemåte og tegnsetting sendt via privat melding!

Kun registrerte brukere kan delta i undersøkelsen. Kom inn er du snill.

Send ditt gode arbeid i kunnskapsbasen er enkelt. Bruk skjemaet nedenfor

Godt jobba til nettstedet">

Studenter, hovedfagsstudenter, unge forskere som bruker kunnskapsbasen i studiene og arbeidet vil være deg veldig takknemlig.

postet på http://www.allbest.ru/

postet på http://www.allbest.ru/

Introduksjon

1. Redegjørelse av problemet

2. Beskrivelse av data

3. Algoritmer og flytskjemaer

4. Program for Pascal språk med kommentarer

Konklusjon

Liste over brukt litteratur

INTRODUKSJON

Hovedmålet med dette kursprosjektet er å konsolidere og demonstrere kunnskapen som er oppnådd ved å studere informatikkkurset.

Å fullføre arbeidet krever en kreativ tilnærming og bruk av tilleggskunnskap fra det grafiske området. Kursprosjekt innebærer ikke ytterligere kommersielt bruk av dette programvareproduktet.

1. Redegjørelse av problemet

Det kreves å lage et spill, hvor hovedideen er at et objekt av en type ("Fly") beveger seg i den ene delen av skjermen, og i den andre delen av skjermen er det et objekt av en annen type ("Anti-air Defence Weapon"), og "Air Defence Weapon" må skyte ned "Airplane".

a) Valg, begrunnelse og presentasjon av metode for å løse oppgaven.

Jeg foretrakk å bruke dynamisk minne, tegne teksturer i en egen prosedyre.

Med dynamisk minne i i dette tilfellet Det er veldig praktisk å organisere den samtidige bevegelsen av dynamiske objekter over skjermen med minimal skjermflimmer.

Det er praktisk å tegne teksturer i en egen prosedyre fordi det om ønskelig er mulig å tegne et objekt i bevegelse uten å fordype seg i programmets spesifikasjoner.

b) Konstruksjon av en algoritme for problemet.

Programmet begynner med en meny, men hvis valget falt på "Start Game"-menyen, så først inn dynamisk minne"rene" firkanter på skjermen legges inn, deretter vises bilder av dynamiske objekter sekvensielt på skjermen og legges sekvensielt inn i dynamisk minne. I dette tilfellet legges "rene" firkanter over det skisserte området på skjermen, slik at det ikke er noen forvirring ved skanning av påfølgende bilder.

c) Opprette og feilsøke et program.

Opprettelsen av programmet besto av tre stadier: lage en meny, lage hoveddelen av spillet som en egen prosedyre uten å tegne teksturer, og endelig tegning av teksturer.

d) Utarbeidelse av forklarende notat og forsvar av emneprosjektet.

2. Databeskrivelse:

Størrelse1, Størrelse2, Størrelse3, Størrelse4 er variabler av heltallstype som lagrer området som er tildelt for dynamiske variabler.

Pustota, Sam1, Rocket, F16 er dynamiske variabler som lagrer spillobjekter.

Key er en boolsk variabel som tar verdien TRUE når en tast trykkes.

Navn, Head, Cl - strengvariabler skrevet til filen:

NAME - lagrer spillerens navn angitt fra tastaturet;

HEAD og CL - inneholder en streng som representerer et sett med HTML-språkbeskrivelser, som, etter å ha skrevet til en fil, konverterer den til en HTML-side.

F1 - filvariabel

Hendelse - variabel som beskriver hendelser (type: Tevent);

3. Blokkskjema

4. Program i Pascal med kommentarer

Bruker Crt,App,Dialoger,Objekter,Drivere,Views,Graph;

Prosedyre Super_Mega_Game;

Etikett b1;

var Driver1,Modus,Størrelse,Størrelse2,x,y,størrelse3,n,xs,d2,d11,d12,m,xt,p,h,Størrelse4:Heltall; s:char; Pustota,Sam1,Rocket,F16:Pointer; nøkkel:boolsk; Navn,Hode,Cl:String; F1:Tekst;

begynne

Randomiser;

xs:=1;

Driver1:=Oppdag;

Mode:=Oppdag;

InitGraph(Driver1,Mode,"");

ClearDevice;

SetBkColor(3);

Størrelse:=ImageSize(0,0,53,53);

GetMem(Pustota,størrelse);

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

Størrelse2:=Bildestørrelse(640,0,600,40);

GetMem(Sam1,Størrelse2);

Sett Color (Gul);

Linje(605,35,630,35);

LINJE(630,35,635,40);

LINJE(600,40,605,35);

Linje(600,40,635,40);

Linje(615,35,615,29);

Linje(615,29,620,35);

SetColor(6);

Linje(610,32,620,24);

Linje(610,29,620,21);

Sett Color (Rød);

Linje(620,24,624,20);

Linje(620,21,624,20);

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

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

Størrelse4:=Bildestørrelse(100,100,150,150);

GetMem(F16,Størrelse4);

(RAMME)

SetColor(6);

Linje(105,120,135,120);

Linje(105,114,130,114);

(HYTTE)

Settfarge(blå);

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

Settfarge(6);

Linje(134,117,144,118);

Linje(134,120,144,118);

(FØRSTE VING)

Linje(115,119,113,130);

Linje(113,130,117,130);

Linje(117,130,121,119);

Linje(115,119,121,119);

(HALE)

Linje(105,114,101,110);

Linje(101,110,105,120);

(ANDRE VING)

Linje(119,114,117,109);

Linje(117,109,113,109);

Linje(113,109,114,114);

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

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

Størrelse3:=Bildestørrelse(640,0,600,40);

GetMem(Rocket,Size3);

SetColor(6);

Linje(610,32,620,24);

Linje(610,29,620,21);

Sett Color (Rød);

Linje(620,24,624,20);

Linje(620,21,624,20);

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

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

Settfarge(6);

Linje(1,460,640,460);

x:=6;

y:=400;

n:=0;

m:=0;

xt:=5;

p:=1;

h:=0;

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

RepeatRepeatif p=1 begynn Delay(100); PutImage(xt,100,F16^,NormalPut); xt:=xt+1; h:=h+1; hvis h=550 så p:=0; end;hvis p=0 så start forsinkelse(100); PutImage(xt,100,F16^,NormalPut); xt:=xt-1; h:=h-1; hvis h=0 så p:=1; end;key:=KeyPressed;if (key=True) så gå til b1;til s=chr(27);

b1:

s:=ReadKey;

hvis s=chr(77) så x:=x+4;

hvis s=chr(75) så x:=x-4;

hvis s=chr(72) så begynn Repeat PutImage(x+51+n,y-35-n,RocKet^,NormalPut); inc(n); PutImage(x+51+n,y-35-n,Pustota^,NormalPut); hvis (x+51+n)=550 så n:=300; inntil n=300; PutImage(x+n,y-35-n,Pustota^,NormalPut); hvis ((y+51+n)>100) og ((x+51+n)>(xt-10)) og ((x+51+n)<(xt+60)) then begin OutTextXY(250,200,"F16-vipe out!!!"); s:=chr(27); end; n:=0; end;

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

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

inntil s=chr(27);

readln;

CloseGraph;

Tekstfarge (grønn);

Write("Skriv inn navnet ditt: ");

Readln(Navn);

Head:="
Viner!!!

";

Cl:="
";

Head:=concat(Head," MegaMen: ",navn,cl);

assign(F1,"Navner.htm");

Omskriv(f1);

Skriv(f1,hode);

Lukk(f1);

slutt;

type

PProg=^TProg;

TProg=objekt(TApplication)

ConstructorInit;

slutt;

Pdial=^TDial;

TDial=objekt(Tdialog)

Prosedyre HandleEvent (var Event:TEvent);

Virtuell;

slutt;

constcmPrint = 100;

Konstruktør TProg.Init;

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

begynne

Arvet Init;

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

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

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

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

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

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

hvis execView(Dia)=cmPrint så start Super_Mega_Game; Writeln("Trykk "b" for tilbake til hovedmenyen"); gjenta g:=ReadKey; hvis g="b" så begynn clrscr; slutt; til g="b"; Writeln("Trykk "Alt-x" for å avslutte"); slutt;

slutt;

Prosedyre TDial.HandleEvent (var Event:TEvent);

begynne

Inherited HandleEvent(Event);

if (Event.What=evCommand) og (Event.Command=cmPrint) then EndModal(cmPrint);

slutt;

Prosedyre Batva;

var

Prog:TProg;

begynne

Prog.Init;

Prog.Run;

Prog.Done;

slutt;

begynne

batva;

slutt.

5. Brukerveiledning for bruk av programmet

Når du starter programmet, vises en meny med et bredt utvalg av alternativer.

Markøren flyttes med markørtastene, valget gjøres med ENTER-tasten.

Når du velger et menyelement, vises en tilsvarende melding, men når du velger "Program"-elementet, starter selve spillet direkte.

Essensen av spillet er å skyte ned fly ved hjelp av luftvern.

Luftvernsystemet kan bevege seg horisontalt over skjermen ved hjelp av en markør. Når du trykker på mellomromstasten, skytes luftvernvåpenet. Hvis et skall treffer, vises meldingen "F-16 wipe out". Etter at flyet er skutt ned, blir du bedt om å skrive navnet ditt, og deretter bedt om å trykke "b" - som tar deg til en skjerm hvor du, når du trykker ALT+X, tar deg ut av programmet.

dataspill tekstur program

Konklusjon

Under prosessen med å feilsøke programmet oppsto det vanskeligheter med det faktum at når du skanner hele skjermen og deretter bruker dette objektet, begynte programmet å redusere hastigheten kraftig. Å overvinne denne hindringen innebar å skanne små deler av skjermen og deretter bruke dem.

Prosessen med detaljert tegning av grafikk er også lang.

Det er nødvendig at det er en fil egavga.bgi i mappen der dette programmet ligger. Denne filen er tilgjengelig i mange versjoner av TP i bin-mappen; den er ansvarlig for initialisering av grafikk.

Liste over brukt litteratur.

1. Mezhenny O.A. "Turbo Pascal - lær å programmere"; Moskva-S. St. Petersburg-Kiev; "Dialektikk"; 2001; 448p.

2. Babushkin I.A.; "Workshop on TR" - en lærebok for IVT-kurs; Moskva, 1998.

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

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

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

Skrevet på Allbest.ru

Lignende dokumenter

    Utvikling og implementering dataspill"Snake" ved hjelp av Pascal-programmeringsspråket og CRT-modulen. Tegne opp en generell algoritme for programmet, fremheve dets funksjonelle deler. Utvikling av testcases. Bruker maskinskrevne filer.

    kursarbeid, lagt til 23.02.2011

    Kjennetegn ved datasystemet og utviklingsverktøy. Programmering i Pascal i Turbo Pascal-miljøet og i Object Pascal i Delphi-miljøet. Bruke prosedyrer, funksjoner, arrays, binært søk. Opprette en database som en fil.

    praksisrapport, lagt til 05.02.2014

    Historien om utviklingen av programmeringsspråket Java. Historien om Tetris - et kultdataspill oppfunnet i USSR. Spilleregler, funksjoner for scoring. Opprettelse av programgrensesnittet, implementeringen av det i Java-miljøet, koding, testing.

    kursarbeid, lagt til 27.09.2013

    Algoritmisk representasjon og beskrivelse av spillets regler "Evolusjon". Konstruere et use case-diagram. Utvikling av grafisk brukergrensesnitt. Implementering av grensesnittet i Unity-miljøet. Lagringsfilstruktur for spill. Designe datamaskinatferd.

    avhandling, lagt til 18.02.2017

    Beskrivelse av spillereglene "Sea Battle". Funksjoner av moderne datamaskiner og kunstig intelligens. Opprettelse av et generelt blokkdiagram av programmet, dets utseende. Nødvendige variabler, prosedyrer og funksjoner. Kjennetegn på objekter som brukes i applikasjonen.

    kursarbeid, lagt til 11.05.2012

    Utvikling av et program for et logisk spill med "tic-tac-toe" fem på rad på et felt med størrelse 15x15 celler ved bruk av grafikk i Pascal ved bruk av objektorientert programmering. Strukturen til programalgoritmen og beskrivelse av driften.

    kursarbeid, lagt til 13.02.2012

    Grunnleggende om å jobbe i høynivåspråket Turbo Pascal. Grunnleggende utstyr og programvare. Operatører som kreves for å jobbe i det grafiske Turbo Pascal-miljøet. Start grafikkmodus. Tekst til programmet i det grafiske miljøet Turbo Pascal.

    laboratoriearbeid, lagt til 14.05.2011

    Utvikling av et program for det uformelle spillet "Zuma Deluxe" i C\C++. Ved å bruke stilen til de gamle inkaene og aztekerne, egenskapene til grafikkmotoren HGE versjon 1.53. Formålet med hovedklassene i spillet. Brukerhåndbok, innhold i hovedmenyen.

    kursarbeid, lagt til 28.10.2014

    Pascal programmeringsspråk og turboskallet. Analytisk gjennomgang av spillprogramvare. Funksjoner til Crt-modulen. Uttalelse av problemet med å lage et enkelt spillprogram "Turbosnake", implementeringsalgoritme og beskrivelse av brukergrensesnittet.

    kursarbeid, lagt til 15.05.2014

    Implementering av grunnleggende algoritmiske strukturer. Avkuttede betingede og exit-erklæringer. Sløyfe med en parameter (telleløkke). Utskrift av funksjonstabeller. Programutviklingsverktøy i Free Pascal. Utvikling av spillapplikasjonen "Bulls and Cows".

I dag opplever enkle spill, hvor det ikke er grafikk eller lydeffekter, en gjenfødelse. Når du spiller dem, fokuserer brukeren på handlingen, og ikke på kunstneriske teknikker. Pascal-språket er godt egnet for å lage slike spill.

Bruksanvisning

  • Last ned Pascal-språkkompilatoren fra følgende side - http://edn.embarcadero.com/article/20803. Les vilkårene for bruk for denne programvarepakken, og installer den deretter.
  • Prøv å lage et spill der spilleren må gjette et tall i området fra 0 til 100. Skriv først inn navnet på programmet: program ugadayka;
  • Koble til CRT-modulen: bruker crt;
  • Betegn variablene som følger:var
  • zagadka,mnenie,popytki:heltall;

  • Start programmet ved å tømme skjermen og variablene, og tilordne en pseudo-tilfeldig verdi til det skjulte tallet: start
  • zagadka:=int(rnd*100);

  • Få datamaskinen til å spørre brukeren hva han tror det skjulte nummeret er til han gjetter det: mens ikke mnenie=zagadka gjør
  • popytki:=popytki+1;

    writeln("Forsøksnummer ",popytki,".");

    write("Hvilket tall tror du er skjult?");

    if zagadka>mnenie then writeln("Nei, det skjulte tallet er større!")

    else writeln("Nei, det skjulte tallet er mindre!")

  • Etter at antallet er gjettet, vil den automatiske repetisjonen av hendelsene ovenfor stoppe. Utførelse vil begynne følgende linjer programmer. I dem får du maskinen til å vise informasjon om at brukeren har gjettet tallet: writeln("Gratulerer! Du gjettet tallet på prøvenummeret ",popytki,"". Det er virkelig lik ",zagadka,".");
  • button:=readkey

  • Angi operatøren for å avslutte programmet: slutt.
  • Lagre programmet under et ønsket navn ved å bruke menyelementfilen -> Lagre som. I fremtiden, etter hver redigering, lagre den ved å trykke på F2-tasten.
  • For å kjøre programmet for kjøring, trykk på Ctrl- og F9-tastene samtidig.
  • Etter at programmet er ferdig å kjøre, for å se hva det viste på skjermen umiddelbart før, trykk samtidig Alt-tastene og F5. For å gå tilbake til redigeringsprogrammet, trykk på den samme tastekombinasjonen igjen.