[Läuft] µitLight Dezember '10/Januar '11

  • Seltsam, jetzt sollte es aber funktionieren


    yep :thumbup:

    Neuer Bug gefunden in:

    [autoit]

    Func __Chess_Set($Start, $End, $Intern, $cleanup = True)

    [/autoit]


    Ups, da hast du zuviel gelöscht ^^
    Den Codeteil den du löschen solltest, ging nur bis zum Else Befehl (und natürlich auch der nachfolgende EndIf Befehl), der Codeteil im Else-Zweig selber, darf natürlich stehen bleiben (damit auch die Validierung für einen Zug vorgenommen werden kann)

    Also das hier wieder rein

    [autoit]

    If Not _Chess_Validate($Start, $End) Then
    If $Intern Then MsgBox(16, "µitLight Dezember '10 / Januar '11", "Kein gültiger Zug!")
    Return False
    EndIf

    [/autoit]

    Die Funktion müsste dann wieder so aussehen:

    [autoit]

    Func __Chess_Set($Start, $End, $Intern, $cleanup = True)
    If Not _Chess_Validate($Start, $End) Then
    If $Intern Then MsgBox(16, "µitLight Dezember '10 / Januar '11", "Kein gültiger Zug!")
    Return False
    EndIf
    If $gWhosTurn == $gPlayerColor Then _Chess_HumanTurn($End)

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

    _MarkField($Start & "," & $End)
    If $gEnPassant Then _MarkField($gEnPassant)
    _ClearField($Start)
    ;u.s.w.

    [/autoit]


    [...], aber: Die MsgBoxen sind doch einheitlich?


    In deiner jetzigen Version, ja :D

    Aber, solltest du den gelöschten Codeteil, wie oben beschrieben, wiederherstellen, dann hast du wieder zwei unterschiedliche MsgBox'en!
    Und zwar:
    (auflistung aller MsgBox'en, die es betrifft)

    • If $Intern Then MsgBox(16, "µitLight Dezember '10 / Januar '11", "Kein gültiger Zug!")
    • MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    • MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")


    Ist nur 'ne Kleinigkeit, mir gehen halt die echten Bugs aus :rock:

  • neue Runde gestartet ;)


    Nehme die Herausforderung an :rock:


    Da sind noch zwei alte (bereits gemeldete) Bugs offen, die hab ich mir mal vorgenommen. :D

    alte Bugs
    • Drück mal auf den "Befehle..."-Button und danach auf Ok um den Hinweis zu schließen.
      Führe dann einen "set a2 a3" Befehl aus:
      => Der Zug wird ausgeführt. (<= OK)
      => Der Hinweis (vom "Befehle..."-Button) erscheint wieder (<= ERROR)

      Drück mal auf den "Befehle..."-Button und danach auf Ok um den Hinweis zu schließen.
      Führe dann einen "set a2 a3" Befehl aus:
      => Der Zug wird ausgeführt. (<= OK)
      => Der Hinweis (vom "Befehle..."-Button) erscheint wieder (<= ERROR)

    • Ursprünglicher "Bug" mit der Hotkey Methode verschlimmbessert :P


      Stimmt, da geb ich dir Recht, gefällt mir dann so auch nicht :P
      Hmm, muss mir das mal durch den Kopf gehen lassen...
      [...]


      Hier würde ich dringend zur Verwendung von Hook raten. Damit läßt sich die Wirkung ganz gezielt auf einzelne Fenster und Controls festlegen. Somit kann man sicher stellen, dass ein Zug ausschließlich mit ENTER ausgeführt wird.
      [...]

    • Zum 1. Bug (spoiler: alte Bugs):
      Wie Ihr hier, [ offen ] Bug im GUICtrlSetOnEvent bzw. GUICtrlSetBkColor?, nachlesen könnt, ist das ein Bug in AutoIt.
      Ich wollte den Bug umgehen, indem ich

      • ein Bild über den Button lege
      • ein Image Control benutze
      • mit GDI+ den Button anmale


      leider haben mir (nach etlichen Tests) diese 3 Möglichkeiten gar nicht gefallen :(
      Also entschied ich vorerst, mich um den 2. Bug zu kümmern.

    • Zum 2. Bug (spoiler: alte Bugs):
      Da BugFix in seinem Beitrag, etwas von Hook (was ist das denn? ^^ ) erzählte, entschied ich mich zuerst dieses Problem mit Captain Hook zu lösen.

      Nach vielen, vielen Versuchen und Haareausraufen :cursing: ..., hab ich es letztendlich doch geschafft, es so zum laufen zu kriegen, wie ich mir das vorgestellt hatte. 8o

      Und als positiver Nebeneffekt, wurde der 1. Bug auch gleich mit "gelöst" :D

    Leider ist es nicht mit einem Einzeiler getan, also poste ich die gesamte Schach.au3.
    Jede Veränderte Codezeile hab ich mit

    [autoit]

    ;<CD>
    ;</CD>

    [/autoit]

    umschlossen! Somit könnt ihr alle Veränderungen (zum Original vom 10.12.2010) nachvollziehen.

    Schach.au3
    [autoit]

    ;<CD>
    #include-once
    ;</CD>

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

    ; =========================================
    ; Vielen Dank an xXlowXx und Oscar!!
    ; =========================================

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

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

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

    Opt('GUIOnEventMode', 1)

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

    OnAutoItExitRegister("_End")

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

    ;<CD>
    If Not $SMALLSCREEN Then
    Dim $hCbReg = DllCallbackRegister("__Check_Key", "long", "int;wparam;lparam")
    Dim $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hCbReg), _WinAPI_GetModuleHandle(0))
    Dim $sCtrl2Effect = "Edit1" ; ClassNameNN des Inputs
    Dim $sFunc2Call = "__Chess_Input"
    EndIf
    ;If Not $SMALLSCREEN Then HotKeySet("{ENTER}", "__Chess_Input")
    ;</CD>

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

    _GDIPlus_Startup()

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

    $iWidth = 564 ; Schachbrettgrösse (X)
    $iHeight = 564 ; Schachbrettgrösse (Y)
    $iFieldColor1 = 0xFF446622 ; Farbe für dunkles Feld (ARGB)
    $iFieldColor2 = 0xFF889966 ; Farbe für helles Feld (ARGB)
    $iFieldBkColor = 0xFF112211 ; Umrandung der Felder (ARGB)
    $iMarkFieldColor = 0xFFFFFF22 ; Farbe zum markieren der Felder (ARGB)
    $iGuiBkColor = 0x225522 ; Gui-Hintergrundfarbe (RGB)
    $iTextColor = 0xFFFFFF ; Beschriftungsfarbe (RGB)

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

    Dim $aChessmanW[16][3] = [['T', 'a1', 0],['S', 'b1', 0],['L', 'c1', 0],['D', 'd1', 0],['K', 'e1', 0],['L', 'f1', 0],['S', 'g1', 0],['T', 'h1', 0],['B', 'a2', 0],['B', 'b2', 0],['B', 'c2', 0],['B', 'd2', 0],['B', 'e2', 0],['B', 'f2', 0],['B', 'g2', 0],['B', 'h2', 0]] ; weisse Figuren (Iconname, Koordinaten, hImage)
    ; MG:
    Dim $aChessmanW_source[16][3] = [['T', 'a1', 0],['S', 'b1', 0],['L', 'c1', 0],['D', 'd1', 0],['K', 'e1', 0],['L', 'f1', 0],['S', 'g1', 0],['T', 'h1', 0],['B', 'a2', 0],['B', 'b2', 0],['B', 'c2', 0],['B', 'd2', 0],['B', 'e2', 0],['B', 'f2', 0],['B', 'g2', 0],['B', 'h2', 0]] ; weisse Figuren (Iconname, Koordinaten, hImage)

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

    Dim $aChessmanB[16][3] = [['T', 'a8', 0],['S', 'b8', 0],['L', 'c8', 0],['D', 'd8', 0],['K', 'e8', 0],['L', 'f8', 0],['S', 'g8', 0],['T', 'h8', 0],['B', 'a7', 0],['B', 'b7', 0],['B', 'c7', 0],['B', 'd7', 0],['B', 'e7', 0],['B', 'f7', 0],['B', 'g7', 0],['B', 'h7', 0]] ; schwarze Figuren (Iconname, Koordinaten, hImage)
    ; MG:
    Dim $aChessmanB_source[16][3] = [['T', 'a8', 0],['S', 'b8', 0],['L', 'c8', 0],['D', 'd8', 0],['K', 'e8', 0],['L', 'f8', 0],['S', 'g8', 0],['T', 'h8', 0],['B', 'a7', 0],['B', 'b7', 0],['B', 'c7', 0],['B', 'd7', 0],['B', 'e7', 0],['B', 'f7', 0],['B', 'g7', 0],['B', 'h7', 0]] ; schwarze Figuren (Iconname, Koordinaten, hImage)

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

    For $i = 0 To 15
    $aChessmanW[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanW[$i][0] & '_w.ico') ; weisses Figuren-Icon laden
    $aChessmanB[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanB[$i][0] & '_s.ico') ; schwarzes Figuren-Icon laden

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

    ; <MG>
    $aChessmanW_source[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanW[$i][0] & '_w.ico') ; weisses Figuren-Icon laden
    $aChessmanB_source[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanB[$i][0] & '_s.ico') ; schwarzes Figuren-Icon laden
    ; </MG>
    Next

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

    ; <MG>
    If $SMALLSCREEN Then
    $hGui = GUICreate('Schachbrett', $iWidth + 60, $iHeight + 60)
    Else
    $hGui = GUICreate('Schachbrett', $iWidth + 60, $iHeight + 100)
    EndIf
    ; </MG>

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

    ;<CD>
    GUISetOnEvent($GUI_EVENT_CLOSE, '_EndGUI')
    ;GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    ;</CD>
    GUISetBkColor($iGuiBkColor)
    GUICtrlSetDefColor($iTextColor) ; Standard-Textfarbe setzen
    GUISetFont(10, 400, 0, 'Verdana') ; Standard-Font setzen
    $hBrush1 = _GDIPlus_BrushCreateSolid($iFieldColor1) ; Pinsel für die dunklen Karos
    $hBrush2 = _GDIPlus_BrushCreateSolid($iFieldColor2) ; Pinsel für die hellen Karos
    Dim $aFieldColor[2] = [$hBrush1, $hBrush2], $hBrush, $iColor = True ; damit sie abwechselnd gezeichnet werden
    $hPen1 = _GDIPlus_PenCreate($iMarkFieldColor, 4) ; Stift für die Markierung der Felder
    $hPen2 = _GDIPlus_PenCreate($iFieldBkColor, 4) ; Stift für die normale Umrandung
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsClear($hBuffer, $iFieldBkColor)
    For $i = 0 To 7
    GUICtrlCreateLabel(8 - $i, 15, 64 + $i * 70, 20, 20) ; Zahlen links
    GUICtrlCreateLabel(8 - $i, 600, 64 + $i * 70, 20, 20) ; Zahlen rechts
    GUICtrlCreateLabel(Chr(97 + $i), 64 + $i * 70, 10, 20, 20) ; Buchstaben oben
    GUICtrlCreateLabel(Chr(97 + $i), 64 + $i * 70, 600, 20, 20) ; Buchstaben unten
    Next

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

    ; <MG>
    Global $CommandInput, $HelpButton
    If Not $SMALLSCREEN Then
    $CommandInput = GUICtrlCreateInput("", 10, $iHeight + 65, $iWidth - 70, 25)
    GUICtrlSetBkColor(-1, 0x008800)
    $HelpButton = GUICtrlCreateButton("Befehle...", $iWidth - 50, $iHeight + 65, 100, 25)
    GUICtrlSetOnEvent(-1, "__Chess_Befehle")
    GUICtrlSetBkColor(-1, 0x008800)
    GUICtrlSetFont(-1, 12, 500)
    EndIf

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

    Global $HumanTurn = False
    ; </MG>

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

    GUISetState()
    GUIRegisterMsg($WM_PAINT, '_WM_PAINT') ; WM_PAINT registrieren (neuzeichnen bei Fensterüberlagerung)

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

    _ResetField() ; Spielfeld leeren
    _NormalPosition() ; Figuren aufstellen (Grundstellung)

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

    $iSleep = 1000
    Sleep($iSleep)

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

    #cs
    Für $aChessmanW[Index][2] bzw. $aChessmanB[Index][2] ist Index =
    0 = a-Turm
    1 = b-Springer
    2 = c-Läufer
    3 = Dame
    4 = König
    5 = f-Läufer
    6 = g-Springer
    7 = h-Turm

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

    8 = a-Bauer
    9 = b-Bauer
    10 = c-Bauer
    11 = d-Bauer
    12 = e-Bauer
    13 = f-Bauer
    14 = g-Bauer
    15 = h-Bauer
    #ce

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

    _Chess_Initalize()

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

    While 1
    ; <MG>
    __Chess_HumanTurn()
    Sleep(100)
    __Chess_ComputerTurn()
    Sleep(100)
    ; </MG>
    WEnd

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

    Func _End()
    ;<CD>
    If Not $SMALLSCREEN Then
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hCbReg)
    EndIf
    ;</CD>
    For $i = 0 To 15
    _GDIPlus_ImageDispose($aChessmanB[$i][2])
    _GDIPlus_ImageDispose($aChessmanW[$i][2])
    Next
    _GDIPlus_PenDispose($hPen1)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_BrushDispose($hBrush1)
    _GDIPlus_BrushDispose($hBrush2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    _Chess_Cleanup()
    ;<CD>
    ;Exit
    ;</CD>
    EndFunc ;==>_End

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

    ;<CD>
    Func _EndGUI()
    If __Chess_MsgBox(1, "Schachprogramm beenden?", "Soll das Schachprogramm wirklich beendet werden?") = 1 Then Exit
    EndFunc
    ;</CD>

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

    Func _WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_PAINT

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

    Func _ResetField()
    For $i = 0 To 7
    For $j = 0 To 7
    _GDIPlus_GraphicsFillRect($hBuffer, 4 + $j * 70, 4 + $i * 70, 66, 66, $aFieldColor[$iColor]) ; Karomuster erstellen
    $iColor = Not $iColor ; abwechselnd
    Next
    $iColor = Not $iColor ; nach jeder Zeile Anfangsfarbe wechseln
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_ResetField

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

    Func _NormalPosition()
    For $i = 0 To 15
    ; <MG>
    $aChessmanW[$i][0] = $aChessmanW_source[$i][0]
    $aChessmanW[$i][1] = $aChessmanW_source[$i][1]
    $aChessmanW[$i][2] = $aChessmanW_source[$i][2]
    $aChessmanB[$i][0] = $aChessmanB_source[$i][0]
    $aChessmanB[$i][1] = $aChessmanB_source[$i][1]
    $aChessmanB[$i][2] = $aChessmanB_source[$i][2]
    ; </MG>

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

    _DrawChessman($aChessmanW[$i][2], $aChessmanW[$i][1], False) ; weisse Figur setzen
    _DrawChessman($aChessmanB[$i][2], $aChessmanB[$i][1], False) ; schwarze Figur setzen
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen

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

    ;<MG>
    For $y = 0 To 7
    For $x = 0 To 7
    If $y < 2 Then
    $gFeld[$x][$y][0] = "w"
    $gFeld[$x][$y][1] = $x + $y * 8
    ElseIf $y = 6 Then
    $gFeld[$x][$y][0] = "b"
    $gFeld[$x][$y][1] = $x + 8
    ElseIf $y = 7 Then
    $gFeld[$x][$y][0] = "b"
    $gFeld[$x][$y][1] = $x
    Else
    $gFeld[$x][$y][0] = 0
    $gFeld[$x][$y][1] = 16
    EndIf
    Next
    Next
    ;</MG>
    EndFunc ;==>_NormalPosition

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

    Func _ClearField($sCoordinates)
    Local $iX = Asc(StringLower(StringLeft($sCoordinates, 1))) - 97, $iY = 8 - StringRight($sCoordinates, 1)
    If Mod($iX, 2) Then
    If Mod($iY, 2) Then
    $hBrush = $hBrush2
    Else
    $hBrush = $hBrush1
    EndIf
    Else
    If Mod($iY, 2) Then
    $hBrush = $hBrush1
    Else
    $hBrush = $hBrush2
    EndIf
    EndIf
    $iX = 5 + $iX * 70
    $iY = 5 + $iY * 70
    _GDIPlus_GraphicsFillRect($hBuffer, $iX, $iY, 64, 64, $hBrush) ; Feld mit leerem Karo füllen
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_ClearField

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

    Func _DrawChessman($hChessman, $sCoordinates, $fPaint = False)
    Local $iX = Asc(StringLower(StringLeft($sCoordinates, 1))) - 97, $iY = 8 - StringRight($sCoordinates, 1)
    $iX = 5 + $iX * 70
    $iY = 5 + $iY * 70
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hChessman, $iX, $iY, 64, 64)
    If $fPaint Then _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_DrawChessman

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

    Func _MarkField($sCoordinates, $fMark = True)
    Local $aCoordinates = StringSplit(StringStripWS($sCoordinates, 8), ','), $iX, $iY
    For $i = 1 To $aCoordinates[0]
    $iX = 2 + (Asc(StringLower(StringLeft($aCoordinates[$i], 1))) - 97) * 70
    $iY = 2 + (8 - StringRight($aCoordinates[$i], 1)) * 70
    If $fMark Then
    _GDIPlus_GraphicsDrawRect($hBuffer, $iX, $iY, 70, 70, $hPen1)
    Else
    _GDIPlus_GraphicsDrawRect($hBuffer, $iX, $iY, 70, 70, $hPen2)
    EndIf
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_MarkField

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

    ; Funktionen, die von mir (MG) ergänzt wurden:
    Func _Chess_Set($Start, $End)
    Return __Chess_Set($Start, $End, False)
    EndFunc

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

    Func __Chess_Set($Start, $End, $Intern, $cleanup = True)
    If Not _Chess_Validate($Start, $End) Then
    ;<CD>
    If $Intern Then __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;If $Intern Then MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;</CD>
    Return False
    EndIf
    If $gWhosTurn == $gPlayerColor Then _Chess_HumanTurn($End)

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

    _MarkField($Start & "," & $End)
    If $gEnPassant Then _MarkField($gEnPassant)
    _ClearField($Start)
    _ClearField($End)
    If $gEnPassant Then _ClearField($gEnPassant)
    Local $who = __Chess_Wer_Auf_Feld($Start), $who2 = __Chess_Wer_Auf_Feld($End), $who3 = __Chess_Wer_Auf_Feld($gEnPassant)
    If @error Then
    SetError(1)
    Return ""
    EndIf
    $gFeld[Asc(StringLower(StringTrimRight($Start, 1))) - 97][Int(StringTrimLeft($Start, 1)) - 1][0] = 0
    $gFeld[Asc(StringLower(StringTrimRight($Start, 1))) - 97][Int(StringTrimLeft($Start, 1)) - 1][1] = 16
    If $gEnPassant Then
    $gFeld[Asc(StringLower(StringTrimRight($gEnPassant, 1))) - 97][Int(StringTrimLeft($gEnPassant, 1)) - 1][0] = 0
    $gFeld[Asc(StringLower(StringTrimRight($gEnPassant, 1))) - 97][Int(StringTrimLeft($gEnPassant, 1)) - 1][1] = 16
    EndIf

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

    If $who[0] = "w" Then
    _DrawChessman($aChessmanW[$who[1]][2], $End, True)
    $aChessmanW[$who[1]][1] = $End
    If $who2[1] < UBound($aChessmanB) Then $aChessmanB[$who2[1]][1] = 0
    If $gEnPassant And $who3[1] < UBound($aChessmanB) Then $aChessmanB[$who3[1]][1] = 0
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][0] = "w"
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][1] = $who[1]
    Else
    _DrawChessman($aChessmanB[$who[1]][2], $End, True)
    $aChessmanB[$who[1]][1] = $End
    If $who2[1] < UBound($aChessmanW) Then $aChessmanW[$who2[1]][1] = 0
    If $gEnPassant And $who3[1] < UBound($aChessmanW) Then $aChessmanW[$who3[1]][1] = 0
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][0] = "b"
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][1] = $who[1]
    EndIf
    If $cleanup Then
    Sleep($iSleep)
    _MarkField($Start & "," & $End, False)
    If $gEnPassant Then _MarkField($gEnPassant, False)
    EndIf

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

    Local $wer = _Chess_Who($gWhosTurn, $who[1])
    If $gWhosTurn = "w" And StringTrimLeft($End, 1) = 8 And $wer = "B" Then ; NUR BAUERN!
    __Chess_Umwandlung("w", $End)
    ElseIf $gWhosTurn = "b" And StringTrimLeft($End, 1) = 1 And $wer = "B" Then ; NUR BAUERN!
    __Chess_Umwandlung("b", $End)
    EndIf

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

    If $gEnPassant Then $gEnPassant = 0
    Return True
    EndFunc

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

    Func __Chess_Umwandlung($Color, $Feld)
    Local $wish, $who = __Chess_Wer_Auf_Feld($Feld)
    While True
    If $gPlayerColor = $Color Then
    Local $wish = StringUpper(InputBox("µitLight Dezember '10 / Januar '11", "Welche Figur darf es sein?" & @CRLF & @CRLF & "D" & @TAB & "- Dame" & @TAB & @TAB & "L" & @TAB & "- Läufer" & @CRLF & "T" & @TAB & "- Turm" & @TAB & @TAB & "S" & @TAB & "- Springer", "D"))
    If @error Then ContinueLoop
    Else
    $wish = StringUpper(_Chess_Event_Umtausch($Feld))
    EndIf
    If $wish = "D" Or $wish = "T" Or $wish = "L" Or $wish = "S" Then ExitLoop
    WEnd
    Switch $Color
    Case "w"
    $aChessmanW[$who[1]][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $wish & '_w.ico')
    $aChessmanW[$who[1]][0] = $wish
    _DrawChessman($aChessmanW[$who[1]][2], $Feld, True)
    Case "b"
    $aChessmanB[$who[1]][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $wish & '_s.ico')
    $aChessmanB[$who[1]][0] = $wish
    _DrawChessman($aChessmanB[$who[1]][2], $Feld, True)
    EndSwitch
    EndFunc

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

    Func __Chess_Wer_Auf_Feld($Feld)
    Local $returner[2]
    For $i = 0 To 15
    If $aChessmanW[$i][1] == StringLower($Feld) Then
    $returner[0] = "w"
    $returner[1] = $i
    Return $returner
    EndIf

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

    If $aChessmanB[$i][1] == StringLower($Feld) Then
    $returner[0] = "b"
    $returner[1] = $i
    Return $returner
    EndIf
    Next
    $returner[0] = 0
    $returner[1] = 16
    Return $returner
    EndFunc

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

    Func __Chess_HumanTurn()
    $gWhosTurn = $gPlayerColor

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

    If Not $SMALLSCREEN Then
    ;<CD>
    ControlClick($hGui, "", $CommandInput)
    ;GUICtrlSetState($CommandInput, $GUI_FOCUS)
    ;</CD>
    GUICtrlSetBkColor($CommandInput, 0x008800)
    EndIf

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

    $HumanTurn = True

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

    Local $value
    While $HumanTurn
    Sleep(100)
    If $SMALLSCREEN Then
    $value = InputBox("µitLight Dezember '10 / Januar '11", "Folgende Befehle stehen zur Verfügung:" & @CRLF & @CRLF & "set xy xy" & @TAB & "- Ziehe Figur von xy nach xy (Bsp: set e2 e4)" & @CRLF & "restart w/b" & @TAB & "- Startet das Spiel neu mit menschlichem Spieler w = weiß oder b = schwarz" & @CRLF & "rochade 0/1" & @TAB & "- Führt eine kleine (0) oder große (1) Rochade aus" & @CRLF & "abort" & @TAB & @TAB & "- die KI unterbrechen" & @CRLF & @CRLF & "Abbrechen beendet das Spiel!", "", "", 500, 250)
    ;<CD>
    If @error Then
    _EndGUI()
    Else
    __Chess_Input($value)
    EndIf
    ;If @error Then Exit
    ;__Chess_Input($value)
    ;</CD>
    EndIf
    WEnd

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

    If Not $SMALLSCREEN Then
    GUICtrlSetBkColor($CommandInput, 0x880000)
    EndIf
    EndFunc

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

    Func __Chess_ComputerTurn()
    Switch $gPlayerColor
    Case "w"
    $gWhosTurn = "b"
    Case "b"
    $gWhosTurn = "w"
    EndSwitch

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

    _Chess_ComputerTurn()
    EndFunc

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

    Func __Chess_Befehle()
    ;<CD>
    __Chess_MsgBox(64, "µitLight Dezember '10 / Januar '11", "Folgende Befehle stehen zur Verfügung:" & @CRLF & @CRLF & "set xy xy" & @TAB & @TAB & "- Ziehe Figur von xy nach xy (Bsp: set e2 e4)" & @CRLF & "restart w/b" & @TAB & "- Startet das Spiel neu mit menschlichem Spieler w = weiß oder b = schwarz" & @CRLF & "rochade 0/1" & @TAB & "- Führt eine kleine (0) oder große (1) Rochade aus" & @CRLF & "abort" & @TAB & @TAB & "- die KI unterbrechen" & @CRLF & @CRLF & "ENTER bestätigt die Eingabe im Feld!")
    ;__Chess_MsgBox(262208, "µitLight Dezember '10 / Januar '11", "Folgende Befehle stehen zur Verfügung:" & @CRLF & @CRLF & "set xy xy" & @TAB & @TAB & "- Ziehe Figur von xy nach xy (Bsp: set e2 e4)" & @CRLF & "restart w/b" & @TAB & "- Startet das Spiel neu mit menschlichem Spieler w = weiß oder b = schwarz" & @CRLF & "rochade 0/1" & @TAB & "- Führt eine kleine (0) oder große (1) Rochade aus" & @CRLF & "abort" & @TAB & @TAB & "- die KI unterbrechen" & @CRLF & @CRLF & "ENTER bestätigt die Eingabe im Feld!")
    ;</CD>
    ;<CD>
    ControlClick($hGui, "", $CommandInput)
    ;GUICtrlSetState($CommandInput, $GUI_FOCUS)
    ;</CD>
    EndFunc

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

    Func __Chess_Input($inputbox = "")
    ;<CD>
    If Not $SMALLSCREEN Then AdlibUnRegister($sFunc2Call)
    ;</CD>
    If $HumanTurn Then
    Local $value
    If $SMALLSCREEN Then
    $value = $inputbox
    Else
    ;<CD>
    ;If Not WinActive($hGui) Then Return ""
    ;</CD>
    $value = GUICtrlRead($CommandInput)
    EndIf
    Local $array = StringSplit($value, " ")

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

    If $array[1] = "set" Then
    If $array[0] > 2 Then
    Local $who = __Chess_Wer_Auf_Feld($array[2])
    If $who[0] == $gPlayerColor Then
    If __Chess_Set($array[2], $array[3], True) Then $HumanTurn = False
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;</CD>
    EndIf
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Zu wenig Parameter!")
    ;MsgBox(16, "µitLight Dezember '10 / Januar '11", "Zu wenig Parameter!")
    ;</CD>
    EndIf
    ElseIf $array[1] = "restart" Then
    If $array[0] = 1 Then
    __Chess_Reset($gPlayerColor)
    Else
    __Chess_Reset($array[2])
    EndIf
    ElseIf $array[1] = "rochade" Then
    If $array[0] = 1 Then
    If __Chess_Rochade(0) Then $HumanTurn = False
    Else
    If __Chess_Rochade($array[2]) Then $HumanTurn = False
    EndIf
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Bitte einen gültigen Befehl angeben!")
    ;Return MsgBox(16, "µitLight Dezember '10 / Januar '11", "Bitte einen gültigen Befehl angeben!")
    ;</CD>
    EndIf

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

    ;<CD>
    ;If Not $SMALLSCREEN Then GUICtrlSetData($CommandInput, "")
    ;</CD>
    Else
    ;<CD>
    If GUICtrlRead($CommandInput) = "abort" Then _Chess_AbortKI()
    ;</CD>
    EndIf

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

    ;<CD>
    If Not $SMALLSCREEN Then GUICtrlSetData($CommandInput, "")
    ;If GUICtrlRead($CommandInput) = "abort" Then _Chess_AbortKI()
    ;GUICtrlSetData($CommandInput, "")
    ;</CD>
    EndFunc

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

    Func __Chess_Reset($color)
    _Chess_Cleanup()

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

    _ResetField()
    _NormalPosition()
    $value = StringUpper($color)

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

    If $value = "B" Then
    $gPlayerColor = "b"
    $HumanTurn = False
    Else
    $gPlayerColor = "w"
    EndIf

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

    _Chess_Initalize()
    EndFunc

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

    Func _Chess_Rochade($big = False)
    If $big Then
    __Chess_Rochade(1)
    Else
    __Chess_Rochade(0)
    EndIf
    EndFunc

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

    Func __Chess_Rochade($big)
    If _Chess_Validate("", "", Int($big)) Then
    If $gWhosTurn = "w" Then
    Switch Int($big)
    Case 0
    __Chess_Set("e1", "g1", False, False)
    __Chess_Set("h1", "f1", False, False)
    Sleep($iSleep)
    _MarkField("e1,g1,h1,f1", False)
    Case 1
    __Chess_Set("e1", "c1", False, False)
    __Chess_Set("a1", "d1", False, False)
    Sleep($iSleep)
    _MarkField("e1,c1,a1,d1", False)
    EndSwitch
    ElseIf $gWhosTurn = "b" Then
    Switch Int($big)
    Case 0
    __Chess_Set("e8", "g8", False, False)
    __Chess_Set("h8", "f8", False, False)
    Sleep($iSleep)
    _MarkField("e8,g8,h8,f8", False)
    Case 1
    __Chess_Set("e8", "c8", False, False)
    __Chess_Set("a8", "d8", False, False)
    Sleep($iSleep)
    _MarkField("e8,c8,a8,d8", False)
    EndSwitch
    EndIf

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

    If $gPlayerColor = $gWhosTurn Then $HumanTurn = False
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;</CD>
    EndIf
    EndFunc

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

    Func _Chess_Won($Human = False)
    $text = "Spieler "
    If $Human Then
    $text &= "gewinnt!"
    Else
    $text &= "verliert!"
    EndIf
    ;<CD>
    __Chess_MsgBox(64, "µitLight Dezember '10 / Januar '11", $text)
    MsgBox(64, "µitLight Dezember '10 / Januar '11", $text)
    ;</CD>

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

    Local $value
    While 1
    $value = StringUpper(InputBox("µitLight Dezember '10 / Januar '11", "Welche Farbe? w = weiß, b = black"))
    ;<CD>
    If @error Or $value = "" Then
    _EndGUI()
    ElseIf $value = "W" Or $value = "B" Then
    ExitLoop
    EndIf
    ;If @error Or $value = "" Then Exit
    ;If $value = "W" Or $value = "B" Then ExitLoop
    ;</CD>
    WEnd
    __Chess_Reset($value)
    EndFunc

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

    Func _Chess_Who($Color, $Number)
    Switch $Color
    Case "w", "W"
    Return StringUpper($aChessmanW[$Number][0])
    Case "b", "B"
    Return StringUpper($aChessmanB[$Number][0])
    EndSwitch

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

    Return -1
    EndFunc

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

    ;<CD>
    Func __Check_Key($nCode, $wParam, $lParam)
    If $nCode < 0 _
    Or Not ($wParam = $WM_KEYDOWN) _
    Or Not (DllStructGetData(DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam), "vkCode") = 13) _
    Or Not (BitAND(WinGetState($hGui), 8) And ControlGetFocus($hGui) = $sCtrl2Effect) _
    Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    AdlibRegister($sFunc2Call, 1)
    Return -1
    EndFunc

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

    Func __Chess_MsgBox($flag, $title, $text, $timeout = 0, $hwnd = 0)
    If Not $hwnd Then $hwnd = $hGui
    Return MsgBox($flag, $title, $text, $timeout, $hwnd)
    EndFunc
    ;</CD>

    [/autoit]

    Hier folgen jetzt ein paar neue Bugs, die Korrektur hab ich aber auch schon in die Schach.au3 integriert.
    Ich schreibs, so wie sonst auch, einfach hin. Zur Nachverfolgung ;)

    • Mit dem Befehl
      [autoit]GUICtrlSetState($CommandInput, $GUI_FOCUS)[/autoit]
      bekommt die InputBox den Focus
      => OK, so wollt ichs ja haben 8)

      und der Text in der InputBox wird markiert
      => gefällt mir jetzt so überhaupt nicht :P , da es öfters vorkommt (meistens beim Programmstart oder während die KI beschäftigt ist), während ich einen Befehl schreibe, der Focus gesetzt wird (mein Initialisieren beim Programmstart mit sleep(9999) braucht halt ne weile :whistling: ) und somit alles markiert wird. Und dadurch mitten im Befehle schreiben alles wieder gelöscht wird :rolleyes: Also nochmal von vorn :cursing:

      Besser den Focus mit diesem Befehl setzen

      [autoit]

      ControlClick($hGui, "", $CommandInput)

      [/autoit]


      Bisher keine Probleme :D

    • Wenn man die GUI schließt, dann wird die
      [autoit]Func _End()[/autoit]
      zweimal aufgerufen.
      Bugbehebung:

      • Hab in _End() das Exit auskommentiert!
      • [autoit]GUISetOnEvent($GUI_EVENT_CLOSE, '_End')[/autoit]
        in
        [autoit]GUISetOnEvent($GUI_EVENT_CLOSE, '_EndGUI')[/autoit]
        abgeändert.
      • Neue Funktion eingetragen:
        [autoit]Func _EndGUI()
        Exit
        EndFunc
        [/autoit]
    • Wenn man keinen gültigen Befehl eingibt, dann bleibt der String in der InputBox erhalten
      => ist aber bei den anderen InputBox-Fehleingaben nicht so.

      Habs hier angepasst:

      [autoit]

      Return MsgBox(16, "µitLight Dezember '10 / Januar '11", "Bitte einen gültigen Befehl angeben!")

      [/autoit]


      einfach das Return weg

      [autoit]

      MsgBox(16, "µitLight Dezember '10 / Januar '11", "Bitte einen gültigen Befehl angeben!")

      [/autoit]


      damit der nachfolgende Befehl, die InputBox leeren kann.

      In diesem Zug, hab ich auch gleich die nachfolgenden Befehle etwas geordnet.


    Feature eingebaut:

    • Sicherheitsabfrage beim Beenden.
      [autoit]Func _EndGUI()
      If __Chess_MsgBox(1, "Schachprogramm beenden?", "Soll das Schachprogramm wirklich beendet werden?") = 1 Then Exit
      EndFunc
      [/autoit]
      Auch für Smallscreen Input angepasst *zuautobertschau*
      In der __Chess_HumanTurn() Funktion, das hier
      [autoit]If @error Then Exit
      __Chess_Input($value)
      [/autoit]
      durch das hier
      [autoit]If @error Then
      _EndGUI()
      Else
      __Chess_Input($value)
      EndIf
      [/autoit]
      ersetzt.

      Das gleiche ber der _Chess_Won() Funktion
      Aus alt

      [autoit]

      If @error Or $value = "" Then Exit
      If $value = "W" Or $value = "B" Then ExitLoop

      [/autoit]


      mach neu

      [autoit]

      If @error Or $value = "" Then
      _EndGUI()
      ElseIf $value = "W" Or $value = "B" Then
      ExitLoop
      EndIf

      [/autoit]

    So das wars fürs erste, kommen später bestimmt noch ein paar Bugs zu Tage, aber nicht mehr heute Nacht, bin zu müde :sleeping:

    PS:
    *gähn* muß noch den anderen Thread auf gelöst setzen, ob ich das noch schaff? :sleeping::sleeping::sleeping:

  • Hallo allerseits!

    Danke Cyberdyne, deine Version wurde übernommen und hochgeladen. Morgen geht der Wettbewerb dann an den Start, wenn bis dahin nichts einzuwenden ist!

    Gruß aus dem Pott,
    Matthias

  • Bughunter in the House :rock:

    • Hab vergessen, 2 MsgBox'en auszukommentieren
      In
      [autoit]Func __Chess_Rochade($big)[/autoit]
      und
      [autoit]Func _Chess_Won($Human = False)[/autoit]
      müssen die beiden MsgBox'en
      [autoit]MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")[/autoit]
      [autoit]MsgBox(64, "µitLight Dezember '10 / Januar '11", $text)[/autoit]
      auskommentiert/gelöscht werden!


    • In
      [autoit]Func __Chess_Set($Start, $End, $Intern, $cleanup = True)[/autoit]
      sind diese Codezeilen
      [autoit]
      If @error Then
      SetError(1)
      Return ""
      EndIf[/autoit]
      überflüssig, da davor __Chess_Wer_Auf_Feld() aufgerufen wird und diese Funktion nicht das @error Makro setzt.
      Also auskommentieren/löschen
      [autoit]
      ;If @error Then
      ; SetError(1)
      ; Return ""
      ;EndIf[/autoit]


    • In
      [autoit]Func __Chess_Umwandlung($Color, $Feld)[/autoit]
      wird das
      [autoit]Local $wish = StringUpper(InputBox("µitLight Dezember '10 / Januar '11", "Welche Figur darf es sein?" & @CRLF & @CRLF & "D" & @TAB & "- Dame" & @TAB & @TAB & "L" & @TAB & "- Läufer" & @CRLF & "T" & @TAB & "- Turm" & @TAB & @TAB & "S" & @TAB & "- Springer", "D"))
      If @error Then ContinueLoop[/autoit]
      @error Makro nie "Not 0" werden, da die Funktion StringUpper() das @error Makro von der InputBox überschreibt ;)
      Um das zu verhindern, einfach die Funktionen StringUpper und InputBox, jede für sich in eine Zeile schreiben.
      [autoit]Local $wish = InputBox("µitLight Dezember '10 / Januar '11", "Welche Figur darf es sein?" & @CRLF & @CRLF & "D" & @TAB & "- Dame" & @TAB & @TAB & "L" & @TAB & "- Läufer" & @CRLF & "T" & @TAB & "- Turm" & @TAB & @TAB & "S" & @TAB & "- Springer", "D", " M1")
      If @error Then ContinueLoop
      $wish = StringUpper($wish)[/autoit]


    • In
      [autoit]Func _Chess_Won($Human = False)[/autoit]
      ist das gleiche Problem wie im Punkt drüber.
      [autoit]$value = StringUpper(InputBox("µitLight Dezember '10 / Januar '11", "Welche Farbe? w = weiß, b = black"))
      If @error Or $value = "" Then
      _EndGUI()
      ElseIf $value = "W" Or $value = "B" Then
      ExitLoop
      EndIf[/autoit]
      Problembehebung genau wie oben
      [autoit]$value = InputBox("µitLight Dezember '10 / Januar '11", "Welche Farbe? w = weiß, b = black", " M1")
      If @error Then
      _EndGUI()
      ContinueLoop
      EndIf
      $value = StringUpper($value)
      If $value = "W" Or $value = "B" Then ExitLoop[/autoit]


    • Das hier ist kein Bug,
      aber weil ich im obigen Punkt hinter dem _EndGUI() ein ContinueLoop verpasst habe, wollte ich hier
      [autoit]Func __Chess_HumanTurn()[/autoit]
      das in gleicher weise anpassen.
      Statt dem hier
      [autoit]If @error Then
      _EndGUI()
      Else
      __Chess_Input($value)
      EndIf[/autoit]
      also das hier
      [autoit]If @error Then
      _EndGUI()
      ContinueLoop
      EndIf
      __Chess_Input($value)[/autoit]


    • Wenn ich am Anfang "restart b" eingebe und danach (natürlich wenn die KI fertig ist) gleich wieder "restart w", dann wird bei meinem 1. Zug die Funktion _Chess_HumanTurn() nicht aufgerufen.

      Der Fehler liegt in der

      [autoit]

      Func __Chess_Reset($color)

      [/autoit]


      dort wurde die Globale Variable $gWhosTurn nicht gesetzt.

      Dort gehört sie rein.

      [autoit]

      If $value = "B" Then
      $gPlayerColor = "b"
      $HumanTurn = False
      Else
      $gPlayerColor = "w"
      $gWhosTurn = "w"
      EndIf

      [/autoit]


    • Wenn ich mit $SMALLSCREEN = True das Skript starte, dann kann ich (oder AutoBert) kein 'abort' eingeben um die KI zu beenden.
      Also hab ich kurzerhand das Hook-System für $SMALLSCREEN (und auch für Not $SMALLSCREEN) erweitert.
      Jetzt kann man, sobald die KI dran ist, einfach die Esc-Taste drücken, um die Ki zu unterbrechen :D

    Ich poste einfach wieder die gesamte Schach.au3

    • alle hier gelisteten Bugfixes/Korrekturen sind enthalten
    • wie immer hab ich veränderte Codezeilen zwischen <CD> und </CD> gepackt.
    • auskommentierte Codezeilen, hab ich gleich gelöscht.
    • Veränderungen, die ich innerhalb von <CD> und </CD> gemacht habe (z.B. in __Check_Key() ), habe ich nicht extra hervorgehoben.
    Schach.au3
    [autoit]

    ;<CD>
    #include-once
    ;</CD>

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

    ; =========================================
    ; Vielen Dank an xXlowXx und Oscar!!
    ;
    ; Einen besonderen Dank auch an Cyberdyne!!
    ; =========================================

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

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

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

    Opt('GUIOnEventMode', 1)

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

    OnAutoItExitRegister("_End")

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

    ;<CD>
    Dim $hCbReg = DllCallbackRegister("__Check_Key", "long", "int;wparam;lparam")
    Dim $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hCbReg), _WinAPI_GetModuleHandle(0))
    Dim $bEscAbortKI = False
    If Not $SMALLSCREEN Then
    Dim $sCtrl2Effect = "Edit1" ; ClassNameNN des Inputs
    Dim $sFunc2Call = "__Chess_Input"
    EndIf
    ;</CD>

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

    _GDIPlus_Startup()

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

    $iWidth = 564 ; Schachbrettgrösse (X)
    $iHeight = 564 ; Schachbrettgrösse (Y)
    $iFieldColor1 = 0xFF446622 ; Farbe für dunkles Feld (ARGB)
    $iFieldColor2 = 0xFF889966 ; Farbe für helles Feld (ARGB)
    $iFieldBkColor = 0xFF112211 ; Umrandung der Felder (ARGB)
    $iMarkFieldColor = 0xFFFFFF22 ; Farbe zum markieren der Felder (ARGB)
    $iGuiBkColor = 0x225522 ; Gui-Hintergrundfarbe (RGB)
    $iTextColor = 0xFFFFFF ; Beschriftungsfarbe (RGB)

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

    Dim $aChessmanW[16][3] = [['T', 'a1', 0],['S', 'b1', 0],['L', 'c1', 0],['D', 'd1', 0],['K', 'e1', 0],['L', 'f1', 0],['S', 'g1', 0],['T', 'h1', 0],['B', 'a2', 0],['B', 'b2', 0],['B', 'c2', 0],['B', 'd2', 0],['B', 'e2', 0],['B', 'f2', 0],['B', 'g2', 0],['B', 'h2', 0]] ; weisse Figuren (Iconname, Koordinaten, hImage)
    ; MG:
    Dim $aChessmanW_source[16][3] = [['T', 'a1', 0],['S', 'b1', 0],['L', 'c1', 0],['D', 'd1', 0],['K', 'e1', 0],['L', 'f1', 0],['S', 'g1', 0],['T', 'h1', 0],['B', 'a2', 0],['B', 'b2', 0],['B', 'c2', 0],['B', 'd2', 0],['B', 'e2', 0],['B', 'f2', 0],['B', 'g2', 0],['B', 'h2', 0]] ; weisse Figuren (Iconname, Koordinaten, hImage)

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

    Dim $aChessmanB[16][3] = [['T', 'a8', 0],['S', 'b8', 0],['L', 'c8', 0],['D', 'd8', 0],['K', 'e8', 0],['L', 'f8', 0],['S', 'g8', 0],['T', 'h8', 0],['B', 'a7', 0],['B', 'b7', 0],['B', 'c7', 0],['B', 'd7', 0],['B', 'e7', 0],['B', 'f7', 0],['B', 'g7', 0],['B', 'h7', 0]] ; schwarze Figuren (Iconname, Koordinaten, hImage)
    ; MG:
    Dim $aChessmanB_source[16][3] = [['T', 'a8', 0],['S', 'b8', 0],['L', 'c8', 0],['D', 'd8', 0],['K', 'e8', 0],['L', 'f8', 0],['S', 'g8', 0],['T', 'h8', 0],['B', 'a7', 0],['B', 'b7', 0],['B', 'c7', 0],['B', 'd7', 0],['B', 'e7', 0],['B', 'f7', 0],['B', 'g7', 0],['B', 'h7', 0]] ; schwarze Figuren (Iconname, Koordinaten, hImage)

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

    For $i = 0 To 15
    $aChessmanW[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanW[$i][0] & '_w.ico') ; weisses Figuren-Icon laden
    $aChessmanB[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanB[$i][0] & '_s.ico') ; schwarzes Figuren-Icon laden

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

    ; <MG>
    $aChessmanW_source[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanW[$i][0] & '_w.ico') ; weisses Figuren-Icon laden
    $aChessmanB_source[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanB[$i][0] & '_s.ico') ; schwarzes Figuren-Icon laden
    ; </MG>
    Next

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

    ; <MG>
    If $SMALLSCREEN Then
    $hGui = GUICreate('Schachbrett', $iWidth + 60, $iHeight + 60)
    Else
    $hGui = GUICreate('Schachbrett', $iWidth + 60, $iHeight + 100)
    EndIf
    ; </MG>

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

    ;<CD>
    GUISetOnEvent($GUI_EVENT_CLOSE, '_EndGUI')
    ;</CD>
    GUISetBkColor($iGuiBkColor)
    GUICtrlSetDefColor($iTextColor) ; Standard-Textfarbe setzen
    GUISetFont(10, 400, 0, 'Verdana') ; Standard-Font setzen
    $hBrush1 = _GDIPlus_BrushCreateSolid($iFieldColor1) ; Pinsel für die dunklen Karos
    $hBrush2 = _GDIPlus_BrushCreateSolid($iFieldColor2) ; Pinsel für die hellen Karos
    Dim $aFieldColor[2] = [$hBrush1, $hBrush2], $hBrush, $iColor = True ; damit sie abwechselnd gezeichnet werden
    $hPen1 = _GDIPlus_PenCreate($iMarkFieldColor, 4) ; Stift für die Markierung der Felder
    $hPen2 = _GDIPlus_PenCreate($iFieldBkColor, 4) ; Stift für die normale Umrandung
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsClear($hBuffer, $iFieldBkColor)
    For $i = 0 To 7
    GUICtrlCreateLabel(8 - $i, 15, 64 + $i * 70, 20, 20) ; Zahlen links
    GUICtrlCreateLabel(8 - $i, 600, 64 + $i * 70, 20, 20) ; Zahlen rechts
    GUICtrlCreateLabel(Chr(97 + $i), 64 + $i * 70, 10, 20, 20) ; Buchstaben oben
    GUICtrlCreateLabel(Chr(97 + $i), 64 + $i * 70, 600, 20, 20) ; Buchstaben unten
    Next

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

    ; <MG>
    Global $CommandInput, $HelpButton
    If Not $SMALLSCREEN Then
    $CommandInput = GUICtrlCreateInput("", 10, $iHeight + 65, $iWidth - 70, 25)
    GUICtrlSetBkColor(-1, 0x008800)
    $HelpButton = GUICtrlCreateButton("Befehle...", $iWidth - 50, $iHeight + 65, 100, 25)
    GUICtrlSetOnEvent(-1, "__Chess_Befehle")
    GUICtrlSetBkColor(-1, 0x008800)
    GUICtrlSetFont(-1, 12, 500)
    EndIf

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

    Global $HumanTurn = False
    ; </MG>

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

    GUISetState()
    GUIRegisterMsg($WM_PAINT, '_WM_PAINT') ; WM_PAINT registrieren (neuzeichnen bei Fensterüberlagerung)

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

    _ResetField() ; Spielfeld leeren
    _NormalPosition() ; Figuren aufstellen (Grundstellung)

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

    $iSleep = 1000
    Sleep($iSleep)

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

    #cs
    Für $aChessmanW[Index][2] bzw. $aChessmanB[Index][2] ist Index =
    0 = a-Turm
    1 = b-Springer
    2 = c-Läufer
    3 = Dame
    4 = König
    5 = f-Läufer
    6 = g-Springer
    7 = h-Turm

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

    8 = a-Bauer
    9 = b-Bauer
    10 = c-Bauer
    11 = d-Bauer
    12 = e-Bauer
    13 = f-Bauer
    14 = g-Bauer
    15 = h-Bauer
    #ce

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

    _Chess_Initalize()

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

    While 1
    ; <MG>
    __Chess_HumanTurn()
    Sleep(100)
    __Chess_ComputerTurn()
    Sleep(100)
    ; </MG>
    WEnd

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

    Func _End()
    ;<CD>
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hCbReg)
    ;</CD>
    For $i = 0 To 15
    _GDIPlus_ImageDispose($aChessmanB[$i][2])
    _GDIPlus_ImageDispose($aChessmanW[$i][2])
    Next
    _GDIPlus_PenDispose($hPen1)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_BrushDispose($hBrush1)
    _GDIPlus_BrushDispose($hBrush2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    _Chess_Cleanup()
    EndFunc ;==>_End

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

    ;<CD>
    Func _EndGUI()
    If __Chess_MsgBox(1, "Schachprogramm beenden?", "Soll das Schachprogramm wirklich beendet werden?") = 1 Then Exit
    EndFunc
    ;</CD>

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

    Func _WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_PAINT

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

    Func _ResetField()
    For $i = 0 To 7
    For $j = 0 To 7
    _GDIPlus_GraphicsFillRect($hBuffer, 4 + $j * 70, 4 + $i * 70, 66, 66, $aFieldColor[$iColor]) ; Karomuster erstellen
    $iColor = Not $iColor ; abwechselnd
    Next
    $iColor = Not $iColor ; nach jeder Zeile Anfangsfarbe wechseln
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_ResetField

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

    Func _NormalPosition()
    For $i = 0 To 15
    ; <MG>
    $aChessmanW[$i][0] = $aChessmanW_source[$i][0]
    $aChessmanW[$i][1] = $aChessmanW_source[$i][1]
    $aChessmanW[$i][2] = $aChessmanW_source[$i][2]
    $aChessmanB[$i][0] = $aChessmanB_source[$i][0]
    $aChessmanB[$i][1] = $aChessmanB_source[$i][1]
    $aChessmanB[$i][2] = $aChessmanB_source[$i][2]
    ; </MG>

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

    _DrawChessman($aChessmanW[$i][2], $aChessmanW[$i][1], False) ; weisse Figur setzen
    _DrawChessman($aChessmanB[$i][2], $aChessmanB[$i][1], False) ; schwarze Figur setzen
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen

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

    ;<MG>
    For $y = 0 To 7
    For $x = 0 To 7
    If $y < 2 Then
    $gFeld[$x][$y][0] = "w"
    $gFeld[$x][$y][1] = $x + $y * 8
    ElseIf $y = 6 Then
    $gFeld[$x][$y][0] = "b"
    $gFeld[$x][$y][1] = $x + 8
    ElseIf $y = 7 Then
    $gFeld[$x][$y][0] = "b"
    $gFeld[$x][$y][1] = $x
    Else
    $gFeld[$x][$y][0] = 0
    $gFeld[$x][$y][1] = 16
    EndIf
    Next
    Next
    ;</MG>
    EndFunc ;==>_NormalPosition

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

    Func _ClearField($sCoordinates)
    Local $iX = Asc(StringLower(StringLeft($sCoordinates, 1))) - 97, $iY = 8 - StringRight($sCoordinates, 1)
    If Mod($iX, 2) Then
    If Mod($iY, 2) Then
    $hBrush = $hBrush2
    Else
    $hBrush = $hBrush1
    EndIf
    Else
    If Mod($iY, 2) Then
    $hBrush = $hBrush1
    Else
    $hBrush = $hBrush2
    EndIf
    EndIf
    $iX = 5 + $iX * 70
    $iY = 5 + $iY * 70
    _GDIPlus_GraphicsFillRect($hBuffer, $iX, $iY, 64, 64, $hBrush) ; Feld mit leerem Karo füllen
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_ClearField

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

    Func _DrawChessman($hChessman, $sCoordinates, $fPaint = False)
    Local $iX = Asc(StringLower(StringLeft($sCoordinates, 1))) - 97, $iY = 8 - StringRight($sCoordinates, 1)
    $iX = 5 + $iX * 70
    $iY = 5 + $iY * 70
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hChessman, $iX, $iY, 64, 64)
    If $fPaint Then _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_DrawChessman

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

    Func _MarkField($sCoordinates, $fMark = True)
    Local $aCoordinates = StringSplit(StringStripWS($sCoordinates, 8), ','), $iX, $iY
    For $i = 1 To $aCoordinates[0]
    $iX = 2 + (Asc(StringLower(StringLeft($aCoordinates[$i], 1))) - 97) * 70
    $iY = 2 + (8 - StringRight($aCoordinates[$i], 1)) * 70
    If $fMark Then
    _GDIPlus_GraphicsDrawRect($hBuffer, $iX, $iY, 70, 70, $hPen1)
    Else
    _GDIPlus_GraphicsDrawRect($hBuffer, $iX, $iY, 70, 70, $hPen2)
    EndIf
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_MarkField

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

    ; Funktionen, die von mir (MG) ergänzt wurden:
    Func _Chess_Set($Start, $End)
    Return __Chess_Set($Start, $End, False)
    EndFunc

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

    Func __Chess_Set($Start, $End, $Intern, $cleanup = True)
    If Not _Chess_Validate($Start, $End) Then
    ;<CD>
    If $Intern Then __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;</CD>
    Return False
    EndIf
    If $gWhosTurn == $gPlayerColor Then _Chess_HumanTurn($End)

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

    _MarkField($Start & "," & $End)
    If $gEnPassant Then _MarkField($gEnPassant)
    _ClearField($Start)
    _ClearField($End)
    If $gEnPassant Then _ClearField($gEnPassant)
    Local $who = __Chess_Wer_Auf_Feld($Start), $who2 = __Chess_Wer_Auf_Feld($End), $who3 = __Chess_Wer_Auf_Feld($gEnPassant)
    $gFeld[Asc(StringLower(StringTrimRight($Start, 1))) - 97][Int(StringTrimLeft($Start, 1)) - 1][0] = 0
    $gFeld[Asc(StringLower(StringTrimRight($Start, 1))) - 97][Int(StringTrimLeft($Start, 1)) - 1][1] = 16
    If $gEnPassant Then
    $gFeld[Asc(StringLower(StringTrimRight($gEnPassant, 1))) - 97][Int(StringTrimLeft($gEnPassant, 1)) - 1][0] = 0
    $gFeld[Asc(StringLower(StringTrimRight($gEnPassant, 1))) - 97][Int(StringTrimLeft($gEnPassant, 1)) - 1][1] = 16
    EndIf

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

    If $who[0] = "w" Then
    _DrawChessman($aChessmanW[$who[1]][2], $End, True)
    $aChessmanW[$who[1]][1] = $End
    If $who2[1] < UBound($aChessmanB) Then $aChessmanB[$who2[1]][1] = 0
    If $gEnPassant And $who3[1] < UBound($aChessmanB) Then $aChessmanB[$who3[1]][1] = 0
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][0] = "w"
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][1] = $who[1]
    Else
    _DrawChessman($aChessmanB[$who[1]][2], $End, True)
    $aChessmanB[$who[1]][1] = $End
    If $who2[1] < UBound($aChessmanW) Then $aChessmanW[$who2[1]][1] = 0
    If $gEnPassant And $who3[1] < UBound($aChessmanW) Then $aChessmanW[$who3[1]][1] = 0
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][0] = "b"
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][1] = $who[1]
    EndIf
    If $cleanup Then
    Sleep($iSleep)
    _MarkField($Start & "," & $End, False)
    If $gEnPassant Then _MarkField($gEnPassant, False)
    EndIf

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

    Local $wer = _Chess_Who($gWhosTurn, $who[1])
    If $gWhosTurn = "w" And StringTrimLeft($End, 1) = 8 And $wer = "B" Then ; NUR BAUERN!
    __Chess_Umwandlung("w", $End)
    ElseIf $gWhosTurn = "b" And StringTrimLeft($End, 1) = 1 And $wer = "B" Then ; NUR BAUERN!
    __Chess_Umwandlung("b", $End)
    EndIf

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

    If $gEnPassant Then $gEnPassant = 0
    Return True
    EndFunc

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

    Func __Chess_Umwandlung($Color, $Feld)
    Local $wish, $who = __Chess_Wer_Auf_Feld($Feld)
    While True
    If $gPlayerColor = $Color Then
    ;<CD>
    Local $wish = InputBox("µitLight Dezember '10 / Januar '11", "Welche Figur darf es sein?" & @CRLF & @CRLF & "D" & @TAB & "- Dame" & @TAB & @TAB & "L" & @TAB & "- Läufer" & @CRLF & "T" & @TAB & "- Turm" & @TAB & @TAB & "S" & @TAB & "- Springer", "D", " M1")
    If @error Then ContinueLoop
    $wish = StringUpper($wish)
    ;</CD>
    Else
    $wish = StringUpper(_Chess_Event_Umtausch($Feld))
    EndIf
    If $wish = "D" Or $wish = "T" Or $wish = "L" Or $wish = "S" Then ExitLoop
    WEnd
    Switch $Color
    Case "w"
    $aChessmanW[$who[1]][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $wish & '_w.ico')
    $aChessmanW[$who[1]][0] = $wish
    _DrawChessman($aChessmanW[$who[1]][2], $Feld, True)
    Case "b"
    $aChessmanB[$who[1]][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $wish & '_s.ico')
    $aChessmanB[$who[1]][0] = $wish
    _DrawChessman($aChessmanB[$who[1]][2], $Feld, True)
    EndSwitch
    EndFunc

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

    Func __Chess_Wer_Auf_Feld($Feld)
    Local $returner[2]
    For $i = 0 To 15
    If $aChessmanW[$i][1] == StringLower($Feld) Then
    $returner[0] = "w"
    $returner[1] = $i
    Return $returner
    EndIf

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

    If $aChessmanB[$i][1] == StringLower($Feld) Then
    $returner[0] = "b"
    $returner[1] = $i
    Return $returner
    EndIf
    Next
    $returner[0] = 0
    $returner[1] = 16
    Return $returner
    EndFunc

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

    Func __Chess_HumanTurn()
    $gWhosTurn = $gPlayerColor

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

    If Not $SMALLSCREEN Then
    ;<CD>
    ControlClick($hGui, "", $CommandInput)
    ;</CD>
    GUICtrlSetBkColor($CommandInput, 0x008800)
    EndIf

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

    $HumanTurn = True

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

    Local $value
    While $HumanTurn
    Sleep(100)
    If $SMALLSCREEN Then
    ;<CD>
    $value = InputBox("µitLight Dezember '10 / Januar '11", "Folgende Befehle stehen zur Verfügung:" _
    & @CRLF _
    & @CRLF & "set xy xy" & @TAB & "- Ziehe Figur von xy nach xy (Bsp: set e2 e4)" _
    & @CRLF & "restart w/b" & @TAB & "- Startet das Spiel neu mit menschlichem Spieler w = weiß oder b = schwarz" _
    & @CRLF & "rochade 0/1" & @TAB & "- Führt eine kleine (0) oder große (1) Rochade aus" _
    & @CRLF _
    & @CRLF & "Die KI kann mit der Esc-Taste unterbrochen werden!" _
    & @CRLF _
    & @CRLF & "Abbrechen beendet das Spiel!", "", "", 500, 250)
    If @error Then
    _EndGUI()
    ContinueLoop
    EndIf
    __Chess_Input($value)
    ;</CD>
    EndIf
    WEnd

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

    If Not $SMALLSCREEN Then
    GUICtrlSetBkColor($CommandInput, 0x880000)
    EndIf
    EndFunc

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

    Func __Chess_ComputerTurn()
    Switch $gPlayerColor
    Case "w"
    $gWhosTurn = "b"
    Case "b"
    $gWhosTurn = "w"
    EndSwitch
    ;<CD>
    $bEscAbortKI = True
    _Chess_ComputerTurn()
    $bEscAbortKI = False
    ;</CD>
    EndFunc

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

    Func __Chess_Befehle()
    ;<CD>
    __Chess_MsgBox(64, "µitLight Dezember '10 / Januar '11", "Folgende Befehle stehen zur Verfügung:" _
    & @CRLF _
    & @CRLF & "set xy xy" & @TAB & @TAB & "- Ziehe Figur von xy nach xy (Bsp: set e2 e4)" _
    & @CRLF & "restart w/b" & @TAB & "- Startet das Spiel neu mit menschlichem Spieler w = weiß oder b = schwarz" _
    & @CRLF & "rochade 0/1" & @TAB & "- Führt eine kleine (0) oder große (1) Rochade aus" _
    & @CRLF & "abort" & @TAB & @TAB & "- die KI unterbrechen" _
    & @CRLF _
    & @CRLF & "ENTER bestätigt die Eingabe im Feld!" _
    & @CRLF _
    & @CRLF & "Die KI kann ebenfalls mit der Esc-Taste unterbrochen werden!")
    ControlClick($hGui, "", $CommandInput)
    ;</CD>
    EndFunc

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

    Func __Chess_Input($inputbox = "")
    ;<CD>
    If Not $SMALLSCREEN Then AdlibUnRegister($sFunc2Call)
    ;</CD>
    If $HumanTurn Then
    Local $value
    If $SMALLSCREEN Then
    $value = $inputbox
    Else
    $value = GUICtrlRead($CommandInput)
    EndIf
    Local $array = StringSplit($value, " ")

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

    If $array[1] = "set" Then
    If $array[0] > 2 Then
    Local $who = __Chess_Wer_Auf_Feld($array[2])
    If $who[0] == $gPlayerColor Then
    If __Chess_Set($array[2], $array[3], True) Then $HumanTurn = False
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;</CD>
    EndIf
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Zu wenig Parameter!")
    ;</CD>
    EndIf
    ElseIf $array[1] = "restart" Then
    If $array[0] = 1 Then
    __Chess_Reset($gPlayerColor)
    Else
    __Chess_Reset($array[2])
    EndIf
    ElseIf $array[1] = "rochade" Then
    If $array[0] = 1 Then
    If __Chess_Rochade(0) Then $HumanTurn = False
    Else
    If __Chess_Rochade($array[2]) Then $HumanTurn = False
    EndIf
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Bitte einen gültigen Befehl angeben!")
    ;</CD>
    EndIf

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

    Else
    ;<CD>
    If GUICtrlRead($CommandInput) = "abort" Then _Chess_AbortKI()
    ;</CD>
    EndIf

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

    ;<CD>
    If Not $SMALLSCREEN Then GUICtrlSetData($CommandInput, "")
    ;</CD>
    EndFunc

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

    Func __Chess_Reset($color)
    _Chess_Cleanup()

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

    _ResetField()
    _NormalPosition()
    $value = StringUpper($color)

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

    If $value = "B" Then
    $gPlayerColor = "b"
    $HumanTurn = False
    Else
    $gPlayerColor = "w"
    ;<CD>
    $gWhosTurn = $gPlayerColor
    ;</CD>
    EndIf

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

    _Chess_Initalize()
    EndFunc

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

    Func _Chess_Rochade($big = False)
    If $big Then
    __Chess_Rochade(1)
    Else
    __Chess_Rochade(0)
    EndIf
    EndFunc

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

    Func __Chess_Rochade($big)
    If _Chess_Validate("", "", Int($big)) Then
    If $gWhosTurn = "w" Then
    Switch Int($big)
    Case 0
    __Chess_Set("e1", "g1", False, False)
    __Chess_Set("h1", "f1", False, False)
    Sleep($iSleep)
    _MarkField("e1,g1,h1,f1", False)
    Case 1
    __Chess_Set("e1", "c1", False, False)
    __Chess_Set("a1", "d1", False, False)
    Sleep($iSleep)
    _MarkField("e1,c1,a1,d1", False)
    EndSwitch
    ElseIf $gWhosTurn = "b" Then
    Switch Int($big)
    Case 0
    __Chess_Set("e8", "g8", False, False)
    __Chess_Set("h8", "f8", False, False)
    Sleep($iSleep)
    _MarkField("e8,g8,h8,f8", False)
    Case 1
    __Chess_Set("e8", "c8", False, False)
    __Chess_Set("a8", "d8", False, False)
    Sleep($iSleep)
    _MarkField("e8,c8,a8,d8", False)
    EndSwitch
    EndIf

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

    If $gPlayerColor = $gWhosTurn Then $HumanTurn = False
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;</CD>
    EndIf
    EndFunc

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

    Func _Chess_Won($Human = False)
    $text = "Spieler "
    If $Human Then
    $text &= "gewinnt!"
    Else
    $text &= "verliert!"
    EndIf
    ;<CD>
    __Chess_MsgBox(64, "µitLight Dezember '10 / Januar '11", $text)
    ;</CD>

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

    Local $value
    While 1
    ;<CD>
    $value = InputBox("µitLight Dezember '10 / Januar '11", "Welche Farbe? w = weiß, b = black", " M1")
    If @error Then
    _EndGUI()
    ContinueLoop
    EndIf
    $value = StringUpper($value)
    If $value = "W" Or $value = "B" Then ExitLoop
    ;</CD>
    WEnd
    __Chess_Reset($value)
    EndFunc

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

    Func _Chess_Who($Color, $Number)
    Switch $Color
    Case "w", "W"
    Return StringUpper($aChessmanW[$Number][0])
    Case "b", "B"
    Return StringUpper($aChessmanB[$Number][0])
    EndSwitch

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

    Return -1
    EndFunc

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

    ;<CD>
    Func __Check_Key($nCode, $wParam, $lParam)
    Local $vkCode = DllStructGetData(DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam), "vkCode")
    If $nCode < 0 _
    Or Not ($wParam = $WM_KEYDOWN) _
    Or Not BitAND(WinGetState($hGui), 8) _
    Or Not ( _
    ($bEscAbortKI And $vkCode = 27) Or (Not $SMALLSCREEN And ControlGetFocus($hGui) = $sCtrl2Effect And $vkCode = 13) _
    ) _
    Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $bEscAbortKI And $vkCode = 27 Then
    AdlibRegister("__Chess_AbortKI", 1)
    Else
    AdlibRegister($sFunc2Call, 1)
    EndIf
    Return -1
    EndFunc

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

    Func __Chess_MsgBox($flag, $title, $text, $timeout = 0, $hwnd = 0)
    If Not $hwnd Then $hwnd = $hGui
    Return MsgBox($flag, $title, $text, $timeout, $hwnd)
    EndFunc

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

    Func __Chess_AbortKI()
    AdlibUnRegister("__Chess_AbortKI")
    _Chess_AbortKI()
    EndFunc
    ;</CD>

    [/autoit]
  • So, die neue Version ist online. Sobald Cyberdyne die freigibt, startet der Wettbewerb offiziell ;)

    Gruß,
    Matthias

  • Wenn ich mit $SMALLSCREEN = True das Skript starte, dann kann ich (oder AutoBert) kein 'abort' eingeben um die KI zu beenden.


    An die Version $SmallScreen = True braucht ihr keine Arbeit investieren, da ich anscheinend der einzige bin, der nur auf dem NetBook skriptet. Ich passe mir die GUI in der Schach.au3 entsprechend an. Anstatt unten ist die Inpuntbox und der Hilfe-Button bei mir rechts,

    mfg autoBert

  • ...und täglich grüßt das Murmeltier der Bug! :P

    • Hab vergessen die Validierung in __Chess_Set während einer Rochade zu deaktivieren. Habs folgendermaßen gelöst:

      • msgbox von __Chess_Set nach _Chess_Input ausgelagert
        und Parameter $Intern in __Chess_Set gelöscht und alle __Chess_Set's dementsprechend angepasst.
      • Validierung findet jetzt in _Chess_Set statt, damit bei der Rochade mit der Funktion __Chess_Set keine Validierung mehr vorkommt.
        _Chess_Input wurde entsprechend angepasst: __Chess_Set -> _Chess_Set
      • _Chess_Set um einen optionalen Parameter erweitert: $valitdate = True
        Für die KI kann also weiterhin _Chess_Set($Start, $End) genutzt werden. Also alles beim Alten!
        Jedoch ist im Normallfall für die KI keine Validierung notwendig. Dies kann jetzt mittels _Chess_Set($Start, $End, False) abgeschaltet werden!
    • Hab _Chess_Rochade in gleicherweiße zu _Chess_Set angepasst:

      • msgbox von __Chess_Rochade nach _Chess_Input ausgelagert
      • Validierung findet jetzt in _Chess_Rochade statt.
        _Chess_Input wurde entsprechend angepasst: __Chess_Rochade -> _Chess_Rochade
      • _Chess_Rochade um einen optionalen Parameter erweitert: $valitdate = True
        Für die KI kann also weiterhin _Chess_Rochade($big) genutzt werden. Also alles beim Alten!
        Jedoch ist im Normallfall für die KI keine Validierung notwendig. Dies kann jetzt mittels _Chess_Rochade($big, False) abgeschaltet werden!
      • In der Funktion Rochade wurde _Chess_HumanTurn nicht aufgerufen!
        Da nun bei einer Rochade _Chess_HumanTurn
        ebenfalls aufgerufen wird, muss dies der Funktion auch mitgeteilt werden:
        _Chess_HumanTurn("", Int($big))

        Dazu muß aber _Chess_HumanTurn (Interfache.au3) um einen 2. Parameter erweitert werden.
        Func _Chess_HumanTurn($End, $Rochade = -1)
        2. Parameter in Anlehnung zu _Chess_Validate gewählt.


    • Da ein Spiel auch unentschieden enden kann, hab ich die
      Func _Chess_Won($Human = False)
      erweitert.

      Func _Chess_Won($Human = False, $Remis = False)

      Setzt man $Remie auf True, so wird der Wert von $Human einfach ignoriert.

    Wie zuvor auch, hier die Schach.au3

    Schach.au3
    [autoit]

    ;<CD>
    #include-once
    ;</CD>

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

    ; =========================================
    ; Vielen Dank an xXlowXx und Oscar!!
    ;
    ; Einen besonderen Dank auch an Cyberdyne!!
    ; =========================================

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

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

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

    Opt('GUIOnEventMode', 1)

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

    OnAutoItExitRegister("_End")

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

    ;<CD>
    Dim $hCbReg = DllCallbackRegister("__Check_Key", "long", "int;wparam;lparam")
    Dim $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hCbReg), _WinAPI_GetModuleHandle(0))
    Dim $bEscAbortKI = False
    If Not $SMALLSCREEN Then
    Dim $sCtrl2Effect = "Edit1" ; ClassNameNN des Inputs
    Dim $sFunc2Call = "__Chess_Input"
    EndIf
    ;</CD>

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

    _GDIPlus_Startup()

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

    $iWidth = 564 ; Schachbrettgrösse (X)
    $iHeight = 564 ; Schachbrettgrösse (Y)
    $iFieldColor1 = 0xFF446622 ; Farbe für dunkles Feld (ARGB)
    $iFieldColor2 = 0xFF889966 ; Farbe für helles Feld (ARGB)
    $iFieldBkColor = 0xFF112211 ; Umrandung der Felder (ARGB)
    $iMarkFieldColor = 0xFFFFFF22 ; Farbe zum markieren der Felder (ARGB)
    $iGuiBkColor = 0x225522 ; Gui-Hintergrundfarbe (RGB)
    $iTextColor = 0xFFFFFF ; Beschriftungsfarbe (RGB)

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

    Dim $aChessmanW[16][3] = [['T', 'a1', 0],['S', 'b1', 0],['L', 'c1', 0],['D', 'd1', 0],['K', 'e1', 0],['L', 'f1', 0],['S', 'g1', 0],['T', 'h1', 0],['B', 'a2', 0],['B', 'b2', 0],['B', 'c2', 0],['B', 'd2', 0],['B', 'e2', 0],['B', 'f2', 0],['B', 'g2', 0],['B', 'h2', 0]] ; weisse Figuren (Iconname, Koordinaten, hImage)
    ; MG:
    Dim $aChessmanW_source[16][3] = [['T', 'a1', 0],['S', 'b1', 0],['L', 'c1', 0],['D', 'd1', 0],['K', 'e1', 0],['L', 'f1', 0],['S', 'g1', 0],['T', 'h1', 0],['B', 'a2', 0],['B', 'b2', 0],['B', 'c2', 0],['B', 'd2', 0],['B', 'e2', 0],['B', 'f2', 0],['B', 'g2', 0],['B', 'h2', 0]] ; weisse Figuren (Iconname, Koordinaten, hImage)

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

    Dim $aChessmanB[16][3] = [['T', 'a8', 0],['S', 'b8', 0],['L', 'c8', 0],['D', 'd8', 0],['K', 'e8', 0],['L', 'f8', 0],['S', 'g8', 0],['T', 'h8', 0],['B', 'a7', 0],['B', 'b7', 0],['B', 'c7', 0],['B', 'd7', 0],['B', 'e7', 0],['B', 'f7', 0],['B', 'g7', 0],['B', 'h7', 0]] ; schwarze Figuren (Iconname, Koordinaten, hImage)
    ; MG:
    Dim $aChessmanB_source[16][3] = [['T', 'a8', 0],['S', 'b8', 0],['L', 'c8', 0],['D', 'd8', 0],['K', 'e8', 0],['L', 'f8', 0],['S', 'g8', 0],['T', 'h8', 0],['B', 'a7', 0],['B', 'b7', 0],['B', 'c7', 0],['B', 'd7', 0],['B', 'e7', 0],['B', 'f7', 0],['B', 'g7', 0],['B', 'h7', 0]] ; schwarze Figuren (Iconname, Koordinaten, hImage)

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

    For $i = 0 To 15
    $aChessmanW[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanW[$i][0] & '_w.ico') ; weisses Figuren-Icon laden
    $aChessmanB[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanB[$i][0] & '_s.ico') ; schwarzes Figuren-Icon laden

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

    ; <MG>
    $aChessmanW_source[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanW[$i][0] & '_w.ico') ; weisses Figuren-Icon laden
    $aChessmanB_source[$i][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $aChessmanB[$i][0] & '_s.ico') ; schwarzes Figuren-Icon laden
    ; </MG>
    Next

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

    ; <MG>
    If $SMALLSCREEN Then
    $hGui = GUICreate('Schachbrett', $iWidth + 60, $iHeight + 60)
    Else
    $hGui = GUICreate('Schachbrett', $iWidth + 60, $iHeight + 100)
    EndIf
    ; </MG>

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

    ;<CD>
    GUISetOnEvent($GUI_EVENT_CLOSE, '_EndGUI')
    ;</CD>
    GUISetBkColor($iGuiBkColor)
    GUICtrlSetDefColor($iTextColor) ; Standard-Textfarbe setzen
    GUISetFont(10, 400, 0, 'Verdana') ; Standard-Font setzen
    $hBrush1 = _GDIPlus_BrushCreateSolid($iFieldColor1) ; Pinsel für die dunklen Karos
    $hBrush2 = _GDIPlus_BrushCreateSolid($iFieldColor2) ; Pinsel für die hellen Karos
    Dim $aFieldColor[2] = [$hBrush1, $hBrush2], $hBrush, $iColor = True ; damit sie abwechselnd gezeichnet werden
    $hPen1 = _GDIPlus_PenCreate($iMarkFieldColor, 4) ; Stift für die Markierung der Felder
    $hPen2 = _GDIPlus_PenCreate($iFieldBkColor, 4) ; Stift für die normale Umrandung
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsClear($hBuffer, $iFieldBkColor)
    For $i = 0 To 7
    GUICtrlCreateLabel(8 - $i, 15, 64 + $i * 70, 20, 20) ; Zahlen links
    GUICtrlCreateLabel(8 - $i, 600, 64 + $i * 70, 20, 20) ; Zahlen rechts
    GUICtrlCreateLabel(Chr(97 + $i), 64 + $i * 70, 10, 20, 20) ; Buchstaben oben
    GUICtrlCreateLabel(Chr(97 + $i), 64 + $i * 70, 600, 20, 20) ; Buchstaben unten
    Next

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

    ; <MG>
    Global $CommandInput, $HelpButton
    If Not $SMALLSCREEN Then
    $CommandInput = GUICtrlCreateInput("", 10, $iHeight + 65, $iWidth - 70, 25)
    GUICtrlSetBkColor(-1, 0x008800)
    $HelpButton = GUICtrlCreateButton("Befehle...", $iWidth - 50, $iHeight + 65, 100, 25)
    GUICtrlSetOnEvent(-1, "__Chess_Befehle")
    GUICtrlSetBkColor(-1, 0x008800)
    GUICtrlSetFont(-1, 12, 500)
    EndIf

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

    Global $HumanTurn = False
    ; </MG>

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

    GUISetState()
    GUIRegisterMsg($WM_PAINT, '_WM_PAINT') ; WM_PAINT registrieren (neuzeichnen bei Fensterüberlagerung)

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

    _ResetField() ; Spielfeld leeren
    _NormalPosition() ; Figuren aufstellen (Grundstellung)

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

    $iSleep = 1000
    Sleep($iSleep)

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

    #cs
    Für $aChessmanW[Index][2] bzw. $aChessmanB[Index][2] ist Index =
    0 = a-Turm
    1 = b-Springer
    2 = c-Läufer
    3 = Dame
    4 = König
    5 = f-Läufer
    6 = g-Springer
    7 = h-Turm

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

    8 = a-Bauer
    9 = b-Bauer
    10 = c-Bauer
    11 = d-Bauer
    12 = e-Bauer
    13 = f-Bauer
    14 = g-Bauer
    15 = h-Bauer
    #ce

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

    _Chess_Initalize()

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

    While 1
    ; <MG>
    __Chess_HumanTurn()
    Sleep(100)
    __Chess_ComputerTurn()
    Sleep(100)
    ; </MG>
    WEnd

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

    Func _End()
    ;<CD>
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hCbReg)
    ;</CD>
    For $i = 0 To 15
    _GDIPlus_ImageDispose($aChessmanB[$i][2])
    _GDIPlus_ImageDispose($aChessmanW[$i][2])
    Next
    _GDIPlus_PenDispose($hPen1)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_BrushDispose($hBrush1)
    _GDIPlus_BrushDispose($hBrush2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    _Chess_Cleanup()
    EndFunc ;==>_End

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

    ;<CD>
    Func _EndGUI()
    If __Chess_MsgBox(1, "Schachprogramm beenden?", "Soll das Schachprogramm wirklich beendet werden?") = 1 Then Exit
    EndFunc
    ;</CD>

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

    Func _WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_PAINT

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

    Func _ResetField()
    For $i = 0 To 7
    For $j = 0 To 7
    _GDIPlus_GraphicsFillRect($hBuffer, 4 + $j * 70, 4 + $i * 70, 66, 66, $aFieldColor[$iColor]) ; Karomuster erstellen
    $iColor = Not $iColor ; abwechselnd
    Next
    $iColor = Not $iColor ; nach jeder Zeile Anfangsfarbe wechseln
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_ResetField

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

    Func _NormalPosition()
    For $i = 0 To 15
    ; <MG>
    $aChessmanW[$i][0] = $aChessmanW_source[$i][0]
    $aChessmanW[$i][1] = $aChessmanW_source[$i][1]
    $aChessmanW[$i][2] = $aChessmanW_source[$i][2]
    $aChessmanB[$i][0] = $aChessmanB_source[$i][0]
    $aChessmanB[$i][1] = $aChessmanB_source[$i][1]
    $aChessmanB[$i][2] = $aChessmanB_source[$i][2]
    ; </MG>

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

    _DrawChessman($aChessmanW[$i][2], $aChessmanW[$i][1], False) ; weisse Figur setzen
    _DrawChessman($aChessmanB[$i][2], $aChessmanB[$i][1], False) ; schwarze Figur setzen
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen

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

    ;<MG>
    For $y = 0 To 7
    For $x = 0 To 7
    If $y < 2 Then
    $gFeld[$x][$y][0] = "w"
    $gFeld[$x][$y][1] = $x + $y * 8
    ElseIf $y = 6 Then
    $gFeld[$x][$y][0] = "b"
    $gFeld[$x][$y][1] = $x + 8
    ElseIf $y = 7 Then
    $gFeld[$x][$y][0] = "b"
    $gFeld[$x][$y][1] = $x
    Else
    $gFeld[$x][$y][0] = 0
    $gFeld[$x][$y][1] = 16
    EndIf
    Next
    Next
    ;</MG>
    EndFunc ;==>_NormalPosition

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

    Func _ClearField($sCoordinates)
    Local $iX = Asc(StringLower(StringLeft($sCoordinates, 1))) - 97, $iY = 8 - StringRight($sCoordinates, 1)
    If Mod($iX, 2) Then
    If Mod($iY, 2) Then
    $hBrush = $hBrush2
    Else
    $hBrush = $hBrush1
    EndIf
    Else
    If Mod($iY, 2) Then
    $hBrush = $hBrush1
    Else
    $hBrush = $hBrush2
    EndIf
    EndIf
    $iX = 5 + $iX * 70
    $iY = 5 + $iY * 70
    _GDIPlus_GraphicsFillRect($hBuffer, $iX, $iY, 64, 64, $hBrush) ; Feld mit leerem Karo füllen
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_ClearField

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

    Func _DrawChessman($hChessman, $sCoordinates, $fPaint = False)
    Local $iX = Asc(StringLower(StringLeft($sCoordinates, 1))) - 97, $iY = 8 - StringRight($sCoordinates, 1)
    $iX = 5 + $iX * 70
    $iY = 5 + $iY * 70
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hChessman, $iX, $iY, 64, 64)
    If $fPaint Then _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_DrawChessman

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

    Func _MarkField($sCoordinates, $fMark = True)
    Local $aCoordinates = StringSplit(StringStripWS($sCoordinates, 8), ','), $iX, $iY
    For $i = 1 To $aCoordinates[0]
    $iX = 2 + (Asc(StringLower(StringLeft($aCoordinates[$i], 1))) - 97) * 70
    $iY = 2 + (8 - StringRight($aCoordinates[$i], 1)) * 70
    If $fMark Then
    _GDIPlus_GraphicsDrawRect($hBuffer, $iX, $iY, 70, 70, $hPen1)
    Else
    _GDIPlus_GraphicsDrawRect($hBuffer, $iX, $iY, 70, 70, $hPen2)
    EndIf
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 30, 30, $iWidth, $iHeight) ; Buffer anzeigen
    EndFunc ;==>_MarkField

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

    ; Funktionen, die von mir (MG) ergänzt wurden:
    ;<CD>
    Func _Chess_Set($Start, $End, $validate = True)
    If $validate And Not _Chess_Validate($Start, $End) Then Return False
    If $gWhosTurn == $gPlayerColor Then _Chess_HumanTurn($End)
    __Chess_Set($Start, $End)
    Return True
    EndFunc
    ;</CD>

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

    ;<CD>
    Func __Chess_Set($Start, $End, $cleanup = True)
    ;</CD>
    _MarkField($Start & "," & $End)
    If $gEnPassant Then _MarkField($gEnPassant)
    _ClearField($Start)
    _ClearField($End)
    If $gEnPassant Then _ClearField($gEnPassant)
    Local $who = __Chess_Wer_Auf_Feld($Start), $who2 = __Chess_Wer_Auf_Feld($End), $who3 = __Chess_Wer_Auf_Feld($gEnPassant)
    $gFeld[Asc(StringLower(StringTrimRight($Start, 1))) - 97][Int(StringTrimLeft($Start, 1)) - 1][0] = 0
    $gFeld[Asc(StringLower(StringTrimRight($Start, 1))) - 97][Int(StringTrimLeft($Start, 1)) - 1][1] = 16
    If $gEnPassant Then
    $gFeld[Asc(StringLower(StringTrimRight($gEnPassant, 1))) - 97][Int(StringTrimLeft($gEnPassant, 1)) - 1][0] = 0
    $gFeld[Asc(StringLower(StringTrimRight($gEnPassant, 1))) - 97][Int(StringTrimLeft($gEnPassant, 1)) - 1][1] = 16
    EndIf

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

    If $who[0] = "w" Then
    _DrawChessman($aChessmanW[$who[1]][2], $End, True)
    $aChessmanW[$who[1]][1] = $End
    If $who2[1] < UBound($aChessmanB) Then $aChessmanB[$who2[1]][1] = 0
    If $gEnPassant And $who3[1] < UBound($aChessmanB) Then $aChessmanB[$who3[1]][1] = 0
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][0] = "w"
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][1] = $who[1]
    Else
    _DrawChessman($aChessmanB[$who[1]][2], $End, True)
    $aChessmanB[$who[1]][1] = $End
    If $who2[1] < UBound($aChessmanW) Then $aChessmanW[$who2[1]][1] = 0
    If $gEnPassant And $who3[1] < UBound($aChessmanW) Then $aChessmanW[$who3[1]][1] = 0
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][0] = "b"
    $gFeld[Asc(StringLower(StringTrimRight($End, 1))) - 97][Int(StringTrimLeft($End, 1)) - 1][1] = $who[1]
    EndIf
    If $cleanup Then
    Sleep($iSleep)
    _MarkField($Start & "," & $End, False)
    If $gEnPassant Then _MarkField($gEnPassant, False)
    EndIf

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

    Local $wer = _Chess_Who($gWhosTurn, $who[1])
    If $gWhosTurn = "w" And StringTrimLeft($End, 1) = 8 And $wer = "B" Then ; NUR BAUERN!
    __Chess_Umwandlung("w", $End)
    ElseIf $gWhosTurn = "b" And StringTrimLeft($End, 1) = 1 And $wer = "B" Then ; NUR BAUERN!
    __Chess_Umwandlung("b", $End)
    EndIf

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

    If $gEnPassant Then $gEnPassant = 0
    EndFunc

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

    Func __Chess_Umwandlung($Color, $Feld)
    Local $wish, $who = __Chess_Wer_Auf_Feld($Feld)
    While True
    If $gPlayerColor = $Color Then
    ;<CD>
    Local $wish = InputBox("µitLight Dezember '10 / Januar '11", "Welche Figur darf es sein?" & @CRLF & @CRLF & "D" & @TAB & "- Dame" & @TAB & @TAB & "L" & @TAB & "- Läufer" & @CRLF & "T" & @TAB & "- Turm" & @TAB & @TAB & "S" & @TAB & "- Springer", "D", " M1")
    If @error Then ContinueLoop
    $wish = StringUpper($wish)
    ;</CD>
    Else
    $wish = StringUpper(_Chess_Event_Umtausch($Feld))
    EndIf
    If $wish = "D" Or $wish = "T" Or $wish = "L" Or $wish = "S" Then ExitLoop
    WEnd
    Switch $Color
    Case "w"
    $aChessmanW[$who[1]][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $wish & '_w.ico')
    $aChessmanW[$who[1]][0] = $wish
    _DrawChessman($aChessmanW[$who[1]][2], $Feld, True)
    Case "b"
    $aChessmanB[$who[1]][2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\source\' & $wish & '_s.ico')
    $aChessmanB[$who[1]][0] = $wish
    _DrawChessman($aChessmanB[$who[1]][2], $Feld, True)
    EndSwitch
    EndFunc

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

    Func __Chess_Wer_Auf_Feld($Feld)
    Local $returner[2]
    For $i = 0 To 15
    If $aChessmanW[$i][1] == StringLower($Feld) Then
    $returner[0] = "w"
    $returner[1] = $i
    Return $returner
    EndIf

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

    If $aChessmanB[$i][1] == StringLower($Feld) Then
    $returner[0] = "b"
    $returner[1] = $i
    Return $returner
    EndIf
    Next
    $returner[0] = 0
    $returner[1] = 16
    Return $returner
    EndFunc

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

    Func __Chess_HumanTurn()
    $gWhosTurn = $gPlayerColor

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

    If Not $SMALLSCREEN Then
    ;<CD>
    ControlClick($hGui, "", $CommandInput)
    ;</CD>
    GUICtrlSetBkColor($CommandInput, 0x008800)
    EndIf

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

    $HumanTurn = True

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

    Local $value
    While $HumanTurn
    Sleep(100)
    If $SMALLSCREEN Then
    ;<CD>
    $value = InputBox("µitLight Dezember '10 / Januar '11", "Folgende Befehle stehen zur Verfügung:" _
    & @CRLF _
    & @CRLF & "set xy xy" & @TAB & "- Ziehe Figur von xy nach xy (Bsp: set e2 e4)" _
    & @CRLF & "restart w/b" & @TAB & "- Startet das Spiel neu mit menschlichem Spieler w = weiß oder b = schwarz" _
    & @CRLF & "rochade 0/1" & @TAB & "- Führt eine kleine (0) oder große (1) Rochade aus" _
    & @CRLF _
    & @CRLF & "Die KI kann mit der Esc-Taste unterbrochen werden!" _
    & @CRLF _
    & @CRLF & "Abbrechen beendet das Spiel!", "", "", 500, 250)
    If @error Then
    _EndGUI()
    ContinueLoop
    EndIf
    __Chess_Input($value)
    ;</CD>
    EndIf
    WEnd

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

    If Not $SMALLSCREEN Then
    GUICtrlSetBkColor($CommandInput, 0x880000)
    EndIf
    EndFunc

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

    Func __Chess_ComputerTurn()
    Switch $gPlayerColor
    Case "w"
    $gWhosTurn = "b"
    Case "b"
    $gWhosTurn = "w"
    EndSwitch
    ;<CD>
    $bEscAbortKI = True
    _Chess_ComputerTurn()
    $bEscAbortKI = False
    ;</CD>
    EndFunc

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

    Func __Chess_Befehle()
    ;<CD>
    __Chess_MsgBox(64, "µitLight Dezember '10 / Januar '11", "Folgende Befehle stehen zur Verfügung:" _
    & @CRLF _
    & @CRLF & "set xy xy" & @TAB & @TAB & "- Ziehe Figur von xy nach xy (Bsp: set e2 e4)" _
    & @CRLF & "restart w/b" & @TAB & "- Startet das Spiel neu mit menschlichem Spieler w = weiß oder b = schwarz" _
    & @CRLF & "rochade 0/1" & @TAB & "- Führt eine kleine (0) oder große (1) Rochade aus" _
    & @CRLF & "abort" & @TAB & @TAB & "- die KI unterbrechen" _
    & @CRLF _
    & @CRLF & "ENTER bestätigt die Eingabe im Feld!" _
    & @CRLF _
    & @CRLF & "Die KI kann ebenfalls mit der Esc-Taste unterbrochen werden!")
    ControlClick($hGui, "", $CommandInput)
    ;</CD>
    EndFunc

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

    Func __Chess_Input($inputbox = "")
    ;<CD>
    If Not $SMALLSCREEN Then AdlibUnRegister($sFunc2Call)
    ;</CD>
    If $HumanTurn Then
    Local $value
    If $SMALLSCREEN Then
    $value = $inputbox
    Else
    $value = GUICtrlRead($CommandInput)
    EndIf
    Local $array = StringSplit($value, " ")

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

    If $array[1] = "set" Then
    If $array[0] > 2 Then
    Local $who = __Chess_Wer_Auf_Feld($array[2])
    If $who[0] == $gPlayerColor Then
    ;<CD>
    If _Chess_Set($array[2], $array[3]) Then
    $HumanTurn = False
    Else
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    EndIf
    ;</CD>
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    ;</CD>
    EndIf
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Zu wenig Parameter!")
    ;</CD>
    EndIf
    ElseIf $array[1] = "restart" Then
    If $array[0] = 1 Then
    __Chess_Reset($gPlayerColor)
    Else
    __Chess_Reset($array[2])
    EndIf
    ElseIf $array[1] = "rochade" Then
    If $array[0] = 1 Then
    ;<CD>
    If _Chess_Rochade(0) Then
    $HumanTurn = False
    Else
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    EndIf
    ;</CD>
    Else
    ;<CD>
    If _Chess_Rochade($array[2]) Then
    $HumanTurn = False
    Else
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Ungültiger Zug!")
    EndIf
    ;</CD>
    EndIf
    Else
    ;<CD>
    __Chess_MsgBox(16, "µitLight Dezember '10 / Januar '11", "Bitte einen gültigen Befehl angeben!")
    ;</CD>
    EndIf

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

    Else
    ;<CD>
    If GUICtrlRead($CommandInput) = "abort" Then _Chess_AbortKI()
    ;</CD>
    EndIf

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

    ;<CD>
    If Not $SMALLSCREEN Then GUICtrlSetData($CommandInput, "")
    ;</CD>
    EndFunc

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

    Func __Chess_Reset($color)
    _Chess_Cleanup()

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

    _ResetField()
    _NormalPosition()
    $value = StringUpper($color)

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

    If $value = "B" Then
    $gPlayerColor = "b"
    $HumanTurn = False
    Else
    $gPlayerColor = "w"
    ;<CD>
    $gWhosTurn = $gPlayerColor
    ;</CD>
    EndIf

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

    _Chess_Initalize()
    EndFunc

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

    ;<CD>
    Func _Chess_Rochade($big = False, $validate = True)
    If $validate And Not _Chess_Validate("", "", Int($big)) Then Return False
    If $gWhosTurn == $gPlayerColor Then _Chess_HumanTurn("", Int($big))
    __Chess_Rochade($big)
    Return True
    EndFunc
    ;</CD>

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

    Func __Chess_Rochade($big)
    If $gWhosTurn = "w" Then
    Switch Int($big)
    Case 0
    ;<CD>
    __Chess_Set("e1", "g1", False)
    __Chess_Set("h1", "f1", False)
    ;</CD>
    Sleep($iSleep)
    _MarkField("e1,g1,h1,f1", False)
    Case 1
    ;<CD>
    __Chess_Set("e1", "c1", False)
    __Chess_Set("a1", "d1", False)
    ;</CD>
    Sleep($iSleep)
    _MarkField("e1,c1,a1,d1", False)
    EndSwitch
    ElseIf $gWhosTurn = "b" Then
    Switch Int($big)
    Case 0
    ;<CD>
    __Chess_Set("e8", "g8", False)
    __Chess_Set("h8", "f8", False)
    ;</CD>
    Sleep($iSleep)
    _MarkField("e8,g8,h8,f8", False)
    Case 1
    ;<CD>
    __Chess_Set("e8", "c8", False)
    __Chess_Set("a8", "d8", False)
    ;</CD>
    Sleep($iSleep)
    _MarkField("e8,c8,a8,d8", False)
    EndSwitch
    EndIf
    EndFunc

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

    ;<CD>
    Func _Chess_Won($Human = False, $Remis = False)
    ;</CD>
    $text = "Spieler "
    If $Human Then
    $text &= "gewinnt!"
    Else
    $text &= "verliert!"
    EndIf
    ;<CD>
    If $Remis Then $text = "Remis!" & @CRLF & "Das Spiel endet unentschieden!"
    __Chess_MsgBox(64, "µitLight Dezember '10 / Januar '11", $text)
    ;</CD>

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

    Local $value
    While 1
    ;<CD>
    $value = InputBox("µitLight Dezember '10 / Januar '11", "Welche Farbe? w = weiß, b = black", " M1")
    If @error Then
    _EndGUI()
    ContinueLoop
    EndIf
    $value = StringUpper($value)
    If $value = "W" Or $value = "B" Then ExitLoop
    ;</CD>
    WEnd
    __Chess_Reset($value)
    EndFunc

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

    Func _Chess_Who($Color, $Number)
    Switch $Color
    Case "w", "W"
    Return StringUpper($aChessmanW[$Number][0])
    Case "b", "B"
    Return StringUpper($aChessmanB[$Number][0])
    EndSwitch

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

    Return -1
    EndFunc

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

    ;<CD>
    Func __Check_Key($nCode, $wParam, $lParam)
    Local $vkCode = DllStructGetData(DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam), "vkCode")
    If $nCode < 0 _
    Or Not ($wParam = $WM_KEYDOWN) _
    Or Not BitAND(WinGetState($hGui), 8) _
    Or Not ( _
    ($bEscAbortKI And $vkCode = 27) Or (Not $SMALLSCREEN And ControlGetFocus($hGui) = $sCtrl2Effect And $vkCode = 13) _
    ) _
    Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $bEscAbortKI And $vkCode = 27 Then
    AdlibRegister("__Chess_AbortKI", 1)
    Else
    AdlibRegister($sFunc2Call, 1)
    EndIf
    Return -1
    EndFunc

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

    Func __Chess_MsgBox($flag, $title, $text, $timeout = 0, $hwnd = 0)
    If Not $hwnd Then $hwnd = $hGui
    Return MsgBox($flag, $title, $text, $timeout, $hwnd)
    EndFunc

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

    Func __Chess_AbortKI()
    AdlibUnRegister("__Chess_AbortKI")
    _Chess_AbortKI()
    EndFunc
    ;</CD>

    [/autoit]
    Ausschnitt Interface.au3
    [autoit]

    Func _Chess_HumanTurn($End, $Rochade = -1)

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

    EndFunc

    [/autoit]

    Offene Fragen:

    Und zwar geht es um die Funktion
    _Chess_HumanTurn()


    Leider versteh ich nicht so ganz, was ich mit dieser Funktion anstellen soll!

    Zitat

    - Berechnen, ob eine Umwandlung stattfindet


    Passiert doch schon automatisch (bekomme Input-Box angezeigt, in der ich auswähle...) was soll ich da noch berechnen und wozu?


    Zitat

    - Beim Schlagen von Figuren ("Fressen"): Die Grafik wird automatisch angepasst und auch gFeld wird verändert


    Was genau soll beim schlagen von Figuren passieren? Bzw. was wird da noch erwartet?


    Zitat

    - Eigene Aufgaben (z.B. Schach berechnen)


    Schach berechnet eigentlich die KI selbst, wenn sie dran ist => muß ja ein gültiger Zug von ihr kommen.

    .
    .
    .
    Finde die Funktion _Chess_HumanTurn() eigentlich überflüssig! Sollte wirklich jemand diese Fuktion gebrauchen (was ich nicht glaube, lasse mich aber eines besseren belehren) so kann er/sie das auch innerhalb von _Chess_Validate (falls True) erledigen.


    Viel interessanter wär da die Funktion _Chess_TurnFinished()
    die beim Zug der KI (von mir aus, auch für beide Spieler) aufgerufen wird.
    Besonders wichtig ist dabei, dass das Schachbrett bereits aktualisiert ist und erst dann die Funktion aufgerufen wird!

    [autoit]

    ;Beispiel-Code: Ist in der Schach.au3 NICHT enthalten!
    Func _Chess_Set($Start, $End, $validate = True)
    If $validate And Not _Chess_Validate($Start, $End) Then Return False
    __Chess_Set($Start, $End)
    _Chess_TurnFinished($End) ; Funktion existiert (noch?) nicht!
    Return True
    EndFunc
    ;Beispiel-Code: Ist in der Schach.au3 NICHT enthalten!

    [/autoit]
    • So kann mich z.B. die KI Schach setzen
    • Das Schachbrett stellt es bereits dar
    • Die Funktion _Chess_TurnFinished() wird aufgerufen
    • Es erscheint die Nachricht der KI -> "Du bist im Schach"
  • Hallo Cyberdyne!

    Diesmal muss ich mal dazwischen steuern :P

    Remis ist meines Wissens nach nicht Pflicht. Auch halte ich es zu umständlich, dass Remisangebote vorausgesetzt werden. Deshalb war ich ursprünglich für ein Auslassen.

    Zur _Chess_Human_Turn(): Sie hat sich nun größtenteils überflüssig gemacht. Dennoch kann es sein, dass eine KI auf den Zug eines Spielers reagieren möchte. Die Funktion ist ja keine Pflicht und frisst nur ein paar Bytes...

    Dann verstehe ich deine Zeile 536

    [autoit]

    If $gWhosTurn == $gPlayerColor Then _Chess_HumanTurn("", Int($big))

    [/autoit]

    innerhalb der _Chess_Rochade() nicht. Wieso werden 2 Parameter übergeben?

    Die gewünschte Funktion ergänze ich!

    Gruß,
    Matthias

    Einmal editiert, zuletzt von MatthiasG. (18. Dezember 2010 um 16:47)

  • Hi MatthiasG.,

    Diesmal muss ich mal dazwischen steuern :P


    Aber gerne :D

    Remis ist meines Wissens nach nicht Pflicht.


    Ein Spieler kann Remis verlangen.
    http://de.wikipedia.org/wiki/Schach#Das_Remis

    Auch halte ich es zu umständlich, dass Remisangebote vorausgesetzt werden. Deshalb war ich ursprünglich für ein Auslassen.


    Ok 8)
    Wenns dem Spieler dann zu blöd wird (der KI machts ja nix aus), kann er/sie ja, "restart"en 8o

    Zur _Chess_Human_Turn(): [...] Die Funktion ist ja keine Pflicht und frisst nur ein paar Bytes...


    Schaden tut sie aufjedenfall nicht ^^

    Dann verstehe ich deine Zeile 536

    [autoit]

    If $gWhosTurn == $gPlayerColor Then _Chess_HumanTurn("", Int($big))

    [/autoit]

    innerhalb der _Chess_Rochade() nicht. Wieso werden 2 Parameter übergeben?


    Also, angenommen ich würde die _Chess_HumanTurn() Funktion brauchen... ( :P )
    [list]
    [*]So wie es jetzt ist (Ohne 2. Parameter) wird ja das End-Feld ($End) übergeben.
    [*]Wie sieht das jetzt aber bei der Rochade aus? Wie lautet da das End-Feld?
    [*]Also dachte ich mir, da ich ja eine Rochade spiele (Ein Spezial-Zug: 2 Figuren werden gleichzeitig bewegt) muß ich der _Chess_HumanTurn() das auch mitteilen, da bisher immer nur das End-Feld von 1 Figur übergeben wurde!
    [*]Ein 2. Parameter mußte her.
    [*]Ich hätte auch mit einem Parameter arbeiten und z.B. den String "Rochade0" bzw. "Rochade1" als End-Feld übergeben können. Und in _Chess_HumanTurn() danach abfragen lassen.
    Fand ich aber persönlich unschön ;)
    [*]Auch könnte man statt

    [autoit]

    _Chess_HumanTurn("", Int($big))

    [/autoit]


    diesen Aufruf verwenden

    [autoit]

    _Chess_HumanTurn($End1, $End2)

    [/autoit]


    Also beide End-Felder der Rochade Figurbewegung.
    Ka, mach es so wie es dir/euch besser gefällt.
    Wenns nach mir ginge würde sowieso _Chess_HumanTurn komplett rausfliegen, da ich nicht verstehe wozu ich sie brauche :rofl:

    Die gewünschte Funktion ergänze ich!


    Thx :thumbup:

  • Wieder was entdeckt... :whistling:

    In der

    [autoit]

    Func _Chess_Won($Human = False)

    [/autoit]


    muss in einer Zeile ein Parameter eingeschoben werden.

    Diese Zeile

    [autoit]

    $value = InputBox("µitLight Dezember '10 / Januar '11", "Welche Farbe? w = weiß, b = black", " M1")

    [/autoit]


    mit dieser hier ersetzen

    [autoit]

    $value = InputBox("µitLight Dezember '10 / Januar '11", "Welche Farbe? w = weiß, b = black", $gPlayerColor, " M1")

    [/autoit]
  • Hallo allerseits!

    Aufgrund der stressigen Weihnachtstage bin ich erst jetzt dazu gekommen, die Fehler zu berichtigen. Nun der letzte Bug-Melder-Aufruf, bevor der Wettbewerb startet. Cyberdyne, so langsam ist deine Zeit gekommen ;)

    Vielen Dank und bis dann!

  • Da anscheinend nichts offensichtliches mehr gegen das Skript einzuwenden ist - oder Cyberdyne sich frei genommen hat :rofl: - erkläre ich den Wettbewerb hiermit für eröffnet, wobei der Zeitraum zwei Wochen verlängert wird - da sich alles verzögert hat. Entschuldigung vielmals!

    Ich werde nun eine Woche abwesend sein, stehe danach aber wieder zur Verfügung. Sollten Fehler oder Wünsche noch auftauchen, werden diese so ergänzt, dass bereits angefangene Algorithmen nicht (oder nur minimal, wenn der Fehler gravierend ist) angepasst werden müssen.

    Es grüßt recht herzlich und wünscht viel Erfolg - im Namen der ganzen Jury,
    Matthias

  • MatthiasG. war schon fast eine Monat nichtmehr da, also behaupte ich mal es es kein Ergebniss mehr geben wird:

    "Letzte Aktivität

    Montag, 7. März 2011, 15:44
    "

    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.

  • Guten Tag allerseits!

    Bereits tot geglaubt, melde ich mich doch nochmal. Danke L3viathan!

    Leider läuft bei mir z.Z. alles etwas aus dem Ruder. Darüber hinaus habe ich mich persönlich von AutoIt abgewandt, da es nicht kompatibel zu meinem neuen Erst-Betriebssystem Linux Mint ist. Nun benutzte ich für fast alles Java.

    Ein Ergebnis wird es wirklich nicht mehr geben. Ich wüsste auch nicht für welche Einsendungen, mich haben keine erreicht. :D

    Der Wettbewerb selbst wird nicht im Sand verlaufen. Schnitzel und ich arbeiten gerade an einer Version 2.0, die etwas mehr Spielraum zulässt und etwas besser organisiert ist. Bis dahin... stay tuned! :D

    Beste Grüße aus dem Pott,
    Matthias

  • Guten Tag allerseits!
    Bereits tot geglaubt, melde ich mich doch nochmal. Danke L3viathan!

    naja, bereits tod gesagte leben länger.

    Guten Tag allerseits!
    Leider läuft bei mir z.Z. alles etwas aus dem Ruder. Darüber hinaus habe ich mich persönlich von AutoIt abgewandt, da es nicht kompatibel zu meinem neuen Erst-Betriebssystem Linux Mint ist. Nun benutzte ich für fast alles Java.

    Schade, dass du uns verlassen willst

    Ein Ergebnis wird es wirklich nicht mehr geben. Ich wüsste auch nicht für welche Einsendungen, mich haben keine erreicht. :D
    Matthias

    da hätte ich ja mit meinem Minimal-Ansatz ja sogar mal einen Wettbewerb geonnen, wenn ich denn eingereicht hätte.

    Guten Tag allerseits!
    Der Wettbewerb selbst wird nicht im Sand verlaufen. Schnitzel und ich arbeiten gerade an einer Version 2.0, die etwas mehr Spielraum zulässt und etwas besser organisiert ist. Bis dahin... stay tuned! :D

    Beste Grüße aus dem Pott,
    Matthias

    bin gespannt, obwohl ich bemerkt habe dass mein Gehirn ganz schön eingerostet ist

    mfg autoBert