• 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
    [autoit]

    #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

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

    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

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

    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)

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

    If $x>0 Then $l=_get($x-1,$y)
    If $x<$xMAX Then $r=_get($x+1,$y)

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

    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

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

    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

    [/autoit]



    Edit: Neue Version sieht hübscher aus und geht schneller.
    Edit2: Feldgröße wählbar :P
    Edit3: POPUP-Fenster und Bug behoben.
    Edit4: Play und Pause (F1 und F2), sowie per Mausklick Feld verändern.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    5 Mal editiert, zuletzt von L3viathan2142 (8. März 2010 um 15:07)

  • Das ist kein Spiel im herkömmlichen Sinne. Wenns dich interessiert kannst du dir den Wiki-Artikel durchlesen, es ist ein mathematisches System, wann Häkchen dazu und wann wegkommen.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • ja dass es so kurz is is wirklich cool...
    ich hatte sowas letztens mit nem kumpel in c++ versucht, hatte die logik aber nicht ganz verstanden

    hier das gleiche mit schwarzen und weißen kästchen

    [autoit]

    #include <GUIConstantsEx.au3>
    Global $xMAX=InputBox("Feldgröße","Bitte x-Wert eingeben:",8)
    Global $yMAX=InputBox("Feldgröße","Bitte y-Wert eingeben:",8)
    $xMAX-=1
    $yMAX-=1
    $size=10
    HotKeySet("{ESC}","_exit")
    HotKeySet("{F5}","_Random")
    $hForm=GUICreate("Game of Life",$size*($xMAX+1)+10,$size*($yMAX+1)+30,-1,-1,0,0x80)
    GUISetBkColor(0x000000)
    Global $hCells[$xMAX+1][$yMAX+1], $type[$xMAX+1][$yMAX+1]
    For $i=0 To $xMAX
    For $j=0 To $yMAX
    $hCells[$i][$j]=GUICtrlCreateLabel("",2+$i*$size,2+$j*$size,$size,$size)
    If Random(0,1,1)=1 Then
    $type[$i][$j]=1
    GUICtrlSetBkColor(-1,0x000000)
    Else
    $type[$i][$j]=4
    EndIf
    Next
    Next
    GUISetState()
    While Sleep(500)
    _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
    GUICtrlSetBkColor($hCells[$i][$j],0xFFFFFF)
    $type[$i][$j]=4
    Case 4,5,6,7,8
    GUICtrlSetBkColor($hCells[$i][$j],0xFFFFFF)
    $type[$i][$j]=4
    Case 3
    GUICtrlSetBkColor($hCells[$i][$j],0x000000)
    $type[$i][$j]=1
    EndSwitch
    Next
    Next
    EndFunc

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

    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=$type[$x-1][$y-1]
    If $y>0 Then $o=$type[$x][$y-1]
    If $y>0 And $x<$xMAX Then $ro=($type[$x+1][$y-1])

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

    If $x>0 Then $l=($type[$x-1][$y])
    If $x<$xMAX Then $r=($type[$x+1][$y])

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

    If $x>0 And $y<$yMAX Then $lu=($type[$x-1][$y+1])
    If $y<$yMAX Then $u=($type[$x][$y+1])
    If $y<$yMAX And $x<$xMAX Then $ru=($type[$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 ($type[$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
    GUICtrlSetBkColor($hCells[$i][$j],0x000000)
    $type[$i][$j]=1
    EndIf
    Next
    Next
    EndFunc
    Func _exit()
    Exit
    EndFunc

    [/autoit]

    edit: sehe grad, dass du gerade eben ne neue version auch mit kästchen gemacht hast xD

  • Neue Version.
    Es ist noch sehr ineffektiv programmiert, aber mir mangelt es an Ideen, wie man das ganze schneller und kürzer machen kann...

    EDIT: LOL @YourDoom Gleiche Idee, etwas anders umgesetzt. (kannst du dein Skript bitte spoilern?)
    Jonathan: Statt X klicken Escape drücken :)

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • jautois das von dir ist ja mal richtig geil
    erst platzieren, danach anschauen, wie es verläuft
    ich werd später mal testen, ob das wie in den tutorials verläuft
    denn bei mir hats nie geklappt wie in den tuts

  • Und was für einen Sinn hat das ganze?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Und was für einen Sinn hat das ganze?

    Es geht darum, dass man mit Mathematik die Evulotionen erzeugt.
    Es ist ja schwer(zumindest für AutoIt anfänger und Mathe Schwänzer ^^), so etwas zu machen,
    und es erfordert halt Mathe Kenntnisse.
    Das sollte eig. der Sinn sein.
    Und wenn man so etwas schafft, möchte man es doch der Welt präsentieren ^^

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.