Newsgroup: it.comp.lang.pascal
Titolo: neve...

Salve ho realizzato un piccolo programmino in pascal che dovrebbe simulaer
la caduta della neve. Inizialmente avevo detto al programma di impilare un
fiocco sopra l'altro, ma cosi'  l'effetto era poco realistico, quindi ho
dato un po' di probabilita' che se non c'e' nulla ai bordi del fiocco caduto
esso possa cadere, creando dei cumuli di neve piu' reali.
Ora ho tre problemini:
1)ho introdotto una linea di commento: se si tolgono le parentesi si creera'
una linea che dovrebbe bloccare la neve come fosse un piano. Questo funziona
fino ad un certo punto: quando la neve "rotola via" cadono dei pezzi di
piano!. Come evitare questo?
2)certe volte sembra che dei fiocchi scompaiano: e' solo la mia
immaginazione? O altrimenti: perche' succede?
3)c'e' un modo per snellire quel cumulo di if che permettono alla neve di
rotolare ai fianchi?
Grazie.
Daniele.
{$X+}
program neve;
uses crt;
type buf=array[0..63999] of byte;
const maxfiocchi=1;
      col_neve=15;
var postable:array[0..319] of boolean;
    buffer:^buf;
procedure video;assembler;
asm
mov ax,0013h
int 10h
end;
procedure testo;assembler;
asm
mov ax,0003h
int 10h
end;
procedure punto(x,y:word; col:byte);
begin;
buffer^[x+y shl 6+y shl 8]:=col;
end;
function colXY(x,y:word):byte;
begin;
colXY:=buffer^[x+y shl 6+y shl 8];
end;
procedure resetab;
var i:word;
begin;
for i:=0 to 319 do postable[i]:=False;
end;
procedure puntotab;
var i:word;
begin;
repeat i:=random(320); until postable[i]=False; postable[i]:=True;
end;
var x,y,bo:word;
begin;
new(buffer);
fillchar(buffer^,64000,0);
video;
{Linea che dovrebbe fermare la neve ma... for X:=50 to 100 do
punto(X,50,10);}
repeat;
resetab;
for x:=1 to maxfiocchi do puntotab;
for x:=0 to 319 do for y:=198 downto 0 do
if (colXY(x,y)=15) then
begin;
if colXY(x,y+1)=0 then
begin;
punto(x,y+1,colXY(x,y));
punto(x,y,0);
end else
begin;
if (X<319) and (colXY(x+1,y+1)=0) and not(colXY(x-1,y+1)=0) then
begin;
bo:=random(2);
punto(x+bo,y+1,colXY(x,y));
punto(x,y,0);
end;
if (X>0) and (colXY(x-1,y+1)=0) and not(colXY(x+1,y+1)=0) then
begin;
bo:=random(2)-1;
punto(x+bo,y+1,colXY(x,y));
punto(x,y,0);
end;
if (X<319) and (x>0) and (colXY(x+1,y+1)=0) and (colXY(x-1,y+1)=0) then
begin;
bo:=random(3)-1;
punto(x+bo,y+1,colXY(x,y));
punto(x,y,0);
end;
end;
end;
for x:=0 to 319 do if postable[x]=true then punto(x,0,Col_neve);
bo:=bo+1;
move(buffer^,mem[$A000:0000],64000);
until keypressed;
readkey;
testo;
end.
--
Posted from 
Bespin.anthesi.com
 [195.32.103.244]
via Mailgate.ORG Server - 
http://www.mailgate.org

Un bel di' "Daniele Fontanari" scrisse:
DF> if (X<319) and (x>0) and (colXY(x+1,y+1)=0) and (colXY(x-1,y+1)=0) then
DF> begin;
DF> bo:=random(3)-1;
DF> punto(x+bo,y+1,colXY(x,y));
DF> punto(x,y,0);
DF> end;
DF> end;
DF> end;
DF> for x:=0 to 319 do if postable[x]=true then punto(x,0,Col_neve);
DF> bo:=bo+1;
DF> move(buffer^,mem[$A000:0000],64000);
DF> until keypressed;
DF> readkey;
DF> testo;
DF> end.
DF> 
non ti offendere, ma un codice scritto cosi' e' illeggibile... :-(
Non dico di scriverlo con dei font particolari, e tutto ricamato, ma almeno
di identare (spaziare all'inizio riga) un po' per bene...
In fin dei conti, serve anche allo stesso programmatore...
Il codice e' scritto perche' deve essere comodo da leggere e da capire,
senno' tanto valeva scrivere direttamente nei .exe :-))
Ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SiliconValley/Grid/8879
ami...@iol.it
 :)			 Occhio all'antispammer NOSPAZ!!
Scaricate ora Bubble 2000, ver. beta 1 :-)
http://gpi.eden.it/italianware/games/b2000b1.exe
 (900kb, ma il server e' buono!)
"Una proliferazione di nuove leggi crea una proliferazione di scappatoie",
metalegge di Cooper