Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Painovoimasimulaatio

Sivun loppuun

arcatan [27.10.2002 10:21:25]

#

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$ <> ""
LOOP

arcatan [28.10.2002 08:14:35]

#

Kommentteja, kiitos, kuten kaikki sanovat.

Hipo [28.10.2002 09:34:34]

#

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. :)

vipa [28.10.2002 14:55:51]

#

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.

arcatan [28.10.2002 15:14:03]

#

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.

KimmoKM [28.10.2002 16:52:04]

#

Erittäin upea ja aidon tuntuinen!

snakari [28.10.2002 17:32:39]

#

aika hieno

Vilikki [28.10.2002 21:56:08]

#

Ihan tyylikäs. Hypotenuusa? Se tuli ainakin meille vasta ysillä... Skede manageri rullaa... ;-)

Jaakko [29.10.2002 15:23:29]

#

peelot kattoo subtv:tä

Jaakko [29.10.2002 15:25:44]

#

en sanois "simulaatioks"

Gwaur [03.11.2002 01:50:04]

#

...(tai nimihirviö)
:D ja LOL

Thief [01.03.2003 19:19:51]

#

Aika jännä viritelmä. Sain muuten osuman arvoilla 30 ja 200. ;D

Gwaur [11.07.2003 19:02:54]

#

eikös tää kuuluis ennemminkin peleihin?
Muutes, miten lisätään uus planeetta?

arcatan [12.08.2003 07:25:54]

#

Ehkäpä tämä kuuluisi..

Gwaur kirjoitti:

Muutes, miten lisätään uus planeetta?

Oikeastaan voisin tehdä koodiin muutoksen, joka helpottaa asiaa.

arcatan [12.08.2003 07:30:14]

#

Noniin, nyt vain muokkaat muuttujaa pallojenmaara ja määrittelet uuden planeetan.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta