Hi,
basierend auf einem alten FreeBasic - Programm von mir, habe ich die Langton-Ameise nach AutoIt portiert
Wer keine Ahnung hat was eine Langton-Ameise ist -> Wikipedia
Die erste Version flackert sehr stark, deswegen hab ich noch eine in GDI gemacht, würde mich trotzdem mal interessieren warum das so ist. Und noch eine Frage: Ist Doublebuffering in AutoIt möglich ?
GUICtrlCreateGraphic - (!)Flackert stark(!)
Spoiler anzeigen
;#NoTrayIcon
[/autoit] [autoit][/autoit] [autoit]Opt("MustDeclareVars",1)
Opt("GUIOnEventMode",1)
Const $GUICLOSE = -3
[/autoit] [autoit][/autoit] [autoit]Const $GUI_GR_COLOR = 8
Const $GUI_GR_RECT = 10
Const $GUI_GR_REFRESH = 22
Const $TITLE = "template"
Const $WIDTH = 500
Const $HEIGHT = 500
Const $STEP = 50
Const $RECTSIZE = 5
Local $Graphics
[/autoit] [autoit][/autoit] [autoit]Const $WHITE = "0xFFFFFF"
Const $BLACK = "0x000000"
Local $Matrix[Round($WIDTH/$RECTSIZE)][Round($HEIGHT/$RECTSIZE)]
Enum $DOWN,$RIGHT,$UP,$LEFT
Local $Direction = 0
Local $Pos[2]
Local $Max[2] = [UBound($Matrix,1)-1,UBound($Matrix,2)-1]
main()
Func main()
For $x=0 To $Max[0] Step 1
For $y=0 To $Max[1] Step 1
$Matrix[$x][$y] = $WHITE
Next
Next
$Pos[0] = Round($Max[0]/2)
$Pos[1] = Round($Max[1]/2)
$Matrix[$Pos[0]][$Pos[1]] = $BLACK
GUICreate($TITLE,$WIDTH,$HEIGHT)
GUISetOnEvent($GUICLOSE,"_EXIT")
$Graphics = GUICtrlCreateGraphic(0,0,$WIDTH,$HEIGHT)
GUICtrlSetBkColor ( $Graphics, $WHITE )
AdlibEnable("_MOVE",$STEP)
GUISetState(@SW_SHOWNORMAL)
While 1
Sleep(1000)
GUICtrlSetGraphic($Graphics,$GUI_GR_REFRESH)
WEnd
EndFunc
Func _EXIT()
Exit
EndFunc
Func _MOVE()
Switch $Direction
Case $DOWN
$Pos[1] += 1
Case $RIGHT
$Pos[0] += 1
Case $UP
$Pos[1] -= 1
Case $LEFT
$Pos[0] -= 1
EndSwitch
If $Pos[0] >= $Max[0] Or $Pos[0] <= 0 Or $Pos[1] >= $Max[1] Or $Pos[1] <= 0 Then
MsgBox(32,$TITLE,"Ende der Simulation...")
_EXIT()
EndIf
If $Matrix[$Pos[0]][$Pos[1]] == $BLACK Then
$Matrix[$Pos[0]][$Pos[1]] = $WHITE
GUICtrlSetGraphic($Graphics,$GUI_GR_COLOR,$WHITE,$WHITE)
GUICtrlSetGraphic($Graphics,$GUI_GR_RECT,$Pos[0]*$RECTSIZE,$Pos[1]*$RECTSIZE,$RECTSIZE,$RECTSIZE)
If $Direction == $LEFT Then
$Direction = $DOWN
Else
$Direction += 1
EndIf
Else
$Matrix[$Pos[0]][$Pos[1]] = $BLACK
GUICtrlSetGraphic($Graphics,$GUI_GR_COLOR,$BLACK,$BLACK)
GUICtrlSetGraphic($Graphics,$GUI_GR_RECT,$Pos[0]*$RECTSIZE,$Pos[1]*$RECTSIZE,$RECTSIZE,$RECTSIZE)
If $Direction == $DOWN Then
$Direction = $LEFT
Else
$Direction -= 1
EndIf
EndIf
GUICtrlSetGraphic($Graphics,$GUI_GR_REFRESH)
EndFunc
GDI+
- hier ist es möglich mit STRG+J Schritte zu überspringen (man hat ja nicht den ganzen Tag Zeit )
Spoiler anzeigen
;#NoTrayIcon
#Include <GDIPlus.au3>
Opt("MustDeclareVars",1)
Opt("GUIOnEventMode",1)
_GDIPlus_Startup()
Const $GUI_EVENT_CLOSE = -3
Const $GUI_EVENT_RESTORE = -5
Const $TITLE = "Langton-Ameise"
Const $WIDTH = 500
Const $HEIGHT = 500
; Geschwindigkeit der Steps (kleiner ist schneller)
Const $STEP = 50
; Größe der Klötze in pixel
Const $RECTSIZE = 5
; Interne Berechnung
Local $Matrix[Round($WIDTH/$RECTSIZE)][Round($HEIGHT/$RECTSIZE)]
Enum $DOWN,$RIGHT,$UP,$LEFT
Local $Direction = 0
Local $Pos[2]
Local $Max[2] = [UBound($Matrix,1)-1,UBound($Matrix,2)-1]
; Ausgabe (GDI+)
Local $Graphics
Enum $BLACK,$WHITE
Local $Brushes[2] = [_GDIPlus_BrushCreateSolid("0xFF000000"),_GDIPlus_BrushCreateSolid("0xFFFFFFFF")]
main()
Func main()
Local $timer
For $x=0 To $Max[0] Step 1
For $y=0 To $Max[1] Step 1
$Matrix[$x][$y] = $WHITE
Next
Next
$Pos[0] = Round($Max[0]/2)
$Pos[1] = Round($Max[1]/2)
$Matrix[$Pos[0]][$Pos[1]] = $BLACK
$Graphics = _GDIPlus_GraphicsCreateFromHWND(GUICreate($TITLE,$WIDTH,$HEIGHT))
GUISetOnEvent($GUI_EVENT_CLOSE,"_EXIT")
GUISetOnEvent($GUI_EVENT_RESTORE,"_RESTORE")
GUISetBkColor("0xFFFFFF")
AdlibEnable("_MOVE",$STEP)
HotKeySet("^j","jump")
GUISetState(@SW_SHOWNORMAL)
While 1
Sleep(1000)
WEnd
EndFunc
Func _EXIT()
_GDIPlus_Shutdown()
Exit
EndFunc
Func _MOVE()
Switch $Direction
Case $DOWN
$Pos[1] += 1
Case $RIGHT
$Pos[0] += 1
Case $UP
$Pos[1] -= 1
Case $LEFT
$Pos[0] -= 1
EndSwitch
If $Pos[0] >= $Max[0] Or $Pos[0] <= 0 Or $Pos[1] >= $Max[1] Or $Pos[1] <= 0 Then
If MsgBox(36,$TITLE,"Ende der Simulation"&@CRLF&"Nochmal?") == 6 Then
For $x=0 To $Max[0] Step 1
For $y=0 To $Max[1] Step 1
$Matrix[$x][$y] = $WHITE
Next
Next
$Pos[0] = Round($Max[0]/2)
$Pos[1] = Round($Max[1]/2)
$Matrix[$Pos[0]][$Pos[1]] = $BLACK
_RESTORE()
Return
Else
_EXIT()
EndIf
EndIf
If $Matrix[$Pos[0]][$Pos[1]] == $BLACK Then
$Matrix[$Pos[0]][$Pos[1]] = $WHITE
_GDIPlus_GraphicsFillRect($Graphics,$Pos[0]*$RECTSIZE,$Pos[1]*$RECTSIZE,$RECTSIZE,$RECTSIZE,$Brushes[$WHITE])
If $Direction == $LEFT Then
$Direction = $DOWN
Else
$Direction += 1
EndIf
Else
$Matrix[$Pos[0]][$Pos[1]] = $BLACK
_GDIPlus_GraphicsFillRect($Graphics,$Pos[0]*$RECTSIZE,$Pos[1]*$RECTSIZE,$RECTSIZE,$RECTSIZE,$Brushes[$BLACK])
If $Direction == $DOWN Then
$Direction = $LEFT
Else
$Direction -= 1
EndIf
EndIf
EndFunc
Func _RESTORE()
AdlibDisable()
For $x=0 To $Max[0] Step 1
For $y=0 To $Max[1] Step 1
If $Matrix[$x][$y] == $BLACK Then
_GDIPlus_GraphicsFillRect($Graphics,$x*$RECTSIZE,$y*$RECTSIZE,$RECTSIZE,$RECTSIZE,$Brushes[$BLACK])
Else
_GDIPlus_GraphicsFillRect($Graphics,$x*$RECTSIZE,$y*$RECTSIZE,$RECTSIZE,$RECTSIZE,$Brushes[$WHITE])
EndIf
Next
Next
AdlibEnable("_MOVE",$STEP)
EndFunc
Func jump()
Local $input
AdlibDisable()
$input = InputBox($TITLE,"Wie viele Schritte sollen Übersprungen werden?","","",120,140)
If $input <> "" Then
$input = Number($input)
If $input <> 0 Then
For $i=0 To $input Step 1
_MOVE()
Next
_RESTORE()
EndIf
EndIf
AdlibEnable("_MOVE",$STEP)
EndFunc