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.