Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: FreeBASIC: ASCII-lumisade

Sivun loppuun

E.K.Virtanen [15.10.2006 02:10:11]

#

Ensimmäinen ASCII lumisateeni ei tainnut päästä (ja syystäkin kyllä) vinkkeihin joten tein siitä version 2.0.

Tässä ideana on perus lumisade ASCII merkeillä mutta kuitenkin niin että maahan saapuva lumi tekee lumikasaa hieman realistisemmin kuin tavallinen "LOCATE x,y : PRINT lumi$" ja sitten ko. kursorin kohta onkin "täytetty".

IF THEN helvetin kera koodi ottaa selvää mitä löytyy taulukosta(x,y) ja toimii tarpeen mukaan. Alkoilla on neljä eri arvoa. Tyhjä, 1-,2 hiutaletta tippunut tai se on jo täynnä. Mikäli yksi kohta "lumikasasta" rupeaa saamaan tornimaisia korkeuksia verrattuna vieressä oleviin kohtiin, tämä torni "leviää" sivuille päin.

Kestää hetken ennen kuin ko. "efekti" alkaa paremmin näkymään. Ottaen huomioon että käytettävissä on käytännössä vain 4 erilaista ASCII merkkiä joilla täytellä ja levitellä kasaa niin uskoisin onnistuneeni varsin hyvin.

Pienillä muutoksilla toimii myös QB:lla.

' ASCII lumisade ver. 2.0 by lurah
' www.ascii-world.com vähän wanab urlia tänne tietenkin. En pahastu jos modet tämän poistavat ;D
' testattu FreeBASIC .18b-linux
' toimii kyllä win ja dos32 versioillakin

' public domain = tehkää mitä lystäätte.


Randomize Timer
SCREEN 13
Color 15, 0 : CLS
Const SF = 5
Const Full = 4
Const Medium = 3
Const Low = 2
Const Empty = 1

' Lisää lunta ruutuun
SUB RandNew(X AS Integer, DemoScreen() AS Integer)
   DIM AS Integer XLoc, YLoc
   XLoc = INT(RND * X) + 1
   YLoc = INT(RND * 40) + 1
   DemoScreen(XLoc, YLoc) = SF
END SUB

DIM AS Integer Chars(5)
   Chars(5) = 46
   Chars(4) = 219
   Chars(3) = 220
   Chars(2) = 95
   Chars(1) = 32
DIM AS Integer CounterX, CounterY

' tämä taulukko näkyy ruudulla. luodaan siihen "alkutilanne"
DIM AS Integer DemoScreen(25, 40)

   For CounterX = 1 TO 25
      For CounterY = 1 TO 40
         DemoScreen(CounterX, CounterY) = Empty
      Next CounterY
   Next CounterX

   For CounterY = 1 TO 40
      DemoScreen(25, CounterY) = Full
                LOCATE 25, CounterY: Print CHR$(Full);
   Next CounterY

   For CounterY = 1 TO 25
      RandNew(23, DemoScreen())
   Next CounterY

