{Matopeli} {Yksinkertainen TurboPascalilla ohjelmoitu matopeli} {Julkaistu GPLv3 lisenssillã } {https://www.gnu.org/licenses/gpl-3.0.html} {Ilari Kuoppala 9D} Program matopeli; uses graph,grafiikka,crt; VAR pisteetx,pisteety : array[1..400] of integer; Merkki,merkki2 : Char; pituus,i herkkux,herkkuy pisteet nelio,viive merkkiluettu,herkkutarkistettu : boolean; huijaus : string; Procedure alkudemo; settextstyle(0,0,3); outtextxy(10,10,'tervetuloa matopeliin!'); settextstyle(0,0,2); outtextxy(10,50,'matoa ohjataan nuolin pp imill '); outtextxy(10,70,'peli alkaa kun painat mit tahansa'); outtextxy(10,90,'n pp int. Voit lopettaa milloin'); outtextxy(10,110,'vain painamalla ESC-n pp int.'); outtextxy(10,130,'lisenssi: GPLv3'); Repeat until keypressed; grafiikkatilaan; End; Procedure valmistelemuuttujat; {valmistelee muuttujat pelin aluksi} Randomize; {Vaaditaan jotta random-lukujen arpominen toimii} pituus:=3; {Madon alkupituus} pisteet:=0; {alkupisteet} nelio:=20; {Madon nelion sivun pituus ja herkun halkaisija} viive:=50; {Viive joka suoritetaan pã Ã loopissa, vaikuttaa madon nopeuteen, mitã suurempi viive sitã hitaampi mato} For i:=1 to pituus do begin {suoritetaan jokaiselle madon pisteelle} pisteetx[pituus-i+1]:=0+i*nelio; {asetetaan madon x koordinaattien arvoiksi luvut neliã n sivun pituuden mukaan, kã Ã nteisessã jã rjestyksessã } pisteety[pituus-i+1]:=0; {asetetaan madon y koordinaattien arvoksi 0, kã Ã nteisessã jã rjestyksessã } {For-loopin loppu} Merkki:= _SPACE; {asetetaan muuttujaan merkki aluksi _SPACE} merkki2:=_onuo; { muuttujaan merkki2 alkuarvo } End; { valmistelemuuttujat } Procedure piirramato; {piirtã Ã madon ja herkun setcolor(yellow); {asetetaan piirtovã ri keltaiseksi}
circle(herkkux+nelio div 2,herkkuy+nelio div 2, nelio div 2); {piirretã Ã n herkku} setcolor(lightgreen); {asetetaan piirtovã ri vaaleanvihreã ksi} rectangle(pisteetx[1],pisteety[1],pisteetx[1]+nelio,pisteety[1]+nelio); {piirretã Ã n madon pã Ã } setcolor(green); {asetetaan piirtovã ri vihreã ksi madon hã ntã Ã varten} For i:=2 to pituus do {tehdã Ã n madon toisesta palikasta viimeiseen palikkaan} rectangle(pisteetx[i],pisteety[i],pisteetx[i]+nelio,pisteety[i]+nelio); {piirretã Ã n palikat} End; { piirramato } Procedure {siirtã Ã matoa taulukossa ja pyyhkii hã nnã n viimeisen pisteen} setcolor(black); {asetetaan piirtovã ri mustaksi} rectangle(pisteetx[pituus],pisteety[pituus],pisteetx[pituus]+nelio,pistee ty[pituus]+nelio); {pyyhitã Ã n madon viimeinen palikka pois ruudulta} For i:=1 to pituus do begin {suoritetaan yhtã monta kertaa kuin madossa on neliã itã } pisteetx[pituus-i+1]:=pisteetx[pituus-i]; {siirretã Ã n neliã n x- koordinaattia 1 taaksepã in taulukossa} pisteety[pituus-i+1]:=pisteety[pituus-i]; {siirretã Ã n neliã n y- koordinaattia 1 taaksepã in taulukossa} End; End; { siirramato } Procedure {tarkistaa meneekã mato reunojen yli ja siirtã Ã madon vastakkaiseen reunaan} begin if pisteetx[1] < 0 then {jos mato menee vasemmasta reunasta yli} pisteetx[1] := 640+pisteetx[1]; {siiretã Ã n mato oikeaan reunaan} if pisteety[1] < 0 then {jos mato menee ylã reunasta yli} pisteety[1] := 460+pisteety[1]; {siirretã Ã n mato alareunaan} pisteetx[1]:=pisteetx[1] mod 640; {siirretã Ã n mato vasempaan reunaan kun se menee oikeasta reunasta yli} pisteety[1]:=pisteety[1] mod 460; {siirretã Ã n mato ylã reunaan kun se menee alareunasta yli} Procedure {tarkistaa osuuko mato itseensã } For i:=2 to pituus do {suoritetaan kaikille madon pisteille paitsi pã Ã lle} if (pisteetx[1]=pisteetx[i]) and (pisteety[1]=pisteety[i]) then {jos mato osuu itseensã } merkki:=_esc; {asetetaan muuttujaan merkki _ESC jolloin peli loppuu} End; { tarkistakuolema }
Procedure nappaimet; {luetaan nã ppã inpainallukset ja siirretã Ã n matoa} {... niin lue merkki } If KeyPressed then begin {jos nã ppã intã painettu} Merkki:= ReadKey; {luetaan mitã nã ppã intã painettu} if Merkki = #0 then {jos merkki on tyhjã, se tarkoittaa ettã kyseessã on laajennettu merkki} Merkki:= ReadKey; {eli luetaan seuraava merkki} Repeat {Toistetaan kunnes mato on varmasti liikkunut} merkkiluettu:=true; {oletusarvona merkki on luettu oikein} Case Merkki Of {tutkitaan mitã nã ppã intã on painettu} _YNUO : if not (merkki2 = _ANUO)then {ylã snuolta painettu, kã Ã nnetã Ã n mato menemã Ã n ylã spã in jos se ei ollut menossa alaspã in} {siirretã Ã n matoa taulukossa} pisteetx[1]:=pisteetx[2]; {luodaan uusi pã Ã madolle} pisteety[1]:=pisteety[2]-nelio; {tarkistetaan menikã pã Ã reunojen yli} piirramato; {piirretã Ã n mato {tarkistetaan osuiko mato itseensã } {asetetaan muuttujaan merkki2 merkki jotta myã hemmin tiedetã Ã n mihin suuntaan mato oli menossa}; End else merkki:=merkki2; {jos mato oli menossa aikaisemmin alaspã in, annetaan sen jatkaa alaspã in} _ANUO : if not (merkki2 = _YNUO) then {alasnuolta painettu, kã Ã nnetã Ã n mato menemã Ã n alaspã in jos se ei ollut menossa ylã spã in} pisteetx[1]:=pisteetx[2]; pisteety[1]:=pisteety[2]+nelio; piirramato; End else merkki:=merkki2; _ONUO : if not (merkki2=_vnuo) then {oikealle painettu} pisteetx[1]:=pisteetx[2]+nelio; pisteety[1]:=pisteety[2]; piirramato; painettu} End else merkki:=merkki2; _VNUO : if not (merkki2=_onuo) then {vasemmalle pisteetx[1]:=pisteetx[2]-nelio; pisteety[1]:=pisteety[2];
piirramato; End else merkki:=merkki2; { luettu nã ppã in nuoli vasemmalle } _ESC : merkki:= _ESC else begin {jos nã ppã in oli joku muu} merkki:=merkki2; {kã sketã Ã n madon jatkaa samaan suuntaan kuin aikaisemmin} merkkiluettu:=false; {merkkiã ei luettu oikein eli suoritetaan case lause uudestaan} End; { case } Until merkkiluettu; {jos merkki luettiin oikein ei toisteta} End; { nappaimet } Procedure arvoherkku; {arpoo herkun paikan} Repeat herkkux:=random(640 div nelio)*nelio; {arvotaan herkun x ja y koordinaatit ruudukossa} herkkuy:=random(460 div nelio)*nelio; herkkutarkistettu:=true; {oletetaan ettã herkku ei ole madon sisã llã } For i:=1 to pituus do {tehdã Ã n madon jokaiselle pisteelle} if (pisteetx[i]=herkkux) and (pisteety[i]=herkkuy) then {tarkistetaan onko herkku madon sisã llã } herkkutarkistettu:=false {jos herkku kuitenkin on madon sisã llã arvotaan herkulle uusi paikka} until herkkutarkistettu; { arvoherkku } Procedure tarkistaherkku; {tarkistetaan onko herkku syã ty} if (pisteetx[1]=herkkux) and (pisteety[1]=herkkuy) then begin {jos herkku on samassa paikassa kuin madon pã Ã } pituus:=pituus+1; {mato kasvaa} setcolor(black); {pyyhitã Ã n herkku} circle(herkkux+nelio div 2,herkkuy+nelio div 2, nelio div 2); arvoherkku; {arvotaan uusi herkku} setcolor(lightgreen); {piirretã Ã n pã Ã uudestaan ettei siitã jã Ã puuttumaan paloja} rectangle(pisteetx[1],pisteety[1],pisteetx[1]+nelio,pisteety[1]+nelio); inc(pisteet,1); {lisã tã Ã n piste} if (pisteet mod 5)=0 then {aina viiden syã dyn herkun vã lein} if not (viive < 10) then dec(viive,1); {vã hennetã Ã n viivettã } setcolor(0); {pyyhitã Ã n edellinen luku} _kirjoitakokluku(70,470,3,pisteet-1); _kirjoitakokluku(180,470,2,49-viive); {piirretã Ã n viive
setcolor(15); {piirretã à n uusi luku} _kirjoitakokluku(70,470,3,pisteet); {piirretã à n pisteet _kirjoitakokluku(180,470,2,50-viive); {piirretã à n viive End; { tarkistaherkku } valmistelemuuttujat; {valmistellaan muuttujat} arvoherkku; {arvotaan herkku aluksi} repeat Merkki:=_SPACE; {nollataan merkki uudestaan huijauskoodin takia} Grafiikkatilaan; {siirrytã à n grafiikkatilaan} alkudemo; {piirretã à n alkuohjeet piirramato; {piirretã à n mato aluksi setcolor(15); OutTextXY(10,470,'Pisteet: Nopeus:'); {lisã tã à n teksti line(0,461,640,461); {piirretã à n kentã n raja _kirjoitakokluku(70,470,3,pisteet); {piirretã à n alkupisteet _kirjoitakokluku(180,470,2,50-viive); {piirretã à n viive ReadKey; {odotetaan nã ppã inpainallusta ennen kuin aloitetaan peli} Repeat {pã à looppi} nappaimet; {luetaan nã ppã imet ja siirretã à n matoa} tarkistaherkku; {tarkisteaan onko herkku syã ty} Delay(viive); {Odotetaan hetki jotta pelin nopeus olisi sopiva} Until Merkki = _ESC; {Tehdà à n tã tã kunnes esciã on painettu} Textmode(lastmode); {siirrytã à n tekstitilaan} writeln('onnittelut! Sait ',pisteet, ' pistett.'); {tulostetaan pisteet} readln(huijaus); {odotetaan nã ppã inpainallusta} until huijaus <> 'kissa2' {huijauskoodi} end. {The End}