Tämä on tällläinen pieni peli, jossa ollaan avaruudessa ja laukaistaan raketti, ja sen on tarkoitus osua punaiseen "planeettaan". SubTV :llä pyörii tämän tapainen peli. Homma toimii antamalla kulman ja nopeuden raketille ja sitten se lähtee ajamaan ja kääntyy planeettojen vetovoiman mukaan. Koodi ei varmasti ole parasta mahdollista mutta toimii. Koodin pitäisi olla kommentoitua ja fyysikka-osuus on sitten ihan sovellettua... ei välttämättä ollenkaan oikein.
03.03.03 muokkaus: korjasin koodin Hipon kommentin mukaan.
12.08.03 muokkaus: nyt on helpompi lisätä planeettoja, muokkaa vain arvoa pallojenmaara ja määrittelee uuden planeetan.
'Avaruuspainovoimasimulaatio (tai nimihirviö :)
'Copyright Miikka Koskinen
'SAA KÄYTTÄÄ TÄYSIN VAPAASTI EPÄKAUPALLISIIN TARKOITUKSIIN.
'KAUPPALISIIN TARKOITUKSIIN KYSYTTÄVÄ TEKIJÄN LUPA.
'käytämme dynaamista muistin varausta, luulisin
'$DYNAMIC
'määritellään planeetat
TYPE pallo
x AS INTEGER 'x-koordinaatti
y AS INTEGER 'y-koordinaatti
r AS INTEGER 'ympyrän säde
c AS INTEGER 'väri
END TYPE
'ja se raketti
TYPE objekti
x AS SINGLE 'x
y AS SINGLE 'y
c AS INTEGER 'väri
m AS INTEGER 'massa
xs AS SINGLE 'x-nopeus
ys AS SINGLE 'y-nopeus
END TYPE
'planeettojen määrä
CONST pallojenmaara = 4
CONST maalivari = 12
'luodaan (?) muuttujia
DIM SHARED p(pallojenmaara-1) AS pallo, o AS objekti
'näyttötila 640x480x16
SCREEN 12
'määritellään planeetat
p(0).x = 600
p(0).y = 320
p(0).r = 10
p(0).c = maalivari
p(1).x = 300
p(1).y = 300
p(1).r = 20
p(1).c = 9
p(2).x = 500
p(2).y = 200
p(2).r = 20
p(2).c = 9
p(3).x = 200
p(3).y = 20
p(3).r = 10
p(3).c = 9
'määritellään raketti
o.x = 10
o.y = 10
o.m = 10
o.c = 10
PI = 4 * ATN(1) 'lasketaan pii
SUB piirto
CLS 'putsataan näyttö
'piirretään lähtöpiste
PSET (o.x, o.y), o.c
'piirretään ympyrät
FOR i = 0 TO pallojenmaara-1
CIRCLE (p(i).x, p(i).y), p(i).r, p(i).c
PAINT (p(i).x, p(i).y), p(i).c, p(i).c
NEXT i
END SUB
piirto
DO
'kysytään kulma & nopeus
LOCATE 5, 1
DO
INPUT "Kulma (0-90)"; kulma!
LOOP UNTIL kulma! >= 0 AND kulma! <= 90
DO
INPUT "Nopeus (0-10)"; s!
LOOP UNTIL s! >= 0 AND s! <= 10
o.x = 10
o.y = 10
o.xs = COS(PI * kulma! / 180) * s! 'x-nopeus on kolmion sivun pituus
o.ys = SIN(PI * kulma! / 180) * s! 'y-nopeus myös
piirto
'kymmenentuhatta kertaa käydään läpi
FOR i = 0 TO 10000
o.x = o.x + o.xs 'liikutaan
o.y = o.y + o.ys 'liikutaan
'tarkistetaan onko törmätty johonkin planeettaan tms.
tormaysvari = POINT(o.x, o.y)
IF tormaysvari <> 0 AND tormaysvari <> o.c THEN EXIT FOR
'piirretään piste
PSET (o.x, o.y), o.c
'sitten tullee fysiikka-osuus eli lasketaan vetovoimat
FOR j = 0 TO pallojenmaara-1
x = p(j).x - o.x 'pisteiden etäisyys
y = p(j).y - o.y 'x ja y
r = SQR(x * x + y * y) 'pisteiden etäisyys (lasketaan hypotenuusa)
F = 10 * ((p(j).r * o.m) / (r * r)) 'painovoima pisteiden välillä
a = F / o.m 'kiihtyvyys
'lisätään nopeuteen kiihtyvyys
o.xs = o.xs + x / r * a
o.ys = o.ys + y / r * a
NEXT j
'tässä hidastetaan vähän, niin on kivempi
WAIT &h3da, &h8
NEXT i
'ilmoitetaan tulos
LOCATE 8, 1
PRINT "---------------------"
PRINT "Kulma = "; kulma!
PRINT "Nopeus = "; s!
IF tormaysvari = maalivari THEN
PRINT "Voitit!"
ELSE
PRINT "Hävisit!"
END IF
PRINT "Paina ESC, jos haluat lopettaa"
DO
x$ = INKEY$
IF x$ = CHR$(27) THEN END
LOOP UNTIL x$ <> ""
LOOPKommentteja, kiitos, kuten kaikki sanovat.
Ihan kiva, vaikka liikkuukin hassusti, kun voima lisätään väärin. Jo pituudesta voi huomata, että se on väärä, kun lasket tosta lisätystä nopeudesta hypotenuusan. Hieman vektorimatikkaa, skaalataan vektori nopeuden pituseks, eli jaetaan pituudella ja kerrotaan nopeuden määrällä. if-sössöjen tilalle:
o.xs = o.xs + x / r * a
o.ys = o.ys + y / r * a
Niin ja se on siis pieni a, ei iso. :)
Mää tiedän ton koodin kirjoittajan ja se on tosi hikke. Sil ja paril sen kaveril on meneillään skeittimanageripeli. Mää oon sen beta-testaaja.
Joo, siis ensinnäkin milloin kommentteihin tulee rekisteröintipakko. Ja kaikki nyt tietää että mä ja snakari ja vilikki ja tatu ja jarkko tehdään Skede Manageria, ja harkitsen vakavissani, että Vipa ei olekkaan enää betatestaaja. Ja tuo matematiikka on sen takia pielessä että kun katsos meillä ei ole yläasteella matemattikassa opetettu vielä mitään kovin ihmeellistä, niin tuo on ihan päästä vedettyä koodia. Se oli alunperin pieni a mutta muuttui vahingossa isoksi, kiitos qb-editorin.
Erittäin upea ja aidon tuntuinen!
aika hieno
Ihan tyylikäs. Hypotenuusa? Se tuli ainakin meille vasta ysillä... Skede manageri rullaa... ;-)
peelot kattoo subtv:tä
en sanois "simulaatioks"
...(tai nimihirviö)
:D ja LOL
Aika jännä viritelmä. Sain muuten osuman arvoilla 30 ja 200. ;D
eikös tää kuuluis ennemminkin peleihin?
Muutes, miten lisätään uus planeetta?
Ehkäpä tämä kuuluisi..
Gwaur kirjoitti:
Muutes, miten lisätään uus planeetta?
Oikeastaan voisin tehdä koodiin muutoksen, joka helpottaa asiaa.
Noniin, nyt vain muokkaat muuttujaa pallojenmaara ja määrittelet uuden planeetan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.