fb:porticula NoPaste
Pixelrennen die 4.
Uploader: | OneCypher |
Datum/Zeit: | 17.09.2008 12:16:40 |
'Copyright by Christian H. alias OneCypher
'Diesen Quelltext stelle ich ausschließlich für nichtkommerzielle Zwecke zur Verfügung!
'Tastenbeschreibung:
' p = pause (p bitte auch drücken um das spielfeld zu starten!)
' + = Mehr Grüne Pixel
' - = Weniger Grüne Pixel
' t = Wegpunkt mit der maus bewegen
' d = Wegpunkt der mit t aufgenommen wurde ablegen
' l = löscht den jeweils 1. Wegpunkt
' 1 = Linie (startpunkt festlegen)
' 2 = Linie zeichnen (endpunkt wird festgelegt und die linie wird gezeichnet)
' 0 = Mehr gelbe Pixel
' c = Soll den bildschirm löschen. Ist aber noch ein bischen buggy
' q / ESC / alt-F4 = Beenden
const pxcolor = RGB(0,255,0)
const ppxcolor = RGB(255,255,0)
function getlength(x1 as double,y1 as double,x2 as double,y2 as double) as double
dim dx as double = x2 - x1
dim dy as double = y2 - y1
dim l as double = SQR(dx * dx + dy *dy)
return l
end function
function red(col AS UINTEGER) as ubyte
red = col SHR 16
END function
function green(col AS UINTEGER) as ubyte
green = col SHR 8
END function
function blue(col AS UINTEGER) as ubyte
blue = col
end function
type st 'Wegpunkt definition
x as integer
y as integer
nx_st as st ptr
end type
type px 'Pixel definition
x as double 'Position X
y as double 'Position Y
dest as st ptr 'Zielwegpunkt
dist as integer 'Distanzerweiterung zum Zielwegpunkt (für Stau minimierung)
nx_px as px ptr 'Nächster Pixel
bg as uinteger 'Pixelhintergrund
slp as integer 'Pixel schläft im Stau
declare sub work() 'LAUFZEIT :-D
end type
type ppx 'Pixel definition
x as double 'Position X
y as double 'Position Y
dest as px ptr 'Zielwegpunkt
dist as integer 'Distanzerweiterung zum Zielwegpunkt (für Stau minimierung)
nx_ppx as ppx ptr 'Nächster Pixel
bg as uinteger 'Pixelhintergrund
slp as integer 'Pixel schläft im Stau
declare sub work() 'LAUFZEIT :-D
end type
sub px.work()
dim dx as double 'Ziel X
dim dy as double 'Ziel Y
dim tx as double 'Temp X
dim ty as double 'Temp Y
dx = dest->x 'Ziel einlesen
dy = dest->y
if getlength(x,y,dx,dy) > 10 + dist then 'Solange Ziel(+Tolleranz) nicht erreicht dann...
tx = (rnd *2) -1 '... Schauen wir mal wo man so hintreten kann
ty = (rnd *2) -1 'Einfach mal auf gut Glück
if getlength(x,y,dx,dy) > getlength(x+tx,y+ty,dx,dy) then 'Wenn wir näher treten und...
if green(point(x+tx,y+ty)) = 0 then 'der nächste Schritt nicht ins Grüne führt..
if blue(bg) < 255 then bg = rgb(0,0,blue(bg) +1) 'dann Hintergrund um 1 hervorheben...
pset(x,y),bg 'Hintergrund zeichnen
x +=tx 'Neue Koordinaten übernehmen
y +=ty
bg = point(x,y) 'Neuen Hintergrund übernehmen
pset(x,y),pxcolor 'Grünen Pixel setzen
slp = 0 'Aufwachen! (falls es im Stau war)
dist = 0 'Da man wieder frei laufen kann, Distanzerweiterung auf 0 setzen
else
if dist > 50 then
dest = dest->nx_st 'WegPunkt erreicht, nächster ist an der Reihe!
dist = 0
else
if dist > 10 then 'Wenn die Distanz zum Wegpunkt zu groß wird
if slp < 255 then
slp = slp +1 'Dann fang an einzuschlafen!
pset(x,y), RGB(0,255-slp,0)
end if
else
dist = dist +1 'Da blockiert was den Weg, also Distanzerweiterung erhöhen!
end if
end if
end if
end if
else
dest = dest->nx_st 'WegPunkt erreicht, nächster ist an der Reihe!
end if
end sub
sub ppx.work()
dim dx as double 'Ziel X
dim dy as double 'Ziel Y
dim tx as double 'Temp X
dim ty as double 'Temp Y
dx = dest->x 'Ziel einlesen
dy = dest->y
if getlength(x,y,dx,dy) > 10 + dist then 'Solange Ziel(+Tolleranz) nicht erreicht dann...
tx = (rnd *2) -1 '... Schauen wir mal wo man so hintreten kann
ty = (rnd *2) -1 'Einfach mal auf gut Glück
if getlength(x,y,dx,dy) > getlength(x+tx,y+ty,dx,dy) then 'Wenn wir näher treten und...
if green(point(x+tx,y+ty)) = 0 then 'der nächste Schritt nicht ins Grüne führt..
if blue(bg) < 255 then bg = rgb(0,0,blue(bg) +1) 'dann Hintergrund um 1 hervorheben...
pset(x,y),bg 'Hintergrund zeichnen
x +=tx 'Neue Koordinaten übernehmen
y +=ty
bg = point(x,y) 'Neuen Hintergrund übernehmen
pset(x,y),ppxcolor 'Grünen Pixel setzen
slp = 0 'Aufwachen! (falls es im Stau war)
dist = 0 'Da man wieder frei laufen kann, Distanzerweiterung auf 0 setzen
else
if dist > 50 then
dest = dest->nx_px 'WegPunkt erreicht, nächster ist an der Reihe!
dist = 0
else
if dist > 10 then 'Wenn die Distanz zum Wegpunkt zu groß wird
if slp < 255 then
slp = slp +1 'Dann fang an einzuschlafen!
pset(x,y), RGB(255-slp,255-slp,0)
end if
else
dist = dist +1 'Da blockiert was den Weg, also Distanzerweiterung erhöhen!
end if
end if
end if
end if
else
dest = dest->nx_px 'WegPunkt erreicht, nächster ist an der Reihe!
end if
end sub
dim sx as integer 'Bildschirmgrößen
dim sy as integer
dim mx as integer 'Mausinfos
dim my as integer
dim bt as integer
screen 18, 32
screeninfo sx, sy
cls
dim i as integer 'Zum iterieren von irgendwas....
dim in as string 'Für Tastratur-eingaben...
dim paused as ubyte
dim spx as px ptr 'Erster Pixel
dim apx as px ptr 'Aktueller Pixel
dim tpx as px ptr 'Temporärer Zeiger
dim sppx as ppx ptr 'Erster Pixel
dim appx as ppx ptr 'Aktueller Pixel
dim tppx as ppx ptr 'Temporärer Zeiger
dim fstat as st ptr 'Erster Wegpunkt
dim lstat as st ptr 'Letzter Wegpunkt
dim tstat as st ptr 'Temporärer Wegpunkt
dim mstat as st ptr 'Wenn die Maus einen Wegpunkt bewegt
dim lx1 as integer
dim lx2 as integer
dim ly1 as integer
dim ly2 as integer
fstat = new st
fstat->x = int(sx /8)
fstat->y = int(sy /8)
pset(fstat->x,fstat->y),RGB(255,0,0)
fstat->nx_st = fstat
lstat = fstat
apx = new px
spx = apx
for i = 1 to 10
'Neue Pixel generieren
apx->x = int(rnd*sx-1) +1
apx->y = int(rnd*sy-1) +1
apx->bg = point(apx->x,apx->y)
apx->dest = fstat
apx->nx_px = new px
if i < 10 then apx = apx->nx_px else apx->nx_px = spx
next
appx = new ppx
sppx = appx
for i = 1 to 2
'Neue Pixel generieren
appx->x = int(rnd*sx-1) +1
appx->y = int(rnd*sy-1) +1
appx->bg = point(appx->x,appx->y)
appx->dest = spx
appx->nx_ppx = new ppx
if i < 2 then appx = appx->nx_ppx else appx->nx_ppx = sppx
next
screensync
apx = spx
appx = sppx
paused = 1
do
in = inkey
getmouse mx,my,,bt
'if apx = spx then screensync
if mstat <> 0 then
mstat->x = mx
mstat->y = my
end if
if paused = 0 then apx->work
if paused = 0 then appx->work
if paused = 0 then appx->work
apx=apx->nx_px
appx=appx->nx_ppx
if bt <> 0 and mx > 0 and my > 0 then
'Ein neuer Wegpunkt
lstat->nx_st = new st
lstat = lstat->nx_st
lstat->x = mx
lstat->y = my
lstat->nx_st = fstat
pset(mx,my),RGB(255,0,0)
while bt > 0
'Überlauf verhindern
getmouse mx,my,,bt
wend
end if
if in = "c" then
'Löscht und baut den Bildschirm wieder auf.
cls
sleep 1000
apx = spx->nx_px
while apx <> spx
apx->bg = RGB(0,0,0)
pset(apx->x,apx->y),pxcolor
apx = apx->nx_px
wend
end if
if in = "+" then
'Pixel hinzufügen
for i = 1 to 10
tpx = apx->nx_px
apx->nx_px = new px
apx->nx_px->x = int(rnd*sx-1) +1
apx->nx_px->y = int(rnd*sy-1) +1
apx->nx_px->bg = point(apx->nx_px->x,apx->nx_px->y)
apx->nx_px->dest = fstat
apx->nx_px->nx_px = tpx
next
end if
if in = "0" then
'Pixel hinzufügen
for i = 1 to 10
tppx = appx->nx_ppx
appx->nx_ppx = new ppx
appx->nx_ppx->x = int(rnd*sx-1) +1
appx->nx_ppx->y = int(rnd*sy-1) +1
appx->nx_ppx->bg = point(appx->nx_ppx->x,appx->nx_ppx->y)
appx->nx_ppx->dest = spx
appx->nx_ppx->nx_ppx = tppx
next
end if
if in = "-" then
'Pixel wegnehmen
if apx <> apx->nx_px then
pset(apx->nx_px->x,apx->nx_px->y),apx->bg
tpx = apx->nx_px->nx_px
delete apx->nx_px
apx->nx_px = tpx
end if
end if
if in = "p" then
'Pause
if paused = 0 then
sleep 500
paused = 1
else
sleep 500
paused = 0
end if
end if
if in = "l" then
'Löscht den ersten Wegpunkt
if fstat <> lstat then
pset(fstat->x,fstat->y),rgb(0,0,0)
fstat->x = fstat->nx_st->x
fstat->y = fstat->nx_st->y
lstat->nx_st = fstat->nx_st
delete fstat
fstat = lstat->nx_st
end if
end if
'sleep 10
if in = "t" then
'Den nächsten Wegpunkt mit der Maus verschieben
tstat = fstat
if getlength(mx,my,tstat->x,tstat->y) < 20 then
mstat = tstat
else
tstat = fstat->nx_st
while tstat <> fstat
if getlength(mx,my,tstat->x,tstat->y) < 50 then
mstat = tstat
exit while
end if
tstat = tstat->nx_st
wend
end if
end if
if in = "d" and mstat <> 0 then
'Den Wegpunkt ablegen
pset(mx,my),RGB(255,0,0)
mstat = 0
end if
if in = "1" then
lx1 = mx
ly1 = my
end if
if in = "2" then
line (lx1,ly1)-(mx,my),RGB(255,255,255)
line (lx1+1,ly1)-(mx+1,my),RGB(255,255,255)
line (lx1-1,ly1)-(mx-1,my),RGB(255,255,255)
end if
if in = "o" then pset(mx,my),RGB(0,0,0)
loop until in = "q" or in = chr(27) or in = chr(255,107)