' ja sitten itse asiaan.
DO
SLEEP 100 ' 0.1 sek. tauko.
   For CounterX = 24 TO 1 STEP -1
      For CounterY = 1 TO 40

         ' piirretään "lumi"
         LOCATE CounterX, CounterY : Color 15, 0
         Print CHR$(Chars(DemoScreen(CounterX, CounterY)));

         ' sitten IF THEN helvetti jossa ratkotaan josko lumi "valuu" sivuille tai täyttää x,y kohtaa jotenkin
         IF DemoScreen(CounterX, CounterY) = Full OR DemoScreen(CounterX, CounterY) = Medium THEN
            IF DemoScreen((CounterX + 1), (CounterY + 1)) < Full AND CounterY < 40 THEN
               DemoScreen((CounterX + 1), (CounterY + 1)) = DemoScreen((CounterX + 1), (CounterY + 1)) + 1
               DemoScreen(CounterX, CounterY) = DemoScreen(CounterX, CounterY) - 1
            END IF

            IF DemoScreen((CounterX + 1), (CounterY - 1)) < Full AND CounterY > 1 THEN
               DemoScreen((CounterX + 1), (CounterY - 1)) = DemoScreen((CounterX + 1), (CounterY - 1))+ 1
               DemoScreen(CounterX, CounterY) = DemoScreen(CounterX, CounterY) - 1
            END IF

         END IF



         IF DemoScreen((CounterX + 1), CounterY) > Empty AND DemoScreen(CounterX, CounterY) < SF THEN
            IF DemoScreen((CounterX + 1), CounterY) = Empty THEN
               DemoScreen((CounterX + 1), CounterY) = DemoScreen((CounterX), CounterY)
               DemoScreen((CounterX), CounterY) = Empty
            END IF
         END IF


         IF DemoScreen(CounterX, CounterY) = SF THEN
            IF DemoScreen((CounterX + 1), CounterY) = Empty THEN
               DemoScreen((CounterX + 1), CounterY) = SF
               DemoScreen(CounterX, CounterY) = Empty
            END IF

            IF DemoScreen((CounterX + 1), CounterY) = Full THEN
               DemoScreen(CounterX, CounterY) = Low
               RandNew(1, DemoScreen())
            END IF

            IF DemoScreen((CounterX + 1), CounterY) = Medium THEN
               DemoScreen((CounterX + 1), CounterY) = Full
               DemoScreen(CounterX, CounterY) = Empty
               RandNew(1, DemoScreen())
            END IF


            IF DemoScreen((CounterX + 1), CounterY) = Low THEN
               DemoScreen((CounterX + 1), CounterY) = Medium
               DemoScreen(CounterX, CounterY) = Empty
               RandNew(1, DemoScreen())
            END IF
         END IF

      Next CounterY
   Next CounterX
LOOP UNTIL INKEY$ <> "" ' nappulaa painamalla pois.

temu92 [23.10.2006 11:06:42]

#

Ihan hieno, vois vaikka itse kokeilla tehdä samanlaisen.

moptim [23.10.2006 17:29:20]

#

pitänee kääntää vb:lle

Juhko [23.10.2006 18:15:19]

#

Tuo on varmaan tosi helppo kääntää QB:lle... Paitsi siinä tuo SLEEP 100 odottaisi sata sekuntia. ; )

Draiz [23.10.2006 19:06:01]

#

Binääriä?

E.K.Virtanen [23.10.2006 20:05:12]

#

linux ja win binaarit nyt tuolla ladattavissa.

@juhko.
Joo tosiaan qb version ei liene mikään ongelma. DIM rivit vaihtaa eri muotoon, sleep 100 korvata waitilla ja en nyt muista tukiko qb Option Explicitiä mutta sen voi sitten vain poistaa koska sen ainoa tarkoitus on "pakottaa" ohjelmoija dimmaamaan jokainen käytettävä muuttuja tai kääntäjä antaa erroria.

Juhko [28.10.2006 19:07:07]

#

Joo huomasin kyllä sen dimjutun ja option explosionista en tiedä...

Qman [05.11.2006 14:33:06]

#

lainaus:

option explosionista en tiedä...

räjähtävät toiminnot

Juhko [12.11.2006 20:24:02]

#

Vitsi vitsi...

miiro [29.11.2006 14:35:12]

#

lurah kirjoitti:

linux ja win binaarit nyt tuolla ladattavissa.

Ei enää...

E.K.Virtanen [29.11.2006 15:07:24]

#

Fiksasin urlin. Samassa zipissä nyt molemmat + sorsa

Dude [22.08.2007 21:29:44]

#

QBeelle väännättäes option explicit juttu pois. mutta en saa toimimaan. "subscript out of range"

E.K.Virtanen [23.08.2007 12:06:23]

#

SCREEN 13 freebasicilla on 25*40 merkkiä kun taas qb:lla muistaakseni 25*35. Ihan satavarma en ole mutta kannattaa katsoa qb:n helpistä ja muuttaa taulukoita sen mukaan.


Sivun alkuun

Vastaus

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

Tietoa sivustosta