Projekt-Idee: AutoIt for the win!

  • Hallo Forum!

    Mir ist vor kurzem folgende Idee gekommen:
    Für viele Leute ist AutoIt immernoch eine "Automatisierungssprache" oder sowas.
    Aber AutoIt kann viel mehr!

    Und das will ich / wollen wir, mit diesem Projekt beweisen.
    Galenda ist ein guter Anfang gewesen für die Au3 Welt, aber meine Idee geht darüber hinaus.

    Also habe ich eine winzige TicTacToe KI geschrieben. =)
    Nichts großes, und kein wirklich einwandfreier Code. Eben mal schnell hingeklatscht. :D

    *hust*, sie hat mich sauber 8:2 abgezogen...

    [autoit]


    #cs
    Tic-Tac-Toe v0.1
    programmiert von Daniel J.
    (c) Februar 2009
    #ce

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

    #include <GUIConstants.au3>

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

    Global $app_name = "Tic-Tac-Toe v1.0"
    Global $opp_points = 0
    Global $you_points = 0

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

    Global $all_turns = 1

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

    Dim $fields[10]
    For $i = 1 To 9
    $fields[$i] = " "
    Next

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

    Global $gui = GUICreate($app_name, 220, 220)
    Global $group_buttons = GUICtrlCreateGroup("Spielfeld", 10, 10, 200, 200)
    Dim $buttons[10], $y = 15
    For $i = 1 To 9
    If (Mod($i, 3) = 1) Then
    $x = 10
    $y += 40
    EndIf
    $x += 40
    $buttons[$i] = GUICtrlCreateButton(" ", $x, $y, 30, 30)
    GUICtrlSetFont(-1, -1, 1000)
    Next

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

    GUISetState(@SW_SHOW)

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

    Global $turn = 0
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then
    Exit
    Else
    For $i = 1 To 9
    If ($msg = $buttons[$i]) Then
    If ($fields[$i] = " ") Then
    $fields[$i] = "x"
    GUICtrlSetBkColor($buttons[$i], 0x00FF00)
    GUICtrlSetData($buttons[$i], "x")
    If (notOver()) Then
    $all_turns += 1
    computerTurn()
    Else
    $you_points += 1
    MsgBox(0, $app_name, "You win! MY POINTS: "&$opp_points&" YOUR POINTS: "&$you_points)
    newGame()
    EndIf
    EndIf
    EndIf
    Next
    EndIf
    WEnd

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

    Func winChance($letter)
    $chance = 0
    For $i = 1 To 9
    If ($fields[$i] = " ") Then
    $fields[$i] = $letter
    If (notOver() = False) Then
    $chance = $i
    EndIf
    $fields[$i] = " "
    EndIf
    Next
    Return $chance
    EndFunc

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

    Func computerTurn()
    $wc = winChance("o")
    If ($wc = 0) Then
    $wc = winChance("x")
    EndIf
    If ($wc = 0) Then
    Do
    $r = Random(1, 9)
    If ($fields[$r] = " ") Then
    $fields[$r] = "o"
    GUICtrlSetBkColor($buttons[$r], 0xFF0000)
    GUICtrlSetData($buttons[$r], "o")
    $found = True
    Else
    $found = False
    EndIf
    Until $found = True
    Else
    $fields[$wc] = "o"
    GUICtrlSetBkColor($buttons[$wc], 0xFF0000)
    GUICtrlSetData($buttons[$wc], "o")
    EndIf
    If (notOver()) Then
    $turn = 0
    $all_turns += 1
    Else
    $opp_points += 1
    MsgBox(0, $app_name, "I win! MY POINTS: "&$opp_points&" YOUR POINTS: "&$you_points)
    newGame()
    EndIf
    EndFunc

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

    Func notOver()
    If ($all_turns = 9) Then
    newGame()
    EndIf
    If (winLine(1, 2, 3) or winLine(1, 4, 7) or winLine(1, 5, 9) or winLine(3, 5, 7) or winLine(3, 6, 9) or winLine(4, 5, 6) or winLine(7, 8, 9) or winLine(2, 5, 8)) Then
    Return False
    Else
    Return True
    EndIf
    EndFunc

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

    Func newGame()
    $all_turns = 1
    $turn = 0
    For $i = 0 To 9
    GUICtrlSetData($buttons[$i], " ")
    GUICtrlSetBkColor($buttons[$i], -1)
    $fields[$i] = " "
    Next
    EndFunc

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

    Func winLine($a, $b, $c)
    If ($fields[$a] <> " " and $fields[$b] <> " " and $fields[$c] <> " ") Then
    If ($fields[$a] = $fields[$b] and $fields[$b] = $fields[$c]) Then
    Return True
    Else
    Return False
    EndIf
    Else
    Return False
    EndIf
    EndFunc

    [/autoit]
  • Erstmal nicht schlecht!
    Aber wenn man sich bisschen Gedanken macht gewinnt man das Spiel zu 0.

  • Jo es gibt eben nicht viel möglichkeiten^^ 4 gewinnt wäre schon schwieriger zu machen und zu gewinnen

  • Haha, genau das habe ich neulich gemacht. Und ich hatte den selben gedanken: TicTacToe ist zu einfach.

    Die Ki ist sehr schlecht da ich zu faul war alle Möglichen Sachen per Hand einzutragen. Darum arbeitet sie meistens nach den Zufallsprinzip ;)


  • Galenda ist ein guter Anfang gewesen für die Au3 Welt, aber meine Idee geht darüber hinaus.
    Also habe ich eine winzige TicTacToe KI geschrieben. =)

    :!: Über den Witz kann ich nicht wirklich lachen - oder hab ich was verpasst :?:

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • jaja^^ ich weiß^^
    aber der kann des doch nicht echt mit seinem...geschnipsel da vergleichen?
    ich schreib mir jez n prog des den code aus scite löscht und sag es is besser als organize includes :D
    *hust*
    ne ehrlich des is doch kein vergleich????
    und erst recht nicht witzig??

    Padmak

  • Tolle KI. Aber wenn ich anfangen darf gewinne ich so gut wie immer (so ist es eben, wenn man die Regeln blickt) ;)
    Hab außerdem nen Bug gefunden: Wenn man im letzten Zug gewinnt, wird das nicht gezählt. Daher die Funktion notOver so ändern:

    [autoit]


    Func notOver()
    If ($all_turns <= 9) And (winLine(1, 2, 3) or winLine(1, 4, 7) or winLine(1, 5, 9) or winLine(3, 5, 7) or winLine(3, 6, 9) or winLine(4, 5, 6) or winLine(7, 8, 9) or winLine(2, 5, 8)) Then
    Return False
    Else
    If ($all_turns >= 9) Then newGame()
    Return True
    EndIf
    EndFunc

    [/autoit]
  • Okay, war vielleicht wirklich schlecht formuliert.

    Mit gehts doch nicht um die KI oder so, das ist nun wirklich Geschnipsel und in glaub 30 min. ohne Planung programmiert.

    Das soll eher eine Kampagne sein, weil AutoIt einfach immer noch als "Task-Automation" Sprache oder sowas durchgeht, zumindest laut autoitscript.com und Wikipedia.

    Das ist sehr traurig, bei den Dingen die man damit machen kann.

    Mein bislang größtes Projekt - und das sollte an Galenda rankommen ;) - habe ich zu der Zeit entwickelt als ich als Praktikant (Versicherungsinformatiker) bei der Zurich gearbeitet hab, und dort einen "intelligenten Replikations- und Synchronisationsagenten" programmiert hab. ;)

    Satte 1500+ Zeilen Quellcode und das gesamte Pensum samt UDFs an Funktionen aufgebraucht. :D
    DLLs, TCP, Datenbank, Registry, usw...

    Ich finds halt doof, das eine so tolle Sprache so wenig gewürdigt wird. ;)