Tic-Tac-Toe

  • Ich wollte heute aus langeweile Tic-Tac-Toe coden. Ich kann zwar kein GDI+, aber Tic-Tac-Toe geht ja auch mit einer Gui. Naja, ich dachte das krieg ich schnell hin, aber ich hab irgendwo einen Fehler und find den einfach nicht :pinch: Wenn man das Spiel nämlich startet und dann ein Feld anklickt, kommt, egal welcher Spieler eigt. dran wäre, Kreuz oder Kreis. Hier mein Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    GUICreate("Tic-Tac-Toe", 219, 219, 212, 122, BitOR($WS_SYSMENU,$WS_CAPTION))
    $Pic1 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 0, 0, 73, 73)
    $Pic2 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 73, 0, 73, 73)
    $Pic3 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 146, 0, 73, 73)
    $Pic4 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 0, 73, 73, 73)
    $Pic5 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 73, 73, 73, 73)
    $Pic6 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 146, 73, 73, 73)
    $Pic7 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 0, 146, 73, 73)
    $Pic8 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 73, 146, 73, 73)
    $Pic9 = GUICtrlCreatePic(@ScriptDir&"\images\ttt.jpg", 146, 146, 73, 73)
    GUISetState(@SW_SHOW)
    WinSetOnTop ("Tic-Tac-Toe", "", 1)
    For $x = 1 to 8
    ControlClick("Tic-Tac-Toe", "", $x)
    Next
    Global $1 = 0
    Global $2 = 0
    Global $3 = 0
    Global $4 = 0
    Global $5 = 0
    Global $6 = 0
    Global $7 = 0
    Global $8 = 0
    Global $9 = 0
    Global $p = 0
    While true
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Pic1
    If $p < 1 And $1 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 0, 0, 72, 72)
    $p += 1
    $1 += 1
    ElseIf $p > 0 And $1 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 0, 0, 72, 72)
    $p -= 1
    $1 += 1
    EndIf
    Case $Pic2
    If $p < 1 And $2 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 73, 0, 72, 72)
    $p += 1
    $2 += 1
    ElseIf $p > 0 And $2 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 73, 0, 72, 72)
    $p -= 1
    $2 += 1
    EndIf
    Case $Pic3
    If $p < 1 And $3 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 146, 0, 72, 72)
    $p += 1
    $3 += 1
    ElseIf $p > 0 And $3 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 146, 0, 72, 72)
    $p -= 1
    $3 += 1
    EndIf
    Case $Pic4
    If $p < 1 And $4 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 0, 73, 72, 72)
    $p += 1
    $4 += 1
    ElseIf $p > 0 And $4 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 0, 73, 72, 72)
    $p -= 1
    $4 += 1
    EndIf
    Case $Pic5
    If $p < 1 And $5 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 73, 73, 72, 72)
    $p += 1
    $5 += 1
    ElseIf $p > 0 And $5 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 73, 73, 72, 72)
    $p -= 1
    $5 += 1
    EndIf
    Case $Pic6
    If $p < 1 And $6 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 146, 73, 72, 72)
    $p += 1
    $6 += 1
    ElseIf $p > 0 And $6 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 146, 73, 72, 72)
    $p -= 1
    $6 += 1
    EndIf
    Case $Pic7
    If $p < 1 And $7 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 0, 146, 72, 72)
    $p += 1
    $7 += 1
    ElseIf $p > 0 And $7 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 0, 146, 72, 72)
    $p -= 1
    $7 += 1
    EndIf
    Case $Pic8
    If $p < 1 And $8 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 73, 146, 72, 72)
    $p += 1
    $8 += 1
    ElseIf $p > 0 And $8 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 73, 146, 72, 72)
    $p -= 1
    $8 += 1
    EndIf
    Case $Pic9
    If $p < 1 And $9 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreis.jpg", 146, 146, 72, 72)
    $p += 1
    $9 += 1
    ElseIf $p > 0 And $9 < 2 Then
    GUICtrlCreatePic(@ScriptDir&"\images\kreuz.jpg", 146, 146, 72, 72)
    $p -= 1
    $9 += 1
    EndIf

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

    EndSwitch
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von Ineluki (16. Mai 2010 um 13:23)

  • Ich würds so machen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)
    $hGUI = GUICreate("Tic-Tac-Toe", 219, 219, 212, 122, BitOR($WS_SYSMENU, $WS_CAPTION))

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

    Global $aImgPath[2] = [@ScriptDir & "\images\kreuz.jpg", @ScriptDir & "\images\kreis.jpg"]
    Global $aGameArea[3][3][2]
    Global $PLAYER = 0

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

    For $x = 0 To 2
    For $y = 0 To 2
    $aGameArea[$x][$y][0] = -1
    $aGameArea[$x][$y][1] = GUICtrlCreatePic(@ScriptDir & "\images\ttt.jpg", 73 * $x, 73 * $y, 73, 73)
    GUICtrlSetOnEvent(-1, "MakeTurn")
    Next
    Next

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

    GUISetState(@SW_SHOW)
    WinSetOnTop("Tic-Tac-Toe", "", 1)

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

    While Sleep(100)
    ToolTip("Player " & $PLAYER + 1)
    WEnd

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

    Func MakeTurn()
    $iCtrlID = @GUI_CtrlId
    If CurrentlyOnPos($iCtrlID) = -1 Then
    Local $aPos = ControlGetPos($hGUI, "", $iCtrlID)
    GUICtrlCreatePic($aImgPath[$PLAYER], $aPos[0], $aPos[1], 72, 72)
    GUICtrlSetState(-1, 128)
    ;~ GUICtrlSetImage($iCtrlID, $aImgPath[$PLAYER])
    CurrentlyOnPos($iCtrlID, $PLAYER)
    CheckWinner($aGameArea)
    $PLAYER = ($PLAYER = 0) * 1
    EndIf
    EndFunc ;==>MakeTurn

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

    Func CurrentlyOnPos($iCtrlID, $vNewVal = -1)
    For $x = 0 To 2
    For $y = 0 To 2
    If $aGameArea[$x][$y][1] = $iCtrlID And $vNewVal > -1 Then $aGameArea[$x][$y][0] = $vNewVal
    If $aGameArea[$x][$y][1] = $iCtrlID Then Return $aGameArea[$x][$y][0]
    Next
    Next
    EndFunc ;==>CurrentlyOnPos

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

    Func _ArrayD($aArray)
    For $x = 0 To 2
    For $y = 0 To 2
    For $z = 0 To 0
    ConsoleWrite("$aArray[" & $x & "][" & $y & "][" & $z & "] = " & $aArray[$x][$y][$z] & @CRLF)
    Next
    Next
    Next
    EndFunc ;==>_ArrayD

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

    Func CheckWinner($aArray)
    If (($aArray[0][0][0] = $aArray[1][0][0] And $aArray[0][0][0] = $aArray[2][0][0]) Or ($aArray[0][0][0] = $aArray[0][1][0] And $aArray[0][0][0] = $aArray[0][2][0])) And $aArray[0][0][0] > -1 Then MsgBox(0, "", "Player " & $PLAYER + 1 & " gewinnt!")
    If ($aArray[0][1][0] = $aArray[1][1][0] And $aArray[0][1][0] = $aArray[2][1][0]) And $aArray[0][1][0] > -1 Then MsgBox(0, "", "Player " & $PLAYER + 1 & " gewinnt!")
    If ($aArray[0][2][0] = $aArray[1][2][0] And $aArray[0][2][0] = $aArray[2][2][0]) And $aArray[0][2][0] > -1 Then MsgBox(0, "", "Player " & $PLAYER + 1 & " gewinnt!")
    If ($aArray[1][0][0] = $aArray[1][1][0] And $aArray[1][0][0] = $aArray[1][2][0]) And $aArray[1][0][0] > -1 Then MsgBox(0, "", "Player " & $PLAYER + 1 & " gewinnt!")
    If (($aArray[2][0][0] = $aArray[2][1][0] And $aArray[2][0][0] = $aArray[2][2][0]) Or ($aArray[2][0][0] = $aArray[1][1][0] And $aArray[2][0][0] = $aArray[0][2][0])) And $aArray[2][0][0] > -1 Then MsgBox(0, "", "Player " & $PLAYER + 1 & " gewinnt!")
    If ($aArray[0][0][0] = $aArray[1][1][0] And $aArray[0][0][0] = $aArray[2][2][0]) And $aArray[0][0][0] > -1 Then MsgBox(0, "", "Player " & $PLAYER + 1 & " gewinnt!")
    Local $iCnt
    For $x = 0 To 2
    For $y = 0 To 2
    If $aArray[$x][$y][0] > -1 Then $iCnt += 1
    Next
    Next
    If $iCnt = 9 Then MsgBox(0,"","Unentschieden!")
    EndFunc ;==>CheckWinner

    [/autoit]
  • Ich post hier mal meine Version, hab ich jetzt kurz geschrieben :D

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    #NoTrayIcon

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

    Global $aButtons[9]
    Global $bX = True

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

    Opt("GuiOnEventMode", 1)

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

    $hMain = GUICreate("TicTacToe", 189, 193, 241, 133)
    $aButtons[0] = GUICtrlCreateButton("", 16, 8, 43, 41, $WS_GROUP)
    $aButtons[1] = GUICtrlCreateButton("", 72, 8, 43, 41, $WS_GROUP)
    $aButtons[2] = GUICtrlCreateButton("", 128, 8, 43, 41, $WS_GROUP)

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

    $aButtons[3] = GUICtrlCreateButton("", 16, 56, 43, 41, $WS_GROUP)
    $aButtons[4] = GUICtrlCreateButton("", 72, 56, 43, 41, $WS_GROUP)
    $aButtons[5] = GUICtrlCreateButton("", 128, 56, 43, 41, $WS_GROUP)

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

    $aButtons[6] = GUICtrlCreateButton("", 16, 104, 43, 41, $WS_GROUP)
    $aButtons[7] = GUICtrlCreateButton("", 72, 104, 43, 41, $WS_GROUP)
    $aButtons[8] = GUICtrlCreateButton("", 128, 104, 43, 41, $WS_GROUP)

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

    $ButtonRestart = GUICtrlCreateButton("Neu starten", 48, 160, 91, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_Restart")
    GUISetState(@SW_SHOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hMain)

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

    Global $aPoss[8][3] = [[$aButtons[0], $aButtons[1], $aButtons[2]], _ ; Erste Reihe waagrecht
    [$aButtons[3], $aButtons[4], $aButtons[5]], _ ; Zweite Reihe waagrecht
    [$aButtons[6], $aButtons[7], $aButtons[8]], _ ; Dritte Reihe waagrecht
    [$aButtons[0], $aButtons[3], $aButtons[6]], _ ; Erste Reihe senkrecht
    [$aButtons[1], $aButtons[4], $aButtons[7]], _ ; Zweite Reihe senkrecht
    [$aButtons[2], $aButtons[5], $aButtons[8]], _ ; Dritte Reihe senkrecht
    [$aButtons[0], $aButtons[4], $aButtons[8]], _ ; Diagonale links-oben -> rechts-unten
    [$aButtons[2], $aButtons[4], $aButtons[6]]] ; Diagonale rechts-oben -> links-unten

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

    For $i = 0 To UBound($aButtons, 1) - 1
    GUICtrlSetFont($aButtons[$i], 14, 400, 0, "MS Sans Serif")
    GUICtrlSetOnEvent($aButtons[$i], "_Pressed")
    Next

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Pressed()
    Switch $bX
    Case True
    GUICtrlSetData(@GUI_CtrlId, "X")
    $bX = False
    Case False
    GUICtrlSetData(@GUI_CtrlId, "O")
    $bX = True
    EndSwitch
    _CheckWin()
    EndFunc ;==>_Pressed

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

    Func _CheckWin()
    For $i = 0 To UBound($aPoss, 1) - 1
    Local $j = 2
    If GUICtrlRead($aPoss[$i][$j - 2]) == GUICtrlRead($aPoss[$i][$j - 1]) And GUICtrlRead($aPoss[$i][$j - 1]) == GUICtrlRead($aPoss[$i][$j]) And GUICtrlRead($aPoss[$i][$j]) <> '' Then
    For $k = 0 To 2
    GUICtrlSetBkColor($aPoss[$i][$k],0x00ff00)
    Next

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

    MsgBox(0, "SPIELENDE", "Der Spieler '" & GUICtrlRead($aPoss[$i][$j - 2]) & "' hat gewonnen!")
    _Restart()
    Return
    EndIf
    Next
    EndFunc ;==>_CheckWin

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

    Func _Restart()
    For $i = 0 To UBound($aButtons, 1) - 1
    GUICtrlSetData($aButtons[$i], "")
    GUICtrlSetBkColor($aButtons[$i],0xffffff)
    Next
    EndFunc ;==>_Restart

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Wär(glaub ich) sogar recht einfach...
    Falls man's anders nicht hinbekommt könnte man ja einfach die Nummer des Feldes schicken, das angeklickt wurde. Der Rest macht das Script dann ohne irgendeine Verbindung...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Wär(glaub ich) sogar recht einfach...
    Falls man's anders nicht hinbekommt könnte man ja einfach die Nummer des Feldes schicken, das angeklickt wurde. Der Rest macht das Script dann ohne irgendeine Verbindung...


    Genau das sollte man tun. Außerdem auf beiden Seiten noch einen Test erstellen, ob der Zug auch erlaubt ist, ansonsten wird der Zug (oder das Spiel) abgebrochen.