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
LOOPMukava 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.