Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Vesipisarat muodostavat järviä

Sivun loppuun

hunajavohveli [05.09.2003 21:07:52]

#

Ohjelma simuloi veden virtausta, valumista, tippumista, aaltoilua, ja kaikenlaisia muita liikkeitä. Taulukossa on varattu tila veden jokaiselle pisaralle (pikselille), joita ohjelma liikuttaa kutakin erikseen. Niitä on yhteensä 4000. Kaksi pisaraa ei voi liikkua toisensa päälle, joten jos iso määrä pisteitä törmää yhteen ne järjestäytyvät isoksi vesimassaksi ja muodostavat niin sileän pinnan kuin mahdollista. Kokeile itse niin näet.

Edit 2019 by mod: Vaihdettu nopeuden säätöön TIMER, niin vinkki toimii myös nykyisillä koneilla ja FreeBASICilla.

SCREEN 13

'kokonaisluvut käyttöön
DEFINT A-Z

'pisaroiden määrä ja tiedot
drops = 3999
DIM drop(3999, 3)

FOR a = 0 TO drops
  'arvotaan x ja y
  drop(a, 0) = INT(RND * 320)
  drop(a, 1) = INT(RND * 50)
NEXT a

'piirretään esteitä
CIRCLE (10, 100), 140, , , , .5
CIRCLE (309, 100), 140, , , , .5

LINE (0, 199)-(159, 169)
LINE (160, 169)-(319, 199)

t# = TIMER
DO
  t# = t# + 0.015
  WHILE TIMER < t#: WAIT &h3da, &h8: WEND
  FOR a = 0 TO drops
    'kumita pisara edellisestä paikasta
    PSET (drop(a, 0), drop(a, 1)), 0
    IF POINT(drop(a, 0), drop(a, 1) + 1) = 0 THEN
      'jos alapuolella tyhjää, liikuta pisaraa alaspäin
      drop(a, 1) = drop(a, 1) + 1
    ELSE
      IF drop(a, 2) <> 0 THEN
        'jos pisaran virtaussuunta on määritelty (ei ole 0, vaan 1 tai -1),
        'pistetään muistiin x tällä hetkellä, liikutetaan pisaraa virtaussuuntaan
        x = drop(a, 0)
        drop(a, 0) = drop(a, 0) + drop(a, 2)
        ' jos uusi sijainti ei ole tyhjä paikka, palautetaan x edelliseksi, vaihdetaan virtaussuunta vastakkaiseksi
        IF POINT(drop(a, 0), drop(a, 1)) <> 0 THEN
          drop(a, 0) = x
          drop(a, 2) = -drop(a, 2)
        END IF
      ELSE
        'jos pisaran virtaussuunta ei ole määritelty, arvotaan suunta (1 tai -1)
        drop(a, 2) = -1 + CINT(RND * 1) * 2
      END IF
    END IF
    'piirretään pisara
    PSET (drop(a, 0), drop(a, 1)), 9
  NEXT a
LOOP UNTIL INKEY$ <> ""

Antti Laaksonen [07.09.2003 12:20:29]

#

DEFINT A-Z aiheuttaa sen, että muuttujien tyyppi on oletuksena INTEGER. Sen vuoksi muuttujien käsittely on nopeampaa ja ohjelmakin nopeutuu.

hunajavohveli [07.09.2003 13:51:01]

#

Jotain sen tapaista arvelinkin, kun huomasin, että on sellaisiakin kuin DEFSTR (string) tai vaikka DEFDBL (double). Mutta mikä tuo A-Z on?

Antti Laaksonen [07.09.2003 15:56:42]

#

DEFINT-komennon parametri määrittää, millä kirjaimella alkavat muuttujat ovat automaattisesti INTEGER-tyyppisiä - tässä tapauksessa siis kaikki muuttujat. Tuossa ohjelmassa oikeastaan riittäisi DEFINT A-B, D (muuttujat ovat a, b, drop ja drops).

Gwaur [07.09.2003 17:00:42]

#

tällainen on hyvä hidastustapa: (hth opetti)

alkuaika = TIMER
DO: LOOP UNTIL TIMER - alkuaika >= 0.33 'tähän kuinka monta sekuntia hidastetaan

tuon pistät loopin loppuun niin hvyin toimii =)

tejeez [08.09.2003 17:09:03]

#

eipäs q do while inp(&H3da) and 8 : loop
do until inp(&H3da) and 8: loop

tejeez [08.09.2003 17:15:40]

#

Tulee aika siisti ku muuttaa esteiden piirtämisen silleen et tekee 30 viivaa random paikkoihin, hienosti menee toi vesi xD

akx [26.09.2003 19:18:19]

#

En saa toimimaan QuickBasicilla :|

Porttaan BlitzBasicille :)

akx [26.09.2003 20:04:52]

#

.. BlitzBasic on liian hidas :|
Porttaan C:lle. Prkl.

hunajavohveli [27.09.2003 00:20:13]

#

Jos on liian hidas niin pienennä pisaroiden määrää. Katso myös vesipisarat 2 paineversio. Miksei QuickBasicilla toimi? Mulla ainakin toimii alkuperäinen ja 4.5.

moptim [08.10.2007 17:02:21]

#

Makia toi on. Mikä muuten toi 0x3DA mahtaa olla?


Sivun alkuun

Vastaus

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

Tietoa sivustosta