Ameise (Turingmaschine)

  • Alter Inhalt

    Moin,

    Ich habe eben folgendes auf Wikipedia gefunden: Klick Mich

    Das klang so einfach, dass man es direkt umsetzen musste.
    Da nicht viel Interpretationsfreiraum war gibts nur 2 Optionen.
    - Zoom (Um welchen Faktor soll das Bild für die anzeige verfrößert werden)
    - FrameSkip (Wie viele Schritte sollten gemacht werden, bis gezeichnet wird. Min=1)

    Normalerweise fängt die maschine irgendwann an eine Schräge linie zu zeichnen.
    Da das aber zu langweilig war gilt das Prinzip: Links rein, Rechts raus (auch für Oben und Unten).

    Skript
    [autoit]


    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Vergrößerungsfaktor
    Global Const $iZoom = 5

    [/autoit] [autoit][/autoit] [autoit]

    ; Es wird alle X Schritte gezeichnet und 10ms gewartet.
    Global Const $iFrameSkip = 2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #### Skript:
    Global $iW = 129, $iH = 129
    Global $hGUI = GUICreate('Ameise', $iW*$iZoom, $iH*$iZoom)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $hDLL_GDI32 = DllOpen('GDI32.dll')
    Global $hDC = _WinAPI_GetDC($hGUI)
    Global $hBUF = _Image_Create($iW, $iH)
    Global $hDC_Buf = DllStructGetData($hBUF, 1, 1)
    Global $hGFX = _GDIPlus_GraphicsCreateFromHDC($hDC_Buf)
    Global $vStruct = DllStructCreate('int[' & $iW * $iH & ']', DllStructGetData($hBUF, 1, 4))

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Global $x = 64, $y = 64, $r = 3
    ; LORU

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg(0xF, 'WM_PAINT')
    OnAutoItExitRegister('_Freigeben')
    GUISetOnEvent(-3, '_Event')
    GUISetState(@SW_SHOW, $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    For $i = 1 To $iFrameSkip Step 1
    If _GetPx() = -1 Then ; Weiß
    _SetPx(0xFF000000)
    $r += 1
    Else
    _SetPx(0xFFFFFFFF)
    $r -= 1
    EndIf
    If $r > 3 Then $r -= 4
    If $r < 0 Then $r += 4
    Switch $r
    Case 0
    $x -= 1
    Case 1
    $y -= 1
    Case 2
    $x += 1
    Case 3
    $y += 1
    EndSwitch
    If $x = $iW Then $x = 0
    If $x < 0 Then $x = $iW-1
    If $y = $iH Then $y = 0
    If $y < 0 Then $y = $iH-1
    Next
    WM_PAINT()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _SetPx($iCol)
    If $x+1+$y*$iW > $iW*$iH Then Return ToolTip('Error: Zeichnen außerhalb des Bildes.')
    DllStructSetData($vStruct, 1, $iCol, $x+1+$y*$iW)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetPx()
    Return DllStructGetData($vStruct, 1, $x+1+$y*$iW)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_PAINT()
    DllCall($hDLL_GDI32, 'int', 'StretchBlt', 'hwnd', $hDC, 'int', 0, 'int', 0, 'int', $iW * $iZoom, 'int', $iH * $iZoom, 'hwnd', $hDC_Buf, 'int', 0, 'int', 0, 'int', $iW, 'int', $iH, 'dword', 0xCC0020)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Event()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Freigeben()
    _Image_Delete($hBUF)
    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_Shutdown()
    DllClose($hDLL_GDI32)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Create($iW, $iH)
    Local $Ptr, $hDC, $hBmp, $tBMI, $aDIB, $vStruct
    $hDC = _WinAPI_CreateCompatibleDC(0)
    $tBMI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4)
    DllStructSetData($tBMI, "Width", $iW)
    DllStructSetData($tBMI, "Height", -$iH)
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32)
    $aDIB = DllCall($hDLL_GDI32, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $aDIB[0]
    $Ptr = $aDIB[4]
    _WinAPI_SelectObject($hDC, $hBmp)
    $vStruct = DllStructCreate('int[5]')
    DllStructSetData($vStruct, 1, $hDC, 1)
    DllStructSetData($vStruct, 1, $iW, 2)
    DllStructSetData($vStruct, 1, $iH, 3)
    DllStructSetData($vStruct, 1, $Ptr, 4)
    DllStructSetData($vStruct, 1, $hBmp, 5)
    Return $vStruct
    EndFunc ;==>_Image_Create

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Delete(ByRef $vStruct)
    _WinAPI_DeleteObject(DllStructGetData($vStruct, 1, 5))
    _WinAPI_DeleteDC(DllStructGetData($vStruct, 1, 1))
    $vStruct = 0
    EndFunc ;==>_Image_Delete

    [/autoit]


    .
    .
    Edit: Künstlerischer Freiraum: Version mit 4 Farben und variabler Auflösung.

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Vergrößerungsfaktor
    Global Const $iZoom = 4

    [/autoit] [autoit][/autoit] [autoit]

    ; Es wird alle X Schritte gezeichnet und 10ms gewartet.
    Global Const $iFrameSkip = 2

    [/autoit] [autoit][/autoit] [autoit]

    ; Auflösung anpassen (iW=iH)
    Global Const $iAufloesung = 178

    [/autoit] [autoit][/autoit] [autoit]

    ; #### Skript:
    Global $iW = $iAufloesung, $iH = $iAufloesung
    Global $hGUI = GUICreate('Ameise', $iW*$iZoom, $iH*$iZoom)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $hDLL_GDI32 = DllOpen('GDI32.dll')
    Global $hDC = _WinAPI_GetDC($hGUI)
    Global $hBUF = _Image_Create($iW, $iH)
    Global $hDC_Buf = DllStructGetData($hBUF, 1, 1)
    Global $hGFX = _GDIPlus_GraphicsCreateFromHDC($hDC_Buf)
    Global $vStruct = DllStructCreate('int[' & $iW * $iH & ']', DllStructGetData($hBUF, 1, 4))

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Global $aCol[4] = [0xFF000000, 0xFFFF8040, 0xFF4080FF, 0xFFFFFFFF]

    [/autoit] [autoit][/autoit] [autoit]

    Global $x = Int($iW/2), $y = Int($iH/2), $r = 3
    ; LORU

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg(0xF, 'WM_PAINT')
    OnAutoItExitRegister('_Freigeben')
    GUISetOnEvent(-3, '_Event')
    GUISetState(@SW_SHOW, $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    For $i = 1 To $iFrameSkip Step 1
    Switch _GetPx()
    Case $aCol[0]
    $r += 1
    _SetPx($aCol[1])
    Case $aCol[1]
    $r += 2
    _SetPx($aCol[2])
    Case $aCol[2]
    $r += 3
    _SetPx($aCol[3])
    Case $aCol[3]
    $r += 4
    _SetPx($aCol[0])
    EndSwitch
    ;~ If _GetPx() = -1 Then ; Weiß
    ;~ _SetPx(0xFF000000)
    ;~ $r += 1
    ;~ Else
    ;~ _SetPx(0xFFFFFFFF)
    ;~ $r -= 1
    ;~ EndIf
    If $r > 3 Then $r -= 4
    If $r < 0 Then $r += 4
    Switch $r
    Case 0
    $x -= 1
    Case 1
    $y -= 1
    Case 2
    $x += 1
    Case 3
    $y += 1
    EndSwitch
    If $x = $iW Then $x = 0
    If $x < 0 Then $x = $iW-1
    If $y = $iH Then $y = 0
    If $y < 0 Then $y = $iH-1
    Next
    WM_PAINT()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _SetPx($iCol)
    If $x+1+$y*$iW > $iW*$iH Then Return ToolTip('Error: Zeichnen außerhalb des Bildes.')
    DllStructSetData($vStruct, 1, $iCol, $x+1+$y*$iW)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetPx()
    Return DllStructGetData($vStruct, 1, $x+1+$y*$iW)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_PAINT()
    DllCall($hDLL_GDI32, 'int', 'StretchBlt', 'hwnd', $hDC, 'int', 0, 'int', 0, 'int', $iW * $iZoom, 'int', $iH * $iZoom, 'hwnd', $hDC_Buf, 'int', 0, 'int', 0, 'int', $iW, 'int', $iH, 'dword', 0xCC0020)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Event()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Freigeben()
    _Image_Delete($hBUF)
    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_Shutdown()
    DllClose($hDLL_GDI32)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Create($iW, $iH)
    Local $Ptr, $hDC, $hBmp, $tBMI, $aDIB, $vStruct
    $hDC = _WinAPI_CreateCompatibleDC(0)
    $tBMI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4)
    DllStructSetData($tBMI, "Width", $iW)
    DllStructSetData($tBMI, "Height", -$iH)
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32)
    $aDIB = DllCall($hDLL_GDI32, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $aDIB[0]
    $Ptr = $aDIB[4]
    _WinAPI_SelectObject($hDC, $hBmp)
    $vStruct = DllStructCreate('int[5]')
    DllStructSetData($vStruct, 1, $hDC, 1)
    DllStructSetData($vStruct, 1, $iW, 2)
    DllStructSetData($vStruct, 1, $iH, 3)
    DllStructSetData($vStruct, 1, $Ptr, 4)
    DllStructSetData($vStruct, 1, $hBmp, 5)
    Return $vStruct
    EndFunc ;==>_Image_Create

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Delete(ByRef $vStruct)
    _WinAPI_DeleteObject(DllStructGetData($vStruct, 1, 5))
    _WinAPI_DeleteDC(DllStructGetData($vStruct, 1, 1))
    $vStruct = 0
    EndFunc ;==>_Image_Delete

    [/autoit]


    .
    .

    Inzwischen hatte ich etwas Zeit und habe eine "Finale Version" der Ameisenlaufmaschine gemacht.
    Für Erweiterungsideen bin ich natürlich trotz "final" immer zu haben.

    Funktionen:
    - Frameskip (1 bis 2000) - Muss man sich selbst aussuchen. ca. 100 ist finde ich optimal zum testen.
    - Anzahl Farben frei wählbar (2 bis 16)
    - Freie Einstellmöglichkeit ob Links oder Recht gelaufen werden soll
    - Start/Stop/Reset Möglichkeit
    - Export und Import von Einstellungen via Rechtsklickmenu
    - Zufällige Einstellungen

    Exportierte Daten haben das Format : #71110000100000000# <- Sieht cool aus :)
    Die # davor und danach sind unwichtig. Das ist nur, damit man es besser kopieren kann.

    Ameise 1.01
    [autoit]


    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Der Faktor muss 640 ergeben.
    Global $iAufloesung = 160
    Global $iZoom = 4

    [/autoit] [autoit][/autoit] [autoit]

    ; #### Skript:
    Global $iW = $iAufloesung, $iH = $iAufloesung
    Global $hGUI = GUICreate('Ameise 1.01', $iW * $iZoom + 150, $iH * $iZoom + 19)
    Global $x, $y, $r, $c, $bRun, $iFrames, $iT, $iFrameSkip, $iMaxCol

    [/autoit] [autoit][/autoit] [autoit]

    ;~ #91011111100000000#

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $hDLL_GDI32 = DllOpen('GDI32.dll')
    Global $hDC = _WinAPI_GetDC($hGUI)
    Global $hBUF = _Image_Create($iW, $iH)
    Global $hDC_Buf = DllStructGetData($hBUF, 1, 1)
    Global $hGFX = _GDIPlus_GraphicsCreateFromHDC($hDC_Buf)
    Global $vStruct = DllStructCreate('int[' & $iW * $iH & ']', DllStructGetData($hBUF, 1, 4))

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel('Frame Skip:', $iW * $iZoom + 10, 20, 140, 17)
    GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
    Global $hInput_FrameSkip = GUICtrlCreateInput('5', $iW * $iZoom + 10, 40, 130, 25)
    GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 2000, 1)
    GUICtrlSetOnEvent(-1, '_Event')

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel('Anzahl Farben:', $iW * $iZoom + 10, 80, 140, 17)
    GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
    Global $hInput_MaxCol = GUICtrlCreateInput('2', $iW * $iZoom + 10, 100, 130, 25)
    GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 16, 2)
    GUICtrlSetOnEvent(-1, '_Event')

    [/autoit] [autoit][/autoit] [autoit]

    Global $hBtn_Run = GUICtrlCreateButton('Start', $iW * $iZoom + 10, $iH * $iZoom - 90, 130, 35)
    GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
    GUICtrlSetOnEvent(-1, '_Event')

    [/autoit] [autoit][/autoit] [autoit]

    Global $hBtn_Reset = GUICtrlCreateButton('Reset', $iW * $iZoom + 10, $iH * $iZoom - 50, 130, 35)
    GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
    GUICtrlSetOnEvent(-1, '_Event')

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel('', 0, $iH * $iZoom, $iW * $iZoom + 150, 1)
    GUICtrlSetBkColor(-1, 0x606060)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel('', 0, $iH * $iZoom+1, $iW * $iZoom + 150, 1)
    GUICtrlSetBkColor(-1, 0xA0A0A0)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel('', $iW*$iZoom, 0, 1, $iH*$iZoom)
    GUICtrlSetBkColor(-1, 0x606060)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hLabel_Status = GUICtrlCreateLabel('', 0, $iH * $iZoom + 2, $iW * $iZoom + 150, 17)
    GUICtrlSetBkColor(-1, 0xA0A0A0)
    GUICtrlSetFont(-1, 10, 500, 0, 'Arial', 5)

    [/autoit] [autoit][/autoit] [autoit]

    Global $aCol[16] = [0xFFFFFFFF, 0xFF000000, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFC0C0C0, 0xFF808080, 0xFF800000, 0xFF008000, 0xFF808000, 0xFF000080, 0xFF800080, 0xFF008080]
    Global $aRichtung[16] = [-1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1]
    Global $iDummy = GUICtrlCreateDummy()

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 15 Step 1
    GUICtrlCreateButton('', $iW * $iZoom + 28 + 50 * ($i > 7), 140 + $i * 50 - 50 * 8 * ($i > 7), 45, 45)
    GUICtrlSetBkColor(-1, '0x' & StringRight(Hex($aCol[$i], 8), 6))
    GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
    If $i = 1 Or $i > 9 Then GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetOnEvent(-1, '_Event')
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 15 Step 1
    GUICtrlCreateLabel($i+1, $iW * $iZoom + 5 + 122 * ($i > 7), 155 + $i * 50 - 50 * 8 * ($i > 7), 16, 16,0 + 2*($i<8))
    GUICtrlSetFont(-1, 10, 500, 0, 'Arial', 5)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Global $hMenu = GUICtrlCreateContextMenu()
    GUICtrlCreateMenuItem('Zufall', $hMenu)
    GUICtrlSetOnEvent(-1, '_Zufall')

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateMenuItem('Importieren', $hMenu)
    GUICtrlSetOnEvent(-1, '_Import')

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateMenuItem('Exportieren', $hMenu)
    GUICtrlSetOnEvent(-1, '_Export')

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Global $hMenu_Aufloesung = GUICtrlCreateMenu('Auflösung Ändern', $hMenu)
    ;~ GUICtrlCreateMenuItem('80x80 px', $hMenu_Aufloesung)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ GUICtrlCreateMenuItem('128x128 px', $hMenu_Aufloesung)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ GUICtrlCreateMenuItem('160x160 px', $hMenu_Aufloesung)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ GUICtrlCreateMenuItem('320x320 px', $hMenu_Aufloesung)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ GUICtrlCreateMenuItem('640x640 px', $hMenu_Aufloesung)

    [/autoit] [autoit][/autoit] [autoit]

    Global $bReset2 = False, $bRun2 = False

    [/autoit] [autoit][/autoit] [autoit]

    _Reset()

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg(0xF, 'WM_PAINT') ; Neu Zeichnen
    GUISetOnEvent(-5, 'WM_PAINT') ; Restore
    OnAutoItExitRegister('_Freigeben')
    GUISetOnEvent(-3, '_Event')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    While Not $bRun
    If $bReset2 Then
    _Reset()
    $bReset2 = False
    $bRun = $bRun2
    If $bRun Then
    GUICtrlSetData($hBtn_Run, 'Stop')
    Else
    GUICtrlSetData($hBtn_Run, 'Start')
    EndIf
    EndIf
    Sleep(10)
    WEnd
    For $i = 1 To $iFrameSkip Step 1
    $c = _GetPx()
    $c = _Index()
    If Not $c Then
    ;~ _Tip(''
    ;~ _Tip('Error: Unbekannte Farbe aufgetaucht. Reset wurde durchgeführt.')
    _Reset()
    $bRun = True
    ExitLoop
    EndIf
    $t = $c
    If $c = $iMaxCol Then $c = 0
    _SetPx($aCol[$c])
    $r += $aRichtung[$c]
    If $r > 3 Then $r -= 4
    If $r < 0 Then $r += 4
    Switch $r
    Case 0
    $x -= 1
    Case 1
    $y -= 1
    Case 2
    $x += 1
    Case 3
    $y += 1
    EndSwitch
    If $x = $iW Then $x = 0
    If $x < 0 Then $x = $iW - 1
    If $y = $iH Then $y = 0
    If $y < 0 Then $y = $iH - 1
    Next
    $iFrames += $iFrameSkip
    If TimerDiff($iT) > 100 Then
    _Status('Frame: ' & $iFrames)
    $iT = TimerInit()
    EndIf
    WM_PAINT()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Import()
    Local $s = ClipGet()
    $s = StringReplace($s, '#', '')
    If (Not (StringLen($s) = 17)) Then Return _Tip('Error: Unbekannte Importdaten:' & @CRLF & '"' & $s & '"')
    If Not (StringLen(StringReplace(StringReplace($s, '0',''),'1','')) <= 1) Then Return _Tip('Error: Unbekannte Importdaten:' & @CRLF & '"' & $s & '"')
    $iMaxCol = Int('0x' & StringLeft($s, 1)) + 1
    If $iMaxCol = 1 Then Return _Tip('Error: Defekte Importdaten:' & @CRLF & '"' & $s & '"')
    For $i = 0 To $iMaxCol - 1 Step 1
    $aRichtung[$i] = 1 - 2*(StringMid($s, $i+2,1)='1')
    Next
    GUICtrlSetData($hInput_MaxCol, $iMaxCol)
    _Reset()
    $bReset2 = True
    $bRun2 = True
    ;~ GUICtrlSetData($hBtn_Run, 'Stop')
    $s = '#' & $s & '#'
    _Tip('Importiert: ' & @CRLF & StringMid($s, 1, 1) & ' ' & StringMid($s, 2, 1) & ' ' & StringMid($s, 3, 4) & ' ' & StringMid($s, 7, 4) & ' ' & StringMid($s, 11, 4) & ' ' & StringMid($s, 15, 4) & ' ' & StringMid($s, 19, 1))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Export()
    Local $s = '#' & Hex($iMaxCol-1,1)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $iMaxCol - 1 Step 1
    If $aRichtung[$i] = 1 Then
    $s &= '0'
    Else
    $s &= '1'
    EndIf
    Next
    $s = StringLeft($s & '00000000000000', 18) & '#'
    ClipPut($s)
    _Tip('Exportiert: ' & @CRLF & StringMid($s, 1, 1) & ' ' & StringMid($s, 2, 1) & ' ' & StringMid($s, 3, 4) & ' ' & StringMid($s, 7, 4) & ' ' & StringMid($s, 11, 4) & ' ' & StringMid($s, 15, 4) & ' ' & StringMid($s, 19, 1))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Zufall()
    Local $iMaxCol = Random(3, 16, 1)
    For $i = 0 To $iMaxCol-1 Step 1
    $aRichtung[$i] = 1-2*Random(0, 1, 1)
    Next
    GUICtrlSetData($hInput_MaxCol, $iMaxCol)
    _Reset()
    $bRun2 = True
    $bReset2 = True
    ;~ GUICtrlSetData($hBtn_Run, 'Stop')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ResetBtn($n = -1)
    If $n = -1 Then
    For $i = 0 To 15 Step 1
    GUICtrlSetData($iDummy + $i + 1, LR($aRichtung[$i]))
    Next
    Else
    GUICtrlSetData($iDummy + $n + 1, LR($aRichtung[$n]))
    EndIf
    EndFunc ;==>_ResetBtn

    [/autoit] [autoit][/autoit] [autoit]

    Func LR($a)
    If $a = 1 Then Return 'R'
    Return 'L'
    EndFunc ;==>LR

    [/autoit] [autoit][/autoit] [autoit]

    Func _Reset()
    $x = Int($iW / 2)
    $y = Int($iH / 2)
    $r = 3
    $c = ''
    $t = ''
    $bRun = False
    $iFrames = 0
    $iMaxCol = Number(GUICtrlRead($hInput_MaxCol))
    If $iMaxCol < 2 Then $iMaxCol = 2
    If $iMaxCol > 16 Then $iMaxCol = 16
    GUICtrlSetData($hInput_MaxCol, $iMaxCol)
    $iFrameSkip = Number(StringReplace(GUICtrlRead($hInput_FrameSkip), '.', ''))
    If $iFrameSkip < 1 Then
    $iFrameSkip = 1
    GUICtrlSetData($hInput_FrameSkip, 1)
    EndIf
    If $iFrameSkip > 2000 Then
    $iFrameSkip = 2000
    GUICtrlSetData($hInput_FrameSkip, '2.000')
    EndIf
    $iT = TimerInit()
    _GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)
    WM_PAINT()
    ;~ GUICtrlSetData($hBtn_Run, 'Start')
    _ResetBtn()
    _Status('Bereit...')
    EndFunc ;==>_Reset

    [/autoit] [autoit][/autoit] [autoit]

    Func _Tip($a)
    ToolTip($a)
    AdlibUnRegister('_EndTip')
    AdlibRegister('_EndTip', 4000)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _EndTip()
    ToolTip('')
    AdlibUnRegister('_EndTip')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Status($a)
    GUICtrlSetData($hLabel_Status, ' ' & $a)
    EndFunc ;==>_Status

    [/autoit] [autoit][/autoit] [autoit]

    Func _Index()
    For $i = 0 To $iMaxCol - 1 Step 1
    If $aCol[$i] = $c Then Return $i + 1
    Next
    Return ''
    EndFunc ;==>_Index

    [/autoit] [autoit][/autoit] [autoit]

    Func _SetPx($iCol)
    If $x + 1 + $y * $iW > $iW * $iH Then Return _Tip('Error: Zeichnen außerhalb des Bildes.')
    DllStructSetData($vStruct, 1, $iCol, $x + 1 + $y * $iW)
    EndFunc ;==>_SetPx

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetPx()
    Return DllStructGetData($vStruct, 1, $x + 1 + $y * $iW)
    EndFunc ;==>_GetPx

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_PAINT()
    DllCall($hDLL_GDI32, 'int', 'StretchBlt', 'hwnd', $hDC, 'int', 0, 'int', 0, 'int', $iW * $iZoom, 'int', $iH * $iZoom, 'hwnd', $hDC_Buf, 'int', 0, 'int', 0, 'int', $iW, 'int', $iH, 'dword', 0xCC0020)
    EndFunc ;==>WM_PAINT

    [/autoit] [autoit][/autoit] [autoit]

    Func _Event()
    Local $a = @GUI_CtrlId, $b
    Switch $a
    Case -3
    Exit
    Case $hInput_MaxCol + 1
    $iMaxCol = Number(GUICtrlRead($hInput_MaxCol))
    Case $hInput_FrameSkip + 1
    $iFrameSkip = Number(StringReplace(GUICtrlRead($hInput_FrameSkip), '.', ''))
    Case $hBtn_Run
    If $bRun Then
    GUICtrlSetData($hBtn_Run, 'Start')
    Else
    GUICtrlSetData($hBtn_Run, 'Stop')
    EndIf
    $bRun = Not $bRun
    Case $hBtn_Reset
    _Reset()
    $bReset2 = True
    $bRun2 = False
    Case Else ; Button
    $b = $a - $iDummy - 1
    If $aRichtung[$b] = 1 Then
    $aRichtung[$b] = -1
    Else
    $aRichtung[$b] = 1
    EndIf
    _ResetBtn($b)
    EndSwitch
    EndFunc ;==>_Event

    [/autoit] [autoit][/autoit] [autoit]

    Func _Freigeben()
    _Image_Delete($hBUF)
    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_Shutdown()
    DllClose($hDLL_GDI32)
    EndFunc ;==>_Freigeben

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Create($iW, $iH)
    Local $Ptr, $hDC, $hBmp, $tBMI, $aDIB, $vStruct
    $hDC = _WinAPI_CreateCompatibleDC(0)
    $tBMI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4)
    DllStructSetData($tBMI, "Width", $iW)
    DllStructSetData($tBMI, "Height", -$iH)
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32)
    $aDIB = DllCall($hDLL_GDI32, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $aDIB[0]
    $Ptr = $aDIB[4]
    _WinAPI_SelectObject($hDC, $hBmp)
    $vStruct = DllStructCreate('int[5]')
    DllStructSetData($vStruct, 1, $hDC, 1)
    DllStructSetData($vStruct, 1, $iW, 2)
    DllStructSetData($vStruct, 1, $iH, 3)
    DllStructSetData($vStruct, 1, $Ptr, 4)
    DllStructSetData($vStruct, 1, $hBmp, 5)
    Return $vStruct
    EndFunc ;==>_Image_Create

    [/autoit] [autoit][/autoit] [autoit]

    Func _Image_Delete(ByRef $vStruct)
    _WinAPI_DeleteObject(DllStructGetData($vStruct, 1, 5))
    _WinAPI_DeleteDC(DllStructGetData($vStruct, 1, 1))
    $vStruct = 0
    EndFunc ;==>_Image_Delete

    [/autoit]

    Interessante Seeds:
    #41110100000000000#
    #30111000000000000#
    #80000100010000000#
    #60011110000000000#
    #31100000000000000#
    #B0110110010000000#
    #80110110000000000# - läuft unglaublich lange in der Mitte im Kreis, ohne sich dabei zu wiederholen
    #70110110000000000# - Das gleiche wie oben nur eine Farbe weniger -> gibt interessante Linien.
    #A1010001110000000# - Schnell ausbreitendes Gelbes Gebilde
    #61010000000000000# - Gelbes Rechteck

    Bugs:
    Es muss 2x resettet werden, bevor wirklich alles resettet ist.
    Deshalb vor dem Importieren auf Reset drücken. Sonst kann das Resultat abweichen.

    1.01:
    - Resetsystem überarbeitet. Es wird jetzt automatisch 2x resettet. Falls eine unbekannte Farbe auftaucht folgt auch ein Reset.
    - Beim wiederherstellen sollte nun das bild aktualisiert werden.
    .
    .

  • Ich starre jetzt seit 10 Minuten auf diese Punkte 8o. Das hat definitiv etwas etwas Faszinierendes :thumbup:.
    Eine Frage zum Nutzen der "Ameise" habe ich aber: Im Wikipediaartikel über Christopher Langton steht: "Von ihm stammt Langtons Ameise, ein einfacher Zellulärer Automat und ein Beispiel für Künstliches Leben." Irgedetwas mit künstlichem Leben kann ich in diesem Muster aus Lienien und Punkten nicht erkennen. Wie muss ich das verstehen?

  • Wow, erst hab ich das ja überhaupt nicht verstanden, aber dann hab ich mir das mal durchgelesen und finde das faszinierend. Warum auch immer^^
    Ich mach auch mal ein Tool, evt. mit mehreren Farben, mal gucken.

    Aber mal ne Frage: Geht es auch, dass die Armeise bei einer bestimmten farbe nicht die Richtung ändert? also geradeaus geht?

    mfg
    Hauke

  • Da lässt sich ja mehr mit anstellen als ich zunächst befürchtet habe...^^
    Habe aber schon wieder etwas anderes am Start. Deshalb gehts hier nicht weiter.
    (von meiner Seite. Wer basteln will dem sei es erlaubt.)

  • Hab auch mal eine gemacht, sieht ganz lustig aus.

    Meine farben:

    Weiß: Grün --> nach Rechts
    Schwarz: Rot --> nach Links
    Rot: Weiß --> nach Rechts
    Grün: Schwarz --> nach Links

    Code
    [autoit]

    #include<GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)
    Global $hBuffer, $PixelColor[501][501], $Richtung, $Position[3], $Zahl, $Brush, $hGraphics, $Zoom
    $hGui = GUICreate("Ameise", 500, 500)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(250, 250, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $Position[1] = 250 ;X
    $Position[2] = 250 ;Y
    For $i = 1 To 500
    For $ii = 1 To 500
    $PixelColor[$i][$ii] = 1
    Next
    Next
    $Richtung = 1 ; Oben
    ; 1 = Links
    ; 2 = Oben
    ; 3 = Rechts
    ; 4 = Unten
    $Zoom = 1
    $Zahl = 0
    GUISetState()
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0 ,500, 500, _GDIPlus_BrushCreateSolid(0xFFFFFFFF))
    while 1
    switch $PixelColor[$Position[1]][$Position[2]]
    case 1 ; Weiß
    $Richtung += 1 ; nach rechts
    $Brush = _GDIPlus_BrushCreateSolid(0xFF00FF00) ; Grün
    _Set(3)
    case 0 ; Schwarz
    $Richtung -= 1 ; Nach links
    $Brush = _GDIPlus_BrushCreateSolid(0xFFFF0000) ; Rot
    _Set(2)
    case 2 ; Rot
    $Richtung += 1 ; nach rechts
    $Brush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF) ; Weiß
    _Set(1)
    case 3 ; Grün
    $Richtung -= 1 ; Nach links
    $Brush = _GDIPlus_BrushCreateSolid(0xFF000000) ; Schwarz
    _Set(0)
    EndSwitch
    $Zahl += 1
    _GDIPlus_GraphicsFillRect($hBuffer, 0, 0, 200, 40, _GDIPlus_BrushCreateSolid(0xFFFFFFFF))
    _GDIPlus_GraphicsDrawString($hBuffer, "Schritt: " & $Zahl, 10, 10)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 250, 250)
    WEnd
    func _Set($i)
    If $Richtung > 4 Then $Richtung -= 4
    If $Richtung < 1 Then $Richtung += 4
    $PixelColor[$Position[1]][$Position[2]] = $i
    switch $Richtung
    case 1
    $Position[1] -= $Zoom
    case 2
    $Position[2] -= $Zoom
    case 3
    $Position[1] += $Zoom
    case 4
    $Position[2] += $Zoom
    EndSwitch
    _GDIPlus_GraphicsFillRect($hGraphics, $Position[1], $Position[2], $Zoom, $Zoom, $Brush)
    Return
    EndFunc
    func Close()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]


    Ab Schritt 20.000 wird interessant ;)
    Habs mal bis 1.8mio. weiterlaufen lassen und mich tot gelacht^^

    mfg
    Hauke

    ps.: Die Symetrien sind nicht gewollt xDDD

  • Die ist schon klar, dass es ein schönes Lpeicherleck gibt wenn man andauernd Brushes erzeugt ?
    Erzeuge EINE Brush und verändere anschließend nur noch die Farbe.

    Edit: am Tempo sieht man schön den Unterschied zwischen GDI+ und GDI.
    Die Version von Hauke ist mindestens 5Mal langsamer.

  • Hi Folks,
    Ich habe mich auch mal daran probiert, natürlich ist der Quellcode ähnlich wie der meiner Vorgänger, ich fand die Idee nur auch faszinierend.
    Bei mir kann man bis zu 7 Zustände varabel eingeben, da kann man ein bisschen rmprobieren.
    $H * Steps sollte immer > 600 sein, damit die Controls richtig angezeigt werden ;)

    Kommen interessante Dinge bei raus (rrlrll find ich interssant) ;)

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $Size = 10, $W = 100, $H = 80
    Global $FrameDraw = 1, $Colors = 2, $Sleep = 10
    Global $Grid[$W][$H]
    Global $AntPos[2] = [Ceiling($W / 2 - 1), Ceiling($H / 2 - 1)]
    Global $Direction = 0 ;0: Up, 1: Right, 2: Down, 3: Left
    Global $StopCalc = True
    Global $Status[7] = [0, 0, 0, 0, 0, 0, 0]
    Global $Steps = 0
    _GDIPlus_Startup()
    Global $hBrush[7] = [_GDIPlus_BrushCreateSolid(0xFFFFFFFF), _GDIPlus_BrushCreateSolid(0xFFFF0000), _GDIPlus_BrushCreateSolid(0xFF0000FF), _GDIPlus_BrushCreateSolid(0xFFFFFF00), _GDIPlus_BrushCreateSolid(0xFFFF00FF), _GDIPlus_BrushCreateSolid(0xFF00FFFF), _GDIPlus_BrushCreateSolid(0xFF00FF00)]

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("Turing Ameise", $W * $Size + 100, $H * $Size)
    GUICtrlCreateLabel("Skip Frames", $W * $Size, 0, 100, 20)
    Global $hInputFrame = GUICtrlCreateInput($FrameDraw, $W * $Size, 20, 100, 20, $ES_NUMBER)
    Global $hUpDown = GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 10000, 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel("Wait after Frame (ms)", $W * $Size, 50, 100, 20)
    Global $hInputSleep = GUICtrlCreateInput($Sleep, $W * $Size, 70, 100, 20, $ES_NUMBER)
    Global $hUpDown = GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 1000, 10)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel("1", $W * $Size, 100, 50, 50)
    GUICtrlSetFont(-1, 30)
    GUICtrlCreateLabel("2", $W * $Size, 150, 50, 50)
    GUICtrlSetFont(-1, 30)
    GUICtrlCreateLabel("3", $W * $Size, 200, 50, 50)
    GUICtrlSetFont(-1, 30)
    GUICtrlCreateLabel("4", $W * $Size, 250, 50, 50)
    GUICtrlSetFont(-1, 30)
    GUICtrlCreateLabel("5", $W * $Size, 300, 50, 50)
    GUICtrlSetFont(-1, 30)
    GUICtrlCreateLabel("6", $W * $Size, 350, 50, 50)
    GUICtrlSetFont(-1, 30)
    GUICtrlCreateLabel("7", $W * $Size, 400, 50, 50)
    GUICtrlSetFont(-1, 30)
    GUICtrlCreateLabel("Anzahl der Zustände", $W * $Size, 450, 50, 30)
    Global $hButton[7]
    $hButton[0] = GUICtrlCreateButton("Left", $W * $Size + 50, 100, 50, 50)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    GUICtrlSetOnEvent(-1, "_Click")
    $hButton[1] = GUICtrlCreateButton("Left", $W * $Size + 50, 150, 50, 50)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUICtrlSetOnEvent(-1, "_Click")
    $hButton[2] = GUICtrlCreateButton("Left", $W * $Size + 50, 200, 50, 50)
    GUICtrlSetBkColor(-1, 0x0000FF)
    GUICtrlSetOnEvent(-1, "_Click")
    $hButton[3] = GUICtrlCreateButton("Left", $W * $Size + 50, 250, 50, 50)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    GUICtrlSetOnEvent(-1, "_Click")
    $hButton[4] = GUICtrlCreateButton("Left", $W * $Size + 50, 300, 50, 50)
    GUICtrlSetBkColor(-1, 0xFF00FF)
    GUICtrlSetOnEvent(-1, "_Click")
    $hButton[5] = GUICtrlCreateButton("Left", $W * $Size + 50, 350, 50, 50)
    GUICtrlSetBkColor(-1, 0x00FFFF)
    GUICtrlSetOnEvent(-1, "_Click")
    $hButton[6] = GUICtrlCreateButton("Left", $W * $Size + 50, 400, 50, 50)
    GUICtrlSetBkColor(-1, 0x00FF00)
    GUICtrlSetOnEvent(-1, "_Click")
    $hDropDown = GUICtrlCreateCombo("2", $W * $Size, 480, 100, 25, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, "3|4|5|6|7")

    [/autoit] [autoit][/autoit] [autoit]

    $hLabelSteps = GUICtrlCreateLabel("Steps: 0", $W * $Size, 520, 100)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hButtonStart = GUICtrlCreateButton("Start", $W * $Size, $H * $Size - 60, 100, 30)
    GUICtrlSetOnEvent(-1, "_AntGo")

    [/autoit] [autoit][/autoit] [autoit]

    Global $hButtonStop = GUICtrlCreateButton("Stop", $W * $Size, $H * $Size - 30, 100, 30)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetOnEvent(-1, "_AntStop")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    GUISetOnEvent(-3, "_exit")
    GUIRegisterMsg(0xF, '_Redraw')

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($W * $Size, $H * $Size, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    While Not $StopCalc
    For $i = 1 To $FrameDraw
    If $StopCalc Then ExitLoop
    For $j = 0 To $Colors - 1
    If $Grid[$AntPos[0]][$AntPos[1]] = $j Then
    $Grid[$AntPos[0]][$AntPos[1]] = Mod($Grid[$AntPos[0]][$AntPos[1]] + 1, $Colors)
    Switch $Status[$j]
    Case 0
    _Left()
    $Direction = Mod($Direction + 3, 4)
    Case 1
    _Right()
    $Direction = Mod($Direction + 1, 4)
    EndSwitch
    EndIf
    Next
    $Steps += 1
    Next
    GUICtrlSetData($hLabelSteps, "Steps: " & $Steps)
    _Draw()
    Sleep($Sleep)
    WEnd
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _AntGo()
    For $i = 0 To $W - 1
    For $j = 0 To $H - 1
    $Grid[$i][$j] = 0
    Next
    Next
    $Steps = 0
    GUICtrlSetData($hLabelSteps, "Steps: " & $Steps)
    $AntPos[0] = Ceiling($W / 2 - 1)
    $AntPos[1] = Ceiling($H / 2 - 1)
    $Direction = 0 ;0: Up, 1: Right, 2: Down, 3: Left
    $FrameDraw = Number(GUICtrlRead($hInputFrame))
    $Sleep = Number(GUICtrlRead($hInputSleep))
    $Colors = Number(GUICtrlRead($hDropDown))
    $StopCalc = False
    _Draw()
    GUICtrlSetState($hButtonStart, $GUI_DISABLE)
    GUICtrlSetState($hButtonStop, $GUI_ENABLE)
    EndFunc ;==>_AntGo

    [/autoit] [autoit][/autoit] [autoit]

    Func _AntStop()
    $StopCalc = True
    GUICtrlSetState($hButtonStart, $GUI_ENABLE)
    GUICtrlSetState($hButtonStop, $GUI_DISABLE)
    EndFunc ;==>_AntStop

    [/autoit] [autoit][/autoit] [autoit]

    Func _Draw()
    _GDIPlus_GraphicsClear($hBuffer, 0xFFFFFFFF)
    For $i = 0 To $W - 1
    For $j = 0 To $H - 1
    If $Grid[$i][$j] > 0 Then _GDIPlus_GraphicsFillRect($hBuffer, $i * $Size, $j * $Size, $Size, $Size, $hBrush[$Grid[$i][$j]])
    Next
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $W * $Size, $H * $Size)
    EndFunc ;==>_Draw

    [/autoit] [autoit][/autoit] [autoit]

    Func _Redraw()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $W * $Size, $H * $Size)
    EndFunc ;==>_Redraw

    [/autoit] [autoit][/autoit] [autoit]

    Func _Left()
    Switch $Direction
    Case 0
    If $AntPos[0] > 0 Then
    $AntPos[0] -= 1
    Else
    $StopCalc = True
    EndIf
    Case 1
    If $AntPos[1] > 0 Then
    $AntPos[1] -= 1
    Else
    $StopCalc = True
    EndIf
    Case 2
    If $AntPos[0] < $W - 1 Then
    $AntPos[0] += 1
    Else
    $StopCalc = True
    EndIf
    Case 3
    If $AntPos[1] < $H - 1 Then
    $AntPos[1] += 1
    Else
    $StopCalc = True
    EndIf
    EndSwitch
    EndFunc ;==>_Left

    [/autoit] [autoit][/autoit] [autoit]

    Func _Right()
    Switch $Direction
    Case 0
    If $AntPos[0] < $W - 1 Then
    $AntPos[0] += 1
    Else
    $StopCalc = True
    EndIf
    Case 1
    If $AntPos[1] < $H - 1 Then
    $AntPos[1] += 1
    Else
    $StopCalc = True
    EndIf
    Case 2
    If $AntPos[0] > 0 Then
    $AntPos[0] -= 1
    Else
    $StopCalc = True
    EndIf
    Case 3
    If $AntPos[1] > 0 Then
    $AntPos[1] -= 1
    Else
    $StopCalc = True
    EndIf
    EndSwitch
    EndFunc ;==>_Right

    [/autoit] [autoit][/autoit] [autoit]

    Func _Click()
    For $i = 0 To 6
    If @GUI_CtrlId = $hButton[$i] Then
    If $Status[$i] = 0 Then
    GUICtrlSetData($hButton[$i], "Right")
    $Status[$i] = 1
    Else
    GUICtrlSetData($hButton[$i], "Left")
    $Status[$i] = 0
    EndIf
    EndIf
    Next
    EndFunc ;==>_Click

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    For $i = 0 To UBound($hBrush) - 1
    _GDIPlus_BrushDispose($hBrush[$i])
    Next
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Wer die Anzahl der Zustände vergrößern möchte, kann das ganz einfach machen, ich hatte nur keine Lust auf mehr Buttons + Farben :P

    Lg,
    Fresapore

    Edit: Marsis Bug ist behoben.

  • Bei mir verändert sich bis 7 nichts, und dann gehts aprupt viel zu schnell.
    In ner Halben Stunde hab ich ne aktualisierte Version. (von meiner Version).
    Die gibts dann für die Allgemeinheit.
    Dann ist für mich aber echt schluss mit dem Thema^^

  • Hi,

    cooles Teil, aber kann es sein, dass beim Minimieren des GUI die bisher gemalten Pixel unsichtbar werden? ;)

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Hi BugFix,

    danke für die Info, wusste ich bisher nicht - hab noch nie was mit GDI+ usw gemacht :D

    Wird wohl mal Zeit ;)

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.


  • Korrekt, das ist das normale Verhalten, wenn mit GDI oder WinAPI-Befehlen gezeichnet wird.


    Das passiert aber normalerweise nur, sofern kein Puffer genutzt wird.
    In meinen Versionen wird auf jeden Fall einer benutzt.