Ich habe mal eine Game of Life-Umsetzung geschrieben.
Mit F5 könnt ihr, wenn es mal nicht weitergeht, neues Leben streuen, mit Escape beenden.
Feldgröße ist frei wählbar.
Screenshot bei Feldgröße 15*15:
[Blockierte Grafik: http://www.abload.de/img/gols55b.png]
Skript
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode",1)
GLOBAL $PLAY=True
Global $xMAX=InputBox("Feldgröße","Bitte x-Wert eingeben:",15)
;~ Global $xMAX=32
Global $yMAX=InputBox("Feldgröße","Bitte y-Wert eingeben:",15)
;~ Global $yMAX=12
Global $feldgroesse=InputBox("Feldgröße","Bitte Feldgröße eingeben:",15)
;~ Global $feldgroesse=160
;Werte für Demo: 16,6,300/32,12,150
;~ AdlibRegister("_Random",10000);für Demo
;~ AdlibRegister("_MgP",1000);für Demo
$xMAX-=1
$yMAX-=1
$mgp=MouseGetPos()
HotKeySet("{ESC}","_exit")
HotKeySet("{F5}","_Random")
HotKeySet("{F2}","_Pause")
HotKeySet("{F1}","_Play")
HotKeySet("{F4}","_test")
$hForm=GUICreate("Game of Life",$feldgroesse*($xMAX+1),$feldgroesse*($yMAX+1),Default,Default,$WS_POPUP)
GUISetBkColor(0x000000)
Global $hCells[$xMAX+1][$yMAX+1][3]
For $i=0 To $xMAX
For $j=0 To $yMAX
$hCells[$i][$j][1]=GUICtrlCreateLabel($i & " " & $j,2+$i * $feldgroesse,2+$j*$feldgroesse,$feldgroesse,$feldgroesse)
GUICtrlSetOnEvent(-1,"_change")
$hCells[$i][$j][0]=0
GUICtrlSetColor(-1,0x000000)
GUICtrlSetBkColor(-1,0x000000)
If Random(0,1,1)=1 Then
_set($i,$j,"1")
EndIf
Next
Next
GUISetState()
While Sleep(50)
If $PLAY Then _doTheGame()
If _numAll()=0 Then _Random()
WEnd
Func _doTheGame()
For $i=0 To $xMAX
For $j=0 To $yMAX
$neighbors=_GetLiveNeighbors($i,$j)
Switch $neighbors
Case 0,1
_preset($i,$j,"0")
Case 4,5,6,7,8
_preset($i,$j,"0")
Case 3
_preset($i,$j,"1")
EndSwitch
Next
Next
_setAll()
EndFunc
Func _GetLiveNeighbors($x,$y)
Local $result=0,$lo=0,$o=0,$ro=0,$l=0,$r=0,$lu=0,$u=0,$ru=0
If $x>0 And $y>0 Then $lo=_get($x-1,$y-1)
If $y>0 Then $o=_get($x,$y-1)
If $y>0 And $x<$xMAX Then $ro=_get($x+1,$y-1)
If $x>0 Then $l=_get($x-1,$y)
If $x<$xMAX Then $r=_get($x+1,$y)
If $x>0 And $y<$yMAX Then $lu=_get($x-1,$y+1)
If $y<$yMAX Then $u=_get($x,$y+1)
If $y<$yMAX And $x<$xMAX Then $ru=_get($x+1,$y+1)
If $lo="1" Then $result+=1
If $o="1" Then $result+=1
If $ro="1" Then $result+=1
If $l="1" Then $result+=1
If $r="1" Then $result+=1
If $lu="1" Then $result+=1
If $u="1" Then $result+=1
If $ru="1" Then $result+=1
Return $result
EndFunc
Func _numall()
$return=0
For $i=0 To $xMAX
For $j=0 To $yMAX
If _get($i,$j)=1 Then $return +=1
Next
Next
Return $return
EndFunc
Func _Random()
For $i=0 To $xMAX
For $j=0 To $yMAX
If Random(0,1,1)=1 Then _set($i,$j,"1")
Next
Next
EndFunc
Func _exit()
Exit
EndFunc
Func _set($x,$y,$what)
Switch $what
Case "1"
$hCells[$x][$y][0]=1
GUICtrlSetColor($hCells[$x][$y][1],0xffffff)
GUICtrlSetBkColor($hCells[$x][$y][1],0xffffff)
Case Else
GUICtrlSetColor($hCells[$x][$y][1],0x000000)
GUICtrlSetBkColor($hCells[$x][$y][1],0x000000)
$hCells[$x][$y][0]=0
EndSwitch
EndFunc
Func _preset($x,$y,$what)
Switch $what
Case "1"
$hCells[$x][$y][2]=1
GUICtrlSetColor($hCells[$x][$y][1],0xffffff)
GUICtrlSetBkColor($hCells[$x][$y][1],0xffffff)
Case Else
GUICtrlSetColor($hCells[$x][$y][1],0x000000)
GUICtrlSetBkColor($hCells[$x][$y][1],0x000000)
$hCells[$x][$y][2]=0
EndSwitch
EndFunc
Func _setAll()
For $i=0 To $xMAX
For $j=0 To $yMAX
$hCells[$i][$j][0]=$hCells[$i][$j][2]
Next
Next
EndFunc
Func _get($x,$y)
Return $hCells[$x][$y][0]
EndFunc
Func _test()
_set(0,0,"1")
EndFunc
Func _mgp()
$mpg=MouseGetPos()
If $mgp[0] <> $mpg[0] Or $mgp[1] <> $mpg[1] Then Exit
EndFunc
Func _play()
$PLAY=True
;~ AdlibRegister("_Random",10000)
EndFunc
Func _pause()
$PLAY=False
;~ AdlibUnRegister("_Random")
EndFunc
Func _change()
$array=StringSplit(GUICtrlRead(@GUI_CtrlId)," ")
_set($array[1],$array[2],1-_get($array[1],$array[2]))
EndFunc
Edit: Neue Version sieht hübscher aus und geht schneller.
Edit2: Feldgröße wählbar
Edit3: POPUP-Fenster und Bug behoben.
Edit4: Play und Pause (F1 und F2), sowie per Mausklick Feld verändern.