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.Ihan hieno, vois vaikka itse kokeilla tehdä samanlaisen.
pitänee kääntää vb:lle
Tuo on varmaan tosi helppo kääntää QB:lle... Paitsi siinä tuo SLEEP 100 odottaisi sata sekuntia. ; )
Binääriä?
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.
Joo huomasin kyllä sen dimjutun ja option explosionista en tiedä...
lainaus:
option explosionista en tiedä...
räjähtävät toiminnot
Vitsi vitsi...
lurah kirjoitti:
linux ja win binaarit nyt tuolla ladattavissa.
Ei enää...
Fiksasin urlin. Samassa zipissä nyt molemmat + sorsa
QBeelle väännättäes option explicit juttu pois. mutta en saa toimimaan. "subscript out of range"
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.