Vähän aikaa sitten oli keskustelua mäkihyppypelistä. No naputtelin tässä yhtenä iltana oman versioni. Koodi on hidasta, epäselvää ja monet asiat olisi voitu tehdä paremmin. Heti alussa kannattaa säätää pelin hidastus (Synkkaus muuttuja) sopivaksi nopeuden säätämiseksi sopivaksi ja vilkkumisen vähentämiseksi(screen 7 ja swappailu/pcopy ei toiminut toivotulla tavalla). Ukko hyppää ylöspäin napista ja nojautumista säädetään F ja H-napeista.
Lakeutuminen tapahtuu T-napista. Alkuksi en edes ajatellut julkaisevani tätä täällä, mutta... ehkä jonain kauniina päivänä teen tuosta vielä uuden version. :)
' ************************************** ' * BASIC SKIJUMP * ' * (c) Copyright 2003 Mika Kemppainen * ' ************************************** CLS SCREEN 13 DIM Synkkaus AS LONG 'Arvo, joka odotetaan ennenkuin lähdetään Synkkaus = 20000 'Uteen looppiin. 700MHz koneella dossissa sopiva arvo 'Oli 20000. Vaikuttaa pelin nopeuden ohella myös 'ruudun välkkymiseen DIM hyppyriy(200) 'Hyppyrin Y-arvot kohdassa hyppyriy(x) hyppyriy(0) = 10 'Hyppyrin Y-alkuarvo hjyrkkyys = 1 'Hyppyrin jyrkkys alussa DIM makiy(500) 'Mäen Y-arvot kohdassa makiy(x) 'Mäen Y-alkuarvo laitetaan myöhemmin mjyrkkyys = 0 'Mäen jyrkkyys alussa demo = 1 GOTO aloitus 'Ei tarvitse nollata muuttujia ensimäisellä kerralla uusihyppy: uhyp = 1: ulen = 0: umaa = 0: alastulo = 0 pituus = 0: pisteet = 0: tuomari1 = 0: tuomari2 = 0: tuomari3 = 0 loppupisteet = 0: jumppi = 0: suksiy1 = 0: suksiy2 = 0 vauhti = 0: katsox = 0: katsoy = 0: ualkux = 15: ualkuy = 10 kumarrus = 1: ukkoliikkeella = 0: odottelu = 0: GOTO paalooppi aloitus: katsox = 0 'Missä kohtaa sijaitsee ruudun yläkulma katsoy = 0 'X- ja Y-akseleilla suuntax = .2 suuntay = .2 ualkux = 15: ualkuy = 10 kumarrus = 1 'Missä asennossa hyppääjä on hypyn alussa 'Piirretään hyppyri ja tallennetaan y-arvot taulukkoon LINE (0, 10)-(10, 10), 3 FOR hx = 11 TO 170 hjyrkkyys = hjyrkkyys - .007 'Hyppyrn jyrkkyys vähenee hyppyriy(hx - 10) = hyppyriy(hx - 11) + hjyrkkyys PSET (hx, hyppyriy(hx - 10)), 3 NEXT hx 'Lasketaan, asetetaan mäen arvot ja piirretään mäki makiy(0) = hyppyriy(160) + 20 LINE (170, hyppyriy(160))-(170, makiy(0)), 3 FOR mx = 170 TO 550 mjyrkkyys = mjyrkkyys + .003 makiy(mx - 169) = makiy(mx - 170) + mjyrkkyys PSET (mx, makiy(mx - 169)), 4 NEXT LINE (80, 75)-(210, 90), 15, BF LOCATE 11, 12: PRINT "BASIC SKI JUMP" SLEEP 4 LINE (80, 75)-(210, 90), 0, BF paalooppi: 'PŽŽLOOPPI DO 'Pyyhitään hyppyri ja mäki LINE (0 - katsox, 10 - katsoy)-(10 - katsox, 10 - katsoy), 0 FOR hx = 11 TO 170 PSET ((hx - katsox), hyppyriy(hx - 10) - katsoy), 0 NEXT hx LINE (170 - katsox, hyppyriy(160) - katsoy)-(170 - katsox, makiy(0) - katsoy), 0 FOR mx = 170 TO 550 PSET (mx - katsox, makiy(mx - 169) - katsoy), 0 NEXT mx LINE (470 - katsox, makiy(300) - katsoy - 2)-(470 - katsox, makiy(300) - katsoy + 2), 0 'Annetaan uusi "katsomon" kohta 'ja tutkitaan näppäimet ja liikutetaan ukkoa yms. IF demo = 1 THEN IF katsox > 250 THEN : suuntax = INT(RND * 1) * -1 - .1 IF katsox < -100 THEN : suuntax = INT(RND * 1) * 1 + .1 IF katsoy > 50 THEN : suuntay = INT(RND * 1) * -1 - .1 IF katsoy < -50 THEN : suuntay = INT(RND * 1) * 1 + .1 katsox = katsox + suuntax katsoy = katsoy + suuntay IF nappain$ = " " THEN : CLS : demo = 0: katsox = 0: katsoy = 0: uhyp = 1 END IF 'Tapahtumat hyppyrissä oltaessa IF uhyp = 1 THEN 'Piirretaan ukkelia LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 0 'Ukon sukset LINE (ualkux, hyppyriy(ualkux - 10))-(ualkux, ualkuy), 0 'Ukon jalat LINE (ualkux, ualkuy)-(ualkux + 4, hyppyriy(ualkux + 4 - 10) - 5), 0 'Ukon vartalo SELECT CASE nappain$ CASE CHR$(0) + CHR$(77): ukkoliikkeella = 1 CASE CHR$(0) + CHR$(72) IF ualkux > 147 AND ualkux < 151 THEN uhyp = 0: ulen = 1: kiih = -.22: GOTO ulento ELSE uhyp = 0: ulen = 1: kiih = RND * -.165: GOTO ulento END IF END SELECT IF ukkoliikkeella = 1 THEN vauhti = vauhti + .0045 ualkux = ualkux + vauhti ualkuy = hyppyriy(ualkux - 10) - 4 IF ualkux > 164 THEN : uhyp = 0: ulen = 1: GOTO ulento END IF suksiapu = ualkux - 14 IF suksiapu < 0 THEN suksiapu = 1 suksiy1 = hyppyriy(suksiapu) - 1 suksiy2 = hyppyriy(ualkux + 5 - 10) - 1 LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 2 LINE (ualkux, hyppyriy(ualkux - 10))-(ualkux, ualkuy), 6 LINE (ualkux, ualkuy)-(ualkux + 4, hyppyriy(ualkux + 4 - 10) - 5), 7 END IF nappain$ = INKEY$ IF nappain$ = CHR$(27) THEN : END 'Tapahtumat lennon aikana ulento: IF ulen = 1 THEN IF nappain$ = "t" THEN IF makiy(jumppi) - (hyppyriy(160) + katsoy) > 20 THEN CLS : PRINT "Putosit ja kuolit": SLEEP: END ELSE LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 0 LINE (ualkux, ualkuy + 3)-(ualkux + 3, ualkuy), 0 LINE (ualkux + 3, ualkuy)-(ualkux + 5, ualkuy - 2), 0 alastulo = 1: pituus = jumppi / 3 END IF END IF IF kumarrus = 1 THEN LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 0 LINE (ualkux, ualkuy + 3)-(ualkux + 3, ualkuy), 0 LINE (ualkux + 3, ualkuy)-(ualkux + 5, ualkuy - 2), 0 END IF IF kumarrus = 2 THEN LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 0 LINE (ualkux, ualkuy + 3)-(ualkux + 3, ualkuy + 1), 0 LINE (ualkux + 3, ualkuy + 1)-(ualkux + 5, ualkuy), 0 END IF IF kumarrus = 3 THEN LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 0 LINE (ualkux, ualkuy + 3)-(ualkux + 3, ualkuy + 2), 0 LINE (ualkux + 3, ualkuy + 2)-(ualkux + 6, ualkuy + 1), 0 END IF IF nappain$ = "f" THEN IF kumarrus = 2 THEN : kumarrus = 1 IF kumarrus = 3 THEN : kumarrus = 2 END IF IF nappain$ = "h" THEN IF kumarrus = 2 THEN : kumarrus = 3 IF kumarrus = 1 THEN : kumarrus = 2 END IF ualkux = ualkux + 0 katsox = katsox + vauhti IF katsox < 100 THEN IF kumarrus <> 1 THEN : kiih = kiih + .0063 IF kumarrus = 1 THEN : kiih = kiih + .0056 END IF IF katsox > 99 AND katsox < 200 THEN IF kumarrus <> 2 THEN : kiih = kiih + .0062 IF kumarrus = 2 THEN : kiih = kiih + .005 END IF IF katsox > 199 THEN IF kumarrus <> 3 THEN : kiih = kiih + .0061 IF kumarrus = 3 THEN : kiih = kiih + .0053 END IF katsoy = katsoy + kiih jumppi = katsox - (170 - ualkux) IF jumppi >= 0 THEN IF hyppyriy(160) + katsoy > makiy(jumppi) THEN IF alastulo <> 0 THEN ulen = 0: umaa = 1: GOTO umaassa ELSE CLS : PRINT "Kuolittt": SLEEP: END END IF END IF END IF IF kumarrus = 1 THEN LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 2 LINE (ualkux, ualkuy + 3)-(ualkux + 3, ualkuy), 6 LINE (ualkux + 3, ualkuy)-(ualkux + 5, ualkuy - 2), 7 END IF IF kumarrus = 2 THEN LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 2 LINE (ualkux, ualkuy + 3)-(ualkux + 3, ualkuy + 1), 6 LINE (ualkux + 3, ualkuy + 1)-(ualkux + 5, ualkuy), 7 END IF IF kumarrus = 3 THEN LINE (ualkux - 4, suksiy1)-(ualkux + 5, suksiy2), 2 LINE (ualkux, ualkuy + 3)-(ualkux + 3, ualkuy + 2), 6 LINE (ualkux + 3, ualkuy + 2)-(ualkux + 6, ualkuy + 1), 7 END IF END IF 'Tapahtumat takaisin maanpinnalle tultaessa ja oltaessa umaassa: IF umaa = 1 THEN LOCATE 1: PRINT "Hyppäsit:"; pituus; "m" LINE (ualkux - 5, suksiy1)-(ualkux + 4, suksiy2), 0 LINE (ualkux, makiy(jumppi) - katsoy)-(ualkux, makiy(jumppi) - katsoy - 3), 0 LINE (ualkux, makiy(jumppi) - katsoy - 4)-(ualkux + 1, makiy(jumppi) - katsoy - 8), 0 vauhti = vauhti - .01 ualkux = ualkux + vauhti jumppi = jumppi + vauhti suksiy1 = makiy(jumppi - 4) - 1 - katsoy suksiy2 = makiy(jumppi + 5) - 1 - katsoy IF jumppi < 370 THEN LINE (ualkux - 5, suksiy1)-(ualkux + 4, suksiy2), 2 LINE (ualkux, makiy(jumppi) - katsoy)-(ualkux, makiy(jumppi) - katsoy - 3), 6 LINE (ualkux, makiy(jumppi) - katsoy - 4)-(ualkux + 1, makiy(jumppi) - katsoy - 8), 7 END IF END IF 'Piirretään hyppyri ja mäki uuteen kohtaan LINE (0 - katsox, 10 - katsoy)-(10 - katsox, 10 - katsoy), 3 FOR hx = 11 TO 170 PSET (hx - katsox, hyppyriy(hx - 10) - katsoy), 3 NEXT hx LINE (170 - katsox, hyppyriy(160) - katsoy)-(170 - katsox, makiy(0) - katsoy), 3 FOR mx = 170 TO 550 PSET (mx - katsox, makiy(mx - 169) - katsoy), 4 NEXT mx LINE (470 - katsox, makiy(300) - katsoy - 2)-(470 - katsox, makiy(300) - katsoy + 2), 1 FOR x = 1 TO Synkkaus: NEXT IF umaa = 1 THEN odottelu = odottelu + 1 IF odottelu = 100 THEN tuomari1 = INT((pituus / 4.75 - RND * 2.5) * 10) / 10 tuomari2 = INT((pituus / 4.75 - RND * 2.5) * 10) / 10 tuomari3 = INT((pituus / 4.75 - RND * 2.5) * 10) / 10 loppupisteet = INT((1.2 * (pituus - 50) + tuomari1 + tuomari2 + tuomari3) * 10) / 10 LOCATE 22: PRINT tuomari1; tuomari2; tuomari3 LOCATE 23: PRINT " Pisteet:"; loppupisteet SLEEP kysyuud: LOCATE 10: INPUT "Haluatko hypätä uudestaan?", ke$ IF ke$ <> "k" AND ke$ <> "e" THEN : GOTO kysyuud IF ke$ = "k" THEN : CLS : GOTO uusihyppy IF ke$ = "e" THEN : CLS : END END IF END IF LOOP
Mukava peli kaikin puolin. Vilkkuminen tosin häiritsee, saisikohan sen pois jollain tavalla?
ihan hieno vinkki tuo on..
miten toteutit tuon suksen kulman muuten?
Kaksoispuskurointi on koettu monesti hyväksi keinoksi, mutta miten se toteutetaan qbasicissa? Joku joka osaa voisi kirjoittaa esimerkin. Siitä olisi apua varmaan monelle.
Suksen kulma muokkautuu tietyssä kohdassa mäen pinnan mukaan.
SCREEN 7 ja PCOPY niin onnistuu suhteellisen näppärästi. Mode13hssa se onkin sitten hieman huonompi homma, pitäisi varata muistit ym, minkä jälkeen QB:n perus graffakomennot eivät enää toimisikaan. Ehkä voisi olla mahdollista pokettaa jonnekin EXE:n muistiin varatun muistialueen segmentti 0xA000:n tilalta, mutta se meneekin jo sitten melkoiseksi purkaksi :)
Itse vinkistä, mukava vinkki, en tosin jaksanut algoritmista puolta sen tarkemmin tarkkailla. Mutta sisennykset, sisennykset... ;)
Niin, selkeämpäähän se olisi.
Hyvä!
jos sais binääri version... (en omista QBasicii, vaa VB:n
QBasicin voit ladata kirjoittamaalla Googleen QBasic Download ja klikkaamalla "Download: DOS"-linkkiä ja sitten QBASIC.EXEä. Laillisuudesta ei tietoa...
Hieno!
Aihe on jo aika vanha, joten et voi enää vastata siihen.