Hallo,
ich programmiere gerade Tic Tac Toe mit GUI und einer random KI. Leider kommt bei mir immer
Recursion level has been exceeded - AutoIt will quit to prevent stack overflow
ich weiß, dass das ist weil sich die Funktion so oft aufgerufen hat. Ich sehe aber keine Lösung. Könntet ihr mir vielleicht sagen, was an meinem Programm falsch ist?
Code:
;TIC TAC TOE;
#include<GUIConstantsEx.au3>
Global $aSpielfeldbutton
Global $Check1 = 0
Global $Check2 = 0
Global $Check3 = 0
Global $Check4 = 0
Global $Check5 = 0
Global $Check6 = 0
Global $Check7 = 0
Global $Check8 = 0
Global $Check9 = 0
Global $KiZug = 0
Global $GewonnenEinzel = 0
$Spieler = 1
$Gewonnen = 0
Global $Ki = 0
Opt("GUIOnEventMode",1)
$GUIMenu = GUICreate("Tic Tac Toe - Hauptmenü", 600,600,-1,-1) ;Menü wird erstellt;
GUISetBkColor(0xffc125) ;GUI Hintergrundfarbe;
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$SpielenCtrl = GUICtrlCreateButton( "Spielen", 100,100, 400,50) ;Spielen-Button wird erstellt;
GUICtrlSetOnEvent( -1, "_Spielen")
GUICtrlSetFont(-1, 20)
GUICtrlSetBkColor(-1, 0x668B8B)
$OptionCtrl = GUICtrlCreateButton("Einstellungen", 100,300, 400, 50) ;Optionen-Button wird erstellt;
GUICtrlSetFont(-1, 10) ;Profil des Optionenbuttons;
GUICtrlSetBkColor($OptionCtrl, 0x32CD32)
$Credits = GUICtrlCreateButton ("Credits", 200,500, 200,50)
GUICtrlSetBkColor(-1, 0x9FF234)
GUICtrlSetOnEvent(-1, "_Credits")
$Einzelspieler = GUICtrlCreateButton ("Einzelspieler", 100,200,400,50) ;Einzelspieler;
GUICtrlSetBkColor(-1, 0x3445FF)
GUICtrlSetFont(-1, 20)
GUICtrlSetOnEvent($Einzelspieler, "_Einzelspieler")
$GUIOptions = GUICreate( "TIC TAC TOE - Options", 600,600,-1,-1) ;GUI für die Optionen wird erstellt;
GUISetBkColor( 0x5F5B5B, $GUIOptions)
$OptionsAudio = GUICtrlCreateButton( "Audio", 100,200,400,50) ;Audio Button wird erstellt;
GUICtrlSetBKColor(-1, 0x86CF5F)
GUICtrlSetFont(-1, 20,400)
GUISetOnEvent($GUI_Event_Close, "_ExitOption")
GUICtrlSetOnEvent( $OptionCtrl, "_Option")
GUICtrlSetOnEvent($OptionsAudio, "_Audio")
$Einzelspieler = GUICreate("Tic Tac Toe", 500,300,-1,-1) ;Spiele Buttons + Exit Buttons werden erstellt Einzelspieler;
Global $ButtonE1 = GUICtrlCreateButton( " ", 0,0, 100,100)
Global $ButtonE2 = GUICtrlCreateButton( "", 100,100, 100,100)
Global $ButtonE3 = GUICtrlCreateButton( "", 100,200, 100,100)
Global $ButtonE4 = GUICtrlCreateButton( "", 200,200, 100,100)
Global $ButtonE5 = GUICtrlCreateButton( "", 200,100, 100,100)
Global $ButtonE6 = GUICtrlCreateButton( "", 0,100, 100,100)
Global $ButtonE7 = GUICtrlCreateButton( "", 0,200, 100,100)
Global $ButtonE8 = GUICtrlCreateButton( "", 100,0, 100,100)
Global $ButtonE9 = GUICtrlCreateButton( "", 200,0, 100,100)
Global $ExitSpiel = GUICtrlCreateButton( "Exit", 400,100,50,50)
GUICtrlSetOnEvent($ExitSpiel, "_ExitSp")
GUICtrlSetOnEvent($ButtonE1, "checkE1")
GUICtrlSetOnEvent($ButtonE2, "checkE2")
GUICtrlSetOnEvent($ButtonE3, "checkE3")
GUICtrlSetOnEvent($ButtonE4, "checkE4")
GUICtrlSetOnEvent($ButtonE5, "checkE5")
GUICtrlSetOnEvent($ButtonE6, "checkE6")
GUICtrlSetOnEvent($ButtonE7, "checkE7")
GUICtrlSetOnEvent($ButtonE8, "checkE8")
GUICtrlSetOnEvent($ButtonE9, "checkE9")
$Spielen = GUICreate("Tic Tac Toe", 500,300,-1,-1) ;Spiele Buttons + Exit Buttons werden erstellt;
$Button1 = GUICtrlCreateButton( " ", 0,0, 100,100)
$Button2 = GUICtrlCreateButton( "", 100,100, 100,100)
$Button3 = GUICtrlCreateButton( "", 100,200, 100,100)
$Button4 = GUICtrlCreateButton( "", 200,200, 100,100)
$Button5 = GUICtrlCreateButton( "", 200,100, 100,100)
$Button6 = GUICtrlCreateButton( "", 0,100, 100,100)
$Button7 = GUICtrlCreateButton( "", 0,200, 100,100)
$Button8 = GUICtrlCreateButton( "", 100,0, 100,100)
$Button9 = GUICtrlCreateButton( "", 200,0, 100,100)
$ExitSpiel = GUICtrlCreateButton( "Exit", 400,100,50,50)
GUICtrlSetOnEvent($ExitSpiel, "_ExitSp")
GUICtrlSetOnEvent($Button1, "check1")
GUICtrlSetOnEvent($Button2, "check2")
GUICtrlSetOnEvent($Button3, "check3")
GUICtrlSetOnEvent($Button4, "check4")
GUICtrlSetOnEvent($Button5, "check5")
GUICtrlSetOnEvent($Button6, "check6")
GUICtrlSetOnEvent($Button7, "check7")
GUICtrlSetOnEvent($Button8, "check8")
GUICtrlSetOnEvent($Button9, "check9")
Global $Win1 = GUICtrlRead($Button1)
Global $Win2 = GUICtrlRead($Button2)
Global $Win3 = GUICtrlRead($Button3)
Global $Win4 = GUICtrlRead($Button4)
Global $Win5 = GUICtrlRead($Button5)
Global $Win6 = GUICtrlRead($Button6)
Global $Win7 = GUICtrlRead($Button7)
Global $Win8 = GUICtrlRead($Button8)
Global $Win9 = GUICtrlRead($Button9)
Global $WinE1 = GUICtrlRead($ButtonE1)
Global $WinE2 = GUICtrlRead($ButtonE2)
Global $WinE3 = GUICtrlRead($ButtonE3)
Global $WinE4 = GUICtrlRead($ButtonE4)
Global $WinE5 = GUICtrlRead($ButtonE5)
Global $WinE6 = GUICtrlRead($ButtonE6)
Global $WinE7 = GUICtrlRead($ButtonE7)
Global $WinE8 = GUICtrlRead($ButtonE8)
Global $WinE9 = GUICtrlRead($ButtonE9)
Func _Credits()
$Credits = GUICreate("Credits", 600,600, -1, -1) ;Credits werden erstellt;
$CreditCtrl = GUICtrlCreateLabel("Programmiert von: ", 100,100, 200,200)
$CreditCtrl1 = GUICtrlCreateLabel("Luca Werth ", 100,175, 400,200)
$CreditCtrl2 = GUICtrlCreateLabel("Leon Fath ", 100,250, 400,200)
$CreditCtrl3 = GUICtrlCreateLabel("Jesse Haferkamp ", 100,325,400,200)
$CreditCtrl4 = GUICtrlCreateLabel("Jonas Hermsen", 100,400, 400,200)
GUICtrlSetFont($CreditCtrl, 20)
GUICtrlSetFont($CreditCtrl1, 20)
GUICtrlSetFont($CreditCtrl2, 20)
GUICtrlSetFont($CreditCtrl3, 20)
GUICtrlSetFont($CreditCtrl4, 20)
GUISetState(@SW_SHOW, $Credits)
GUISetOnEvent($GUI_EVENT_CLOSE, "_HideCredits")
EndFunc
Global $SpielerE1 = 0
Func _Einzelspieler()
$Ki = 0
$Spieler = 1
GUISetState(@SW_SHOW, $Einzelspieler)
$SpielerE1 = InputBox("Spielername", "Gib deinen Namen an: ", "Name")
EndFunc
Func _HideCredits() ;Funktion um Credits zu verstecken;
GUISetState(@SW_HIDE, $Credits)
EndFunc
func _Exit() ;Funktion zum beenden des Programms;
Exit
EndFunc
func _Option() ;Funktion für den Options Button;
GUISwitch($GUIOptions)
GUISetState()
EndFunc
Func _Audio() ;Funktion für die Audioeinstellungen;
$SoundMenge = InputBox("Audioeinstellung", "Lautstärke (in % zwischen 0 und 100)", "Hier eingeben") ;Soundeinstellungen;
If $SoundMenge < 100 And $SoundMenge > 0 Then
SoundSetWaveVolume($SoundMenge)
MsgBox(0, "Sound wurde geändert", "Sound wurde auf " &$SoundMenge &"% geändert")
Else
MsgBox(0, "Falsche Eingabe", "Nicht in Bereich des Möglichen")
EndIf
EndFunc
Func _ExitOption() ;Funktionen zum Beenden der Optionen;
GUISetState(@SW_HIDE, $GUIOptions)
EndFunc
Func _Spielen() ;Funktion für´s spielen;
$Punktstand1 = 0
$Punktstand2 = 0
Global $Spieler1 = ""
Global $Spieler2 = ""
GUISetState(@SW_SHOW,$Spielen)
GUISetState(@SW_HIDE, $GUIMenu)
$Spieler1 = InputBox("Spieler 1", "Geben sie den Namen von Spieler 1 an", "Spieler 1")
$Spieler2 = InputBox("Spieler 2", "Geben sie den Namen von Spieler 2 an", "Spieler 2")
EndFunc
Func check1() ;Funktionen für die einzelnen Spielebuttons;
$check1 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button1, "X")
$Spieler = 2
Else
GUICtrlSetData($Button1, "O")
$Spieler = 1
EndIf
$Win1 = GUICtrlRead($Button1)
Gewonnen()
EndFunc
Func check2()
$check2 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button2, "X")
$Spieler = 2
Else
GUICtrlSetData($Button2, "O")
$Spieler = 1
EndIf
$Win2 = GUICtrlRead($Button2)
Gewonnen()
EndFunc
Func check3()
$check3 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button3, "X")
$Spieler = 2
Else
GUICtrlSetData($Button3, "O")
$Spieler = 1
EndIf
$Win3 = GUICtrlRead($Button3)
Gewonnen()
EndFunc
Func check4()
$check4 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button4, "X")
$Spieler = 2
Else
GUICtrlSetData($Button4, "O")
$Spieler = 1
EndIf
$Win4 = GUICtrlRead($Button4)
Gewonnen()
EndFunc
Func check5()
$check5 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button5, "X")
$Spieler = 2
Else
GUICtrlSetData($Button5, "O")
$Spieler = 1
EndIf
$Win5 = GUICtrlRead($Button5)
Gewonnen()
EndFunc
Func check6()
$check6 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button6, "X")
$Spieler = 2
Else
GUICtrlSetData($Button6, "O")
$Spieler = 1
EndIf
$Win6 = GUICtrlRead($Button6)
Gewonnen()
EndFunc
Func check7()
$check7 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button7, "X")
$Spieler = 2
Else
GUICtrlSetData($Button7, "O")
$Spieler = 1
EndIf
$Win7 = GUICtrlRead($Button7)
Gewonnen()
EndFunc
Func check8()
$check8 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button8, "X")
$Spieler = 2
Else
GUICtrlSetData($Button8, "O")
$Spieler = 1
EndIf
$Win8 = GUICtrlRead($Button8)
Gewonnen()
EndFunc
Func check9()
$check9 = 1
If $Spieler = 1 Then
GUICtrlSetData($Button9, "X")
$Spieler = 2
$KiZug = 1
Else
GUICtrlSetData($Button9, "O")
$Spieler = 1
EndIf
$Win9 = GUICtrlRead($Button9)
Gewonnen()
EndFunc
Func checkE1() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE1, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE1 = GUICtrlRead($ButtonE1)
$ButtonFrei1 = GUICtrlRead($ButtonE1)
GewonnenEinzel()
_KiZug()
EndFunc
Func checkE2() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE2, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE2 = GUICtrlRead($ButtonE2)
$ButtonFrei2 = GUICtrlRead($ButtonE2)
GewonnenEinzel()
_KiZug()
EndFunc
Func checkE3() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE3, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE3 = GUICtrlRead($ButtonE3)
$ButtonFrei3 = GUICtrlRead($ButtonE3)
GewonnenEinzel()
_KiZug()
EndFunc
Func checkE4() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE4, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE4 = GUICtrlRead($ButtonE4)
$ButtonFrei4 = GUICtrlRead($ButtonE4)
GewonnenEinzel()
_KiZug()
EndFunc
Func checkE5() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE5, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE5 = GUICtrlRead($ButtonE5)
$ButtonFrei5 = GUICtrlRead($ButtonE5)
GewonnenEinzel()
_KiZug()
EndFunc
Func checkE6() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE6, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE6 = GUICtrlRead($ButtonE6)
$ButtonFrei6 = GUICtrlRead($ButtonE6)
GewonnenEinzel()
_KiZug()
EndFunc
Func checkE7() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE7, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE7 = GUICtrlRead($ButtonE7)
$ButtonFrei7 = GUICtrlRead($ButtonE7)
Gewonnen()
_KiZug()
EndFunc
Func checkE8() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE8, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE8 = GUICtrlRead($ButtonE8)
$ButtonFrei8 = GUICtrlRead($ButtonE8)
GewonnenEinzel()
_KiZug()
EndFunc
Func checkE9() ;Funktionen für die einzelnen Spielebuttons checkE1 = checkEinzelspieler 1;
If $Spieler = 1 Then
GUICtrlSetData($ButtonE9, "X")
$Ki = 2
$Spieler = 0
EndIf
$WinE9 = GUICtrlRead($ButtonE9)
$ButtonFrei9 = GUICtrlRead($ButtonE9)
GewonnenEinzel()
_KiZug()
EndFunc
Global $ButtonFrei1 = GUICtrlRead($ButtonE1)
Global $ButtonFrei2 = GUICtrlRead($ButtonE2)
Global $ButtonFrei3 = GUICtrlRead($ButtonE3)
Global $ButtonFrei4 = GUICtrlRead($ButtonE4)
Global $ButtonFrei5 = GUICtrlRead($ButtonE5)
Global $ButtonFrei6 = GUICtrlRead($ButtonE6)
Global $ButtonFrei7 = GUICtrlRead($ButtonE7)
Global $ButtonFrei8 = GUICtrlRead($ButtonE8)
Global $ButtonFrei9 = GUICtrlRead($ButtonE9)
Func _KiZug()
$KiZahl = random(1,9,1)
Select
Case $KiZahl == 1 And $ButtonFrei1 == ""
Sleep(500)
GUICtrlSetData($ButtonE1, "O")
$ButtonFrei1 = GUICtrlRead($ButtonE1)
$WinE1 = 1
$Spieler = 1
Case $KiZahl == 2 And $ButtonFrei2 == ""
Sleep(500)
GUICtrlSetData($ButtonE2, "O")
$ButtonFrei2 = GUICtrlRead($ButtonE2)
$WinE2 = 1
$Spieler = 1
Case $KiZahl == 3 And $ButtonFrei3 == ""
Sleep(500)
GUICtrlSetData($ButtonE3, "O")
$ButtonFrei3 = GUICtrlRead($ButtonE3)
$WinE3 = 1
$Spieler = 1
Case $KiZahl == 4 And $ButtonFrei4 == ""
Sleep(500)
GUICtrlSetData($ButtonE4, "O")
$ButtonFrei4 = GUICtrlRead($ButtonE4)
$WinE4 = 1
$Spieler = 1
Case $KiZahl == 5 And $ButtonFrei5 == ""
Sleep(500)
GUICtrlSetData($ButtonE5, "O")
$ButtonFrei5 = GUICtrlRead($ButtonE5)
$WinE5 = 1
$Spieler = 1
Case $KiZahl == 6 And $ButtonFrei6 == ""
Sleep(500)
GUICtrlSetData($ButtonE6, "O")
$ButtonFrei6 = GUICtrlRead($ButtonE6)
$Spieler = 1
$WinE6 = 1
Case $KiZahl == 7 And $ButtonFrei7 == ""
Sleep(500)
GUICtrlSetData($ButtonE7, "O")
$ButtonFrei7 = GUICtrlRead($ButtonE7)
$WinE7 = 1
$Spieler = 1
Case $KiZahl == 8 And $ButtonFrei8 == ""
Sleep(500)
GUICtrlSetData($ButtonE8, "O")
$ButtonFrei8 = GUICtrlRead($ButtonE8)
$WinE8 = 1
$Spieler = 1
Case $KiZahl == 9 And $ButtonFrei9 == ""
Sleep(500)
$ButtonFrei9 = GUICtrlRead($ButtonE9)
GUICtrlSetData($ButtonE9, "O")
$WinE9 = 1
$Spieler = 1
Case Else
_KiZug()
EndSelect
EndFunc
Func _ExitSp() ;Man geht aus dem Mehrspieler raus;
GUISetState(@SW_HIDE, $Spielen)
GUISetState(@SW_HIDE, $Einzelspieler)
GUISetState(@SW_Show, $GUIMenu)
_reset()
EndFunc
Func _reset() ;Spielfeld wird zurückgesetzt;
GUICtrlSetData($Button1, "")
GUICtrlSetData($Button2, "")
GUICtrlSetData($Button3, "")
GUICtrlSetData($Button4, "")
GUICtrlSetData($Button5, "")
GUICtrlSetData($Button6, "")
GUICtrlSetData($Button7, "")
GUICtrlSetData($Button8, "")
GUICtrlSetData($Button9, "")
$Win1 = 0
$Win2 = 0
$Win3 = 0
$Win4 = 0
$Win5 = 0
$Win6 = 0
$Win7 = 0
$Win8 = 0
$Win9 = 0
GUICtrlSetData($ButtonE1, "")
GUICtrlSetData($ButtonE2, "")
GUICtrlSetData($ButtonE3, "")
GUICtrlSetData($ButtonE4, "")
GUICtrlSetData($ButtonE5, "")
GUICtrlSetData($ButtonE6, "")
GUICtrlSetData($ButtonE7, "")
GUICtrlSetData($ButtonE8, "")
GUICtrlSetData($ButtonE9, "")
$WinE1 = 0
$WinE2 = 0
$WinE3 = 0
$WinE4 = 0
$WinE5 = 0
$WinE6 = 0
$WinE7 = 0
$WinE8 = 0
$WinE9 = 0
$SpielerE1 = 1
EndFunc
Func GewonnenEinzel() ;Funktion zum Überprüfen wer/ob jemand gewonnen hat;
Select
Case $WinE1 == "X" And $WinE2 == "X" And $WinE4 == "X"
MsgBox(0, "Spiel zuende1" ,"Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE9 == "X" And $WinE2 == "X" And $WinE7 == "X"
MsgBox(0, "Spiel zuende", "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE1 == "X" And $WinE6 == "X" And $WinE7 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE1 == "X" And $WinE8 == "X" And $WinE9 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE9 == "X" And $WinE5 == "X" And $WinE4 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE7 == "X" And $WinE3 == "X" And $WinE4 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE8 == "X" And $WinE2 == "X" And $WinE3 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE6 == "X" And $WinE2 == "X" And $WinE5 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$SpielerE1)
$GewonnenEinzel = 1
_reset()
Case $WinE1 == "O" And $WinE2 == "O" And $WinE4 == "O"
MsgBox(0, "Spiel zuende" ,"Spiel zuende")
MsgBox(0, "SPieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case $WinE9 == "O" And $WinE2 == "O" And $WinE7 == "O"
MsgBox(0, "Spiel zuende", "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case $WinE1 == "O" And $WinE6 == "O" And $WinE7 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case $WinE1 == "O" And $WinE8 == "O" And $WinE9 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case $WinE9 == "O" And $WinE5 == "O" And $WinE4 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case $WinE7 == "O" And $WinE3 == "O" And $WinE4 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case $WinE8 == "O" And $WinE2 == "O" And $WinE3 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case $WinE6 == "O" And $WinE2 == "O" And $WinE5 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &"Computer")
$GewonnenEinzel = 1
_reset()
Case Else
If $WinE1 == "O" or $WinE1 == "X" Then ;Im Falle eines Unentschiedens;
If $WinE2 == "O" or $WinE2 == "X" Then
If $WinE3 == "O" or $WinE3 == "X" Then
If $WinE4 == "O" or $WinE4 == "X" Then
If $WinE5 == "O" or $WinE5 == "X" Then
If $WinE6 == "O" or $WinE6 == "X" Then
If $WinE7 == "O" or $WinE7 == "X" Then
If $WinE8 == "O" or $WinE8 == "X" Then
If $WinE9 == "O" or $WinE9 == "X" Then
MsgBox(0, "Ende", "Spiel ist zu Ende")
MsgBox(0, "Unentschieden", "Es gibt keinen Gewinner!")
_reset()
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndSelect
EndFunc
Func Gewonnen() ;Funktion zum Überprüfen wer/ob jemand gewonnen hat;
Select
Case $Win1 == "X" And $Win2 == "X" And $Win4 == "X"
MsgBox(0, "Spiel zuende1" ,"Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win9 == "X" And $Win2 == "X" And $Win7 == "X"
MsgBox(0, "Spiel zuende", "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win1 == "X" And $Win6 == "X" And $Win7 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win1 == "X" And $Win8 == "X" And $Win9 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win9 == "X" And $Win5 == "X" And $Win4 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win7 == "X" And $Win3 == "X" And $Win4 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win8 == "X" And $Win2 == "X" And $Win3 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win6 == "X" And $Win2 == "X" And $Win5 == "X"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler X", "Gewonnen hat: " &$Spieler1)
_reset()
Case $Win1 == "O" And $Win2 == "O" And $Win4 == "O"
MsgBox(0, "Spiel zuende" ,"Spiel zuende")
MsgBox(0, "SPieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case $Win9 == "O" And $Win2 == "O" And $Win7 == "O"
MsgBox(0, "Spiel zuende", "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case $Win1 == "O" And $Win6 == "O" And $Win7 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case $Win1 == "O" And $Win8 == "O" And $Win9 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case $Win9 == "O" And $Win5 == "O" And $Win4 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case $Win7 == "O" And $Win3 == "O" And $Win4 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case $Win8 == "O" And $Win2 == "O" And $Win3 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case $Win6 == "O" And $Win2 == "O" And $Win5 == "O"
MsgBox(0, "Spiel zuende" , "Spiel zuende")
MsgBox(0, "Spieler O", "Gewonnen hat: " &$Spieler2)
_reset()
Case Else
If $Win1 == "O" or $Win1 == "X" Then ;Im Falle eines Unentschiedens;
If $Win2 == "O" or $Win2 == "X" Then
If $Win3 == "O" or $Win3 == "X" Then
If $Win4 == "O" or $Win4 == "X" Then
If $Win5 == "O" or $Win5 == "X" Then
If $Win6 == "O" or $Win6 == "X" Then
If $Win7 == "O" or $Win7 == "X" Then
If $Win8 == "O" or $Win8 == "X" Then
If $Win9 == "O" or $Win9 == "X" Then
MsgBox(0, "Ende", "Spiel ist zu Ende")
MsgBox(0, "Unentschieden", "Es gibt keinen Gewinner!")
_reset()
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndSelect
EndFunc
while 1 ;wichtig damit die GUI offen bleibt;
WEnd
Ohne mir den kompletten Code angeguckt zu haben, würde ich vermuten dass dein "Case Else" die Rekursion verursacht. Ich würde die Funktion lieber in eine While-Schleife umbauen. Bist du dir sicher, dass immer mind. 1 $BUttonFrei Variable ein leerer String ist? Und wann tritt der Error auf? Direkt am Anfang oder nach einiger Zeit? Du könntest dein Code auch debuggen um nach dem Fehler zu suchen
Danke erstmal für die schnellen Antworten hier noch ein paar Infos:
Das Spiel (Tic Tac Toe mit KI) funktioniert so vom Code aus:
Wenn ich als Spieler gedrückt habe, dann wird die Funktion _KiZug() ausgeführt. In dieser Funktion wird eine Variable als random Zahl zwischen 1 und 9 (für die 9 Tic Tac Toe Buttons) gespeichert. Danach wird eine Case select schleife ausgeführt, die nach folgendem Prinzip arbeitet:
Wenn die Random Zahl == 1 ist und der Button1 (wird in der globalen Variable $ButtonFrei1 gespeichert) == "" ist, dann
...mache das und das
Das ganze wird auch noch für die anderen 8 Buttons gemacht. Falls keiner der Fälle eintritt, soll das ganze wiederholt werden.
Am Anfang klappt das noch ganz gut aber am Ende, wenn der Bot den letzten Button setzen soll (im falle eines Unentschiedens) dann kommt der stack overflow, obwohl die chance diesen Button zu erwischen ja bei 1 : 8 liegt. Das sollte den Stack doch nicht überlasten oder? Weil ich weiß nämlich nicht, wie man das sonst machen soll. Als Endlosschleife klappt das nicht, weil der PC soll ja nur setzen, wenn er auch dran ist, und nicht jedes Mal.
Global $winMatrix[8][9] = [[1,1,1,0,0,0,0,0,0], _ ;0 WIN METHOD
[0,0,0,1,1,1,0,0,0], _ ;1
[0,0,0,0,0,0,1,1,1], _ ;2
[1,0,0,1,0,0,1,0,0], _ ;3
[0,1,0,0,1,0,0,1,0], _ ;4
[0,0,1,0,0,1,0,0,1], _ ;5
[1,0,0,0,1,0,0,0,1], _ ;6
[0,0,1,0,1,0,1,0,0]] ;7
;1,1,1,0,0,0,0,0,0 is equivalent to *** U complete the first row with 3 same symbols
; 000
; 000 WHERE 0 IS ANY SYMBOL
; say your board is: x '' o
; o x o
; '' '' x
Global $MyBoard[9] = ["x","","o","o","x","o","","","x"] ;THIS IS JUST AN EXAMPLE U HAVE TO FIND OUT HOW TO ADD YOUR CURRENT BOARD TO THIS ARRAY
Func CheckWin()
Local $symbol = "x"
For $row = 0 To UBound($winMatrix,1)-1
$symbolC = 0
For $column = 0 To UBound($winMatrix,2) -1
If $winMatrix[$row][$column] <> 1 Then ContinueLoop
If $MyBoard[$column] = $symbol Then $symbolC+=1
If $symbolC = 3 Then Return $row
Next
Next
Return -1
EndFunc
MsgBox(0,"","You win with the method nº: "&CheckWin())
Stack Overflow bedeutet wie bereits mehrfach erwähnt immer eine Rekursion, welche das Speicherlimit von Autoit überschreitet.
Tuh dir am besten selbst den gefallen und gewöhn dir das Arbeiten mit Schleifen und Arrays an (gerade bei 2D Projekten wie diesem)...
Der Code kann so deutlich übersichtlicher gehalten, und somit auch kontrolliert werden. Es macht schon einen Unterschied ob man 100 oder 1000 Zeilen Code nach Fehlern durchsucht.
Vor einiger Zeit gab es hier schonmal wen, der sich an TicTacTow versucht hat, wo ich mal ein kleines Beispiel für einen recht übersichtlichen Code gezeigt habe:
Kannst dir ja mal anschauen, wie sowas aussehen könnte. Dort einen Random Click nach der Playeraktion zu erzeugen, würde auch nur 1-2 Zeilen Code mehr benötigen.
Hilfe, Stack Overflow! 01/29/2014 - AutoIt - 6 Replies Hallo ich programmiere grade mein ersten bot mit "ImageSearch" und habe das Problem das nach einer weile die Fehlermeldung stack overflow kommt und ich weis nicht wie ich das verhindern soll.
Ich arbeite mit autoit seit 2 Wochen und das ist mein Ergebnis.
Ich hoffe das ihr mir helfen könnt.
Danke.
Der autoit code
Voten für Deutsches Stack Overflow 02/14/2013 - Web Development - 2 Replies Die meisten bzw. viele von euch kennen sicher das Stack Overflow. Es gibt (schon sehr lange) eine möglichkeit zum Voten für ein Deutsches (: Wäre natürlich sehr schick wenn diese in die Beta kommt. Dafür braucht man aber viele Unterstützer. Also Votet (Committen auf der linken seite) (x
Stack Overflow (in German) - Area 51 - Stack Exchange
Recursion level has been exceeded - AutoIt will quit to prevent stack overflow. 01/20/2013 - AutoIt - 4 Replies Hallo Leute,
ich hab das folgende Problem mit meinem Bot:
Nach ca. 4-5 Std. Laufzeit meines Bots bekomme ich folgende Meldung...
"Recursion level has been exceeded - AutoIt will quit to prevent stack overflow."
Das ganze an völlig unterschiedlichen Stellen, es ist also wirklich die Addition die das Problem hervorruft und nicht eine bestimmte Funktion etc.
Koopa's Discount-Offer:Ectos 13,99€/stack! Lpicks 3,99/stack! 04/04/2012 - Guild Wars Trading - 0 Replies Hey ;)
My special offer until monday or sold-out. Enjoy :)
Ectos in stock:
10 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png
8 stacks sold
1 Stack = 13,99€