Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Pixelrennen die 4.

Uploader:MitgliedOneCypher
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)