Sudoku

  • Hallo Dustin,

    da ich die erste bin, die das ließt, Zeitverschiebung beantrag auf 17:00 Uhr.

    LG Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    Hallo!

    Ich habe jetzt mal die beiden Programmteile zusammengefügt!

    Spoiler anzeigen
    [autoit]

    ; ----------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.2.4.0
    ; Author: bernd670
    ; Idea: Alina
    ;
    ; Script Function:
    ; Sudoku & Leveleditor
    ;
    ; ----------------------------------------------------------------------------
    #Region Compiler directives section
    #Compiler_Prompt=y
    #Compiler_Res_Language=1031
    #Compiler_Icon =.\Images\Sudoku.ico
    #Compiler_Res_LegalCopyright=bernd670 and Friends
    #Compiler_Res_Description=AutoIt v3 Skript - Sudoku
    #Compiler_Res_Comment=Sudoku Spiel
    #Compiler_OutFile_Type=exe
    #Compiler_Compression=4 ;Compression parameter 0-4 0=Low 2=normal 4=High
    #Compiler_Allow_Decompile=n
    #Compiler_Res_Field=Entwickler|bernd670
    #Compiler_Res_Field=Release Datum|%date% %time%
    #Compiler_Res_Field=Programmgruppe|Spiele
    #Compiler_Res_Field=Original Dateiname|Sudoku.exe
    #Compiler_Res_Field=Version|1.0
    #Compiler_Run_Obfuscator=n
    #EndRegion

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

    #region Includes
    #include <GUIConstants.au3>
    #Include <GuiStatusBar.au3>
    #endregion

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

    #region AutoItSetOptions
    Opt("GUIOnEventMode", 1)
    #endregion

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

    #region Konstantendefinitionen
    Const $ciTop = 40
    Const $ciLeft = 20
    Const $cstrIniFile = @ScriptDir & "\Sudoku.ini"
    #endregion

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

    #region Variablendefinitionen
    #region Variablen für alle Modi
    Dim $arField[9][9] ; Speichert die ControlID's der Inputfelder
    Dim $arLevels ; Array für die Spielstufen
    Dim $arGames ; Array für die Spiele in den Spielstufen

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

    Global $bGameMode = True ; True = Spielmodus, False = Editormodus

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

    Local $arPartsWidth[2] = [ 55, -1 ]
    Local $arPartsText[2] = [ "Let's go!", "" ]
    #endregion

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

    #region Variablen für den Spielmodus ($bGameMode = True)
    Dim $arResult[3][9] ; Zur Berechnung der Ergebnisse [0][x] = Zeile, [1][x] = Spalte, [2][x] = Block

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

    Global $bUnraveled = False ; Rätsel gelöst
    Global $bStarted = False ; Rätsel begonnen
    Global $iStartTime ; Startzeit
    Global $iRunTime ; Spieldauer
    #endregion

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

    #region Variablen für den Editormodus ($bGameMode = False)
    Global $bLevelsChanged ; Ist True wenn sich an den Levels was geändert hat
    Global $bSheetSaveOK ; Ist True wenn das Blatt mit mehr als 21 Ziffern gefüllt ist
    Global $bSheetChanged ; Ist True wenn das Blatt verändert wurde
    Global $iGameIndex ; Speichert die aktuelle Spielnummer
    Global $strTempGame ; Zwischenspeicher für das aktuelle Spiel
    Global $strPreLevel ; Text der den Key in der INI-Section Levels vorangestellt ist
    #endregion
    #endregion

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

    #region GUI-Erstellung
    $FrmMain = GUICreate("Sudoku", 633, 454, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "FormMainClose")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "FormMainMinimize")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "FormMainMaximize")
    GUISetOnEvent($GUI_EVENT_RESTORE, "FormMainRestore")

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

    $ModeMenu = GUICtrlCreateMenu("&Modus")
    $ModeMenuItemGame = GUICtrlCreateMenuItem("&Spiel", $ModeMenu);,0,1)
    GUICtrlSetOnEvent(-1, "ModeChange")
    GUICtrlSetState(-1,$GUI_CHECKED)
    $ModeMenuItemEdit = GUICtrlCreateMenuItem("&Editor", $ModeMenu);,1,1)
    GUICtrlSetOnEvent(-1, "ModeChange")

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

    $PicLeft = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerLeft = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 113, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerRight = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 226, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicRight = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 339, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicTop = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop, 344, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerTop = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 5, $ciTop + 113, 334, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerBottom = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 5, $ciTop + 226, 334, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicBottom = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop + 339, 344, 5, BitOR($SS_NOTIFY, $WS_GROUP))

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

    For $iRow = 0 To 8
    $iTop = $ciTop + 8 + $iRow * 35 + Int($iRow / 3) * 8
    For $iColumn = 0 To 8
    $iLeft = $ciLeft + 8 + $iColumn * 35 + Int($iColumn / 3) * 8
    $arField[$iRow][$iColumn] = GUICtrlCreateInput("", $iLeft, $iTop, 32, 32, BitOR($ES_CENTER, $ES_NUMBER))
    GUICtrlSetOnEvent(-1, "FieldChange")
    GUICtrlSetLimit(-1, 1)
    GUICtrlSetFont(-1, 16, 400, 0, "Arial")
    Next
    Next

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

    #region Controls für alle Modi (immer sichtbar)
    $LblLevels = GUICtrlCreateLabel("Level:", $ciLeft + 360, $ciTop + 5, 50, $WS_GROUP)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    $CBLevels = GUICtrlCreateCombo("", $ciLeft + 420, $ciTop + 5, 120, 100, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetOnEvent(-1, "LevelChange")

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

    $LblGames = GUICtrlCreateLabel("Spiel:", $ciLeft + 360, $ciTop + 30, 50)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    $CBGames = GUICtrlCreateCombo("", $ciLeft + 420, $ciTop + 30, 120, 100, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetOnEvent(-1, "GameChange")
    #endregion

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

    #region Controls für den Spielmodus (sichtbar wenn $bGameMode = True)
    $ButRestart = GUICtrlCreateButton("Spiel &neustarten", $ciLeft + 360, $ciTop + 310, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButRestartClick")
    #endregion

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

    #region Controls für den Editormodus (sichtbar wenn $bGameMode = False)
    $ButChangeLevel = GUICtrlCreateButton("Levelbez. ä&ndern", $ciLeft + 360, $ciTop + 140, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButChangeLevelClick")
    GUICtrlSetState(-1, $GUI_HIDE)

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

    $ButNewLevel = GUICtrlCreateButton("Neuer &Level", $ciLeft + 360, $ciTop + 170, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButNewLevelClick")
    GUICtrlSetState(-1, $GUI_HIDE)

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

    $ButNewSheet = GUICtrlCreateButton("Neues &Blatt", $ciLeft + 360, $ciTop + 210, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButNewSheetClick")
    GUICtrlSetState(-1, $GUI_HIDE)

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

    $ButDelSheet = GUICtrlCreateButton("Blatt lösch&en", $ciLeft + 360, $ciTop + 240, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButDelSheetClick")
    GUICtrlSetState(-1, $GUI_HIDE)

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

    $ButSave = GUICtrlCreateButton("Blatt &speichern", $ciLeft + 360, $ciTop + 280, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButSaveClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    $ButUndo = GUICtrlCreateButton("Änderungen &verwerfen", $ciLeft + 360, $ciTop + 310, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButUndoClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetState(-1, $GUI_HIDE)
    #endregion

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

    $StatusBar = _GUICtrlStatusBarCreate ($FrmMain, $arPartsWidth, $arPartsText)
    #endregion
    GUISetState(@SW_SHOW)

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

    #region Initialisierung
    $arLevels = IniReadSection($cstrIniFile, "Levels")
    If @error Then ; Fehler beim lesen der INI-Datei
    $strPreLevel = "Level"
    Dim $arLevels[2][2]
    Dim $arGames[2][2]

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

    $arLevels[0][0] = 1
    $arLevels[1][0] = $strPreLevel & "1"
    $arLevels[1][1] = "Level 1"
    GUICtrlSetData($CBLevels, "Level 1", "Level 1")

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

    $arGames[0][0] = 1
    $arGames[1][0] = "001"
    $arGames[1][1] = StringFormat("%081s", "0")
    GUICtrlSetData($CBGames, "001", "001")

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

    IniWriteSection($cstrIniFile, "Levels", $arLevels)
    IniWriteSection($cstrIniFile, $arLevels[1][0], $arGames)

    $bGameMode = SetStates(False) ; in Editormodus schalten
    GameChange()
    $bLevelsChanged = True
    $bSheetChanged = False
    $bSheetSaveOK = False
    Else
    $strPreLevel = StringRegExp($arLevels[1][0],"(.*)\d+",1)
    $strPreLevel = $strPreLevel[0]
    If $arLevels[0][0] > 1 Then
    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0]
    $strLevels &= $arLevels[$iIndex][1] & "|"
    Next
    $strLevels = StringTrimRight($strLevels, 1)
    GUICtrlSetData($CBLevels, $strLevels, StringLeft($strLevels, StringInStr($strLevels, "|") - 1))
    Else
    GUICtrlSetData($CBLevels, $arLevels[1][1], $arLevels[1][1])
    EndIf
    LevelChange()
    EndIf
    #endregion

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

    #region Hauptschleife
    While 1
    if $bGameMode = True Then ; im Spielmodus
    If $bUnraveled = True Then
    If MsgBox(262148, "", "Sudoku wurde gelöst!" & @CRLF & "Glückwunsch!" & @CRLF & @CRLF & "Weiterspielen ?") = 7 Then ExitLoop
    $bUnraveled = False
    EndIf

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

    If $bStarted = True Then
    GUICtrlSetState($ModeMenu,$GUI_DISABLE) ; Während des Spieles Modus-Menü deaktivieren
    If $iStartTime = 0 Then $iStartTime = TimerInit()
    If $iRunTime <> Int(TimerDiff($iStartTime) / 1000) Then
    $iRunTime = Int(TimerDiff($iStartTime) / 1000)
    _GUICtrlStatusBarSetText($StatusBar,StringFormat("%02i:%02i:%02i",Int($iRunTime/3600),Int(Mod($iRunTime,3600)/60),Mod($iRunTime,60)),0)
    EndIf

    If BitAND(GUICtrlGetState($ButRestart), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButRestart, $GUI_ENABLE)
    Else
    GUICtrlSetState($ModeMenu,$GUI_ENABLE)
    _GUICtrlStatusBarSetText($StatusBar,"Let's go!",0)
    If BitAND(GUICtrlGetState($ButRestart), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButRestart, $GUI_DISABLE)
    EndIf
    Else ; im Editormodus
    If Not $bSheetChanged Then
    If BitAND(GUICtrlGetState($ButNewLevel), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButNewLevel, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($ButUndo), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButUndo, $GUI_DISABLE)
    Else
    If BitAND(GUICtrlGetState($ButNewLevel), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButNewLevel, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($ButUndo), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButUndo, $GUI_ENABLE)
    EndIf

    If StringChrCount($strTempGame,"0") = 81 Then
    If BitAND(GUICtrlGetState($ButNewSheet), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButNewSheet, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($CBLevels), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($CBLevels, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($CBGames), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($CBGames, $GUI_DISABLE)
    Else
    If BitAND(GUICtrlGetState($CBLevels), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($CBLevels, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($CBGames), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($CBGames, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($ButNewSheet), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButNewSheet, $GUI_ENABLE)
    EndIf

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

    If $bSheetChanged And $bSheetSaveOK Then
    If BitAND(GUICtrlGetState($ButSave), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButSave, $GUI_ENABLE)
    Else
    If BitAND(GUICtrlGetState($ButSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButSave, $GUI_DISABLE)
    EndIf
    EndIf

    $CGF = ControlGetFocus($FrmMain)
    If StringLeft($CGF,4) = "Edit" Then
    If _IsPressed("25") Then ; Cursor Links
    If Int(StringMid($CGF,5)) = 1 Then
    GUICtrlSetState($arField[8][8],$GUI_FOCUS)
    Else
    ControlSend($FrmMain, "", "", "+{TAB}")
    EndIf
    EndIf
    If _IsPressed("26") Then ; Cursor hoch
    Switch Int(StringMid($CGF,5))
    Case 1
    GUICtrlSetState($arField[8][8],$GUI_FOCUS)
    Case 2 To 9
    GUICtrlSetState($arField[8][Int(StringMid($CGF,5))-2],$GUI_FOCUS)
    Case Else
    GUICtrlSetState($arField[Int((StringMid($CGF,5)-10)/9)][Int(Mod(StringMid($CGF,5)-10,9))],$GUI_FOCUS)
    EndSwitch
    EndIf
    If _IsPressed("27") Then ; Cursor rechts
    If Int(StringMid($CGF,5)) = 81 Then
    GUICtrlSetState($arField[0][0],$GUI_FOCUS)
    Else
    ControlSend($FrmMain, "", "", "{TAB}")
    EndIf
    EndIf
    If _IsPressed("28") Then ; Cursor runter
    If Int(StringMid($CGF,5)) >= 73 Then
    GUICtrlSetState($arField[0][Int(Mod(StringMid($CGF,5)+9,9))],$GUI_FOCUS)
    Else
    GUICtrlSetState($arField[Int((StringMid($CGF,5)+8)/9)][Int(Mod(StringMid($CGF,5)+8,9))],$GUI_FOCUS)
    EndIf
    EndIf
    EndIf

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

    Sleep(80)
    WEnd
    #endregion

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

    #region Funktionen
    Func FormMainClose()
    if $bGameMode = False Then ; im Editormodus
    If $bSheetChanged Then
    $iAnswer = MsgBox(262436, "Beenden", "Wenn Sie jetzt beenden gehen" & @CRLF &"alle Änderungen verloren!" & @CRLF & @CRLF & "Soll wirklich beendet werden?")
    If $iAnswer = 7 Then Return
    EndIf
    EndIf
    Exit
    EndFunc ;==>FormMainClose

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

    Func FormMainMaximize()
    EndFunc ;==>FormMainMaximize

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

    Func FormMainMinimize()
    EndFunc ;==>FormMainMinimize

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

    Func FormMainRestore()
    EndFunc ;==>FormMainRestore

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

    #region Funktionen für alle Modi
    ; ModeChange -> wechsel zwischen Spiel und Editor
    Func ModeChange()
    Switch @GUI_CtrlId
    Case $ModeMenuItemGame ; In Spielmodus schalten
    If $bGameMode = False Then
    If $bLevelsChanged Or $bSheetChanged Then
    $iAnswer = MsgBox(262436, "Moduswechsel", "Wenn Sie jetzt in den Spielmodus schalten" & @CRLF &"gehen alle Änderungen verloren!" & @CRLF & @CRLF & "Wollen Sie wirklich umschalten?")
    If $iAnswer = 7 Then Return
    EndIf
    SetStates(True) ; Initialisierung für Spielmodus
    LevelChange()
    EndIf

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

    Case $ModeMenuItemEdit ; In Editormodus schalten
    If $bGameMode = True Then
    SetStates(False) ; Initialisierung für Editmodus
    LevelChange()
    EndIf
    EndSwitch
    EndFunc

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

    ; Initialisierung je nach Modus
    Func SetStates($bMode)
    If $bMode Then ; Spielmodus
    ConsoleWrite("Set Gamemode" & @CRLF)
    WinSetTitle($FrmMain,"","Sudoku")
    GUICtrlSetState($ModeMenuItemGame,$GUI_CHECKED)
    GUICtrlSetState($ModeMenuItemEdit,$GUI_UNCHECKED)
    GUICtrlSetState($ButRestart, $GUI_SHOW)
    GUICtrlSetState($ButChangeLevel, $GUI_HIDE)
    GUICtrlSetState($ButNewLevel, $GUI_HIDE)
    GUICtrlSetState($ButNewSheet, $GUI_HIDE)
    GUICtrlSetState($ButSave, $GUI_HIDE)
    GUICtrlSetState($ButUndo, $GUI_HIDE)
    $bGameMode = True
    $bUnraveled = False
    $bStarted = False
    Else ; Editormodus
    ConsoleWrite("Set Editmode" & @CRLF)
    WinSetTitle($FrmMain,"","Sudoku - Level Editor")
    GUICtrlSetState($ModeMenuItemGame,$GUI_UNCHECKED)
    GUICtrlSetState($ModeMenuItemEdit,$GUI_CHECKED)
    GUICtrlSetState($ButRestart, $GUI_HIDE)
    GUICtrlSetState($ButChangeLevel, $GUI_SHOW)
    GUICtrlSetState($ButNewLevel, $GUI_SHOW)
    GUICtrlSetState($ButNewSheet, $GUI_SHOW)
    GUICtrlSetState($ButSave, $GUI_SHOW)
    GUICtrlSetState($ButUndo, $GUI_SHOW)
    $bGameMode = False
    $bLevelsChanged = False
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndIf

    Return $bMode
    EndFunc

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

    ; FieldChange -> eines der Inputfelder wurde geändert
    Func FieldChange()
    if $bGameMode = True Then ; im Spielmodus
    For $iRow = 0 To 8
    $arResult[0][$iRow] = 0
    For $iColumn = 0 To 8
    If $iRow = 0 Then
    $arResult[1][$iColumn] = 0
    $arResult[2][$iColumn] = 0
    EndIf
    $iValue = Int(GUICtrlRead($arField[$iRow][$iColumn]))
    $arResult[0][$iRow] += $iValue ; Zeilenergebnis
    $arResult[1][$iColumn] += $iValue ; Spaltenergebnis
    $arResult[2][Int($iRow / 3) * 3 + Int($iColumn / 3) ] += $iValue ; Blockergebnis
    Next
    Next
    $bUnraveled = True
    For $iIndex = 0 To 8
    If $arResult[0][$iIndex] <> 45 Or $arResult[1][$iIndex] <> 45 Or $arResult[2][$iIndex] <> 45 Then
    $bUnraveled = False
    ExitLoop
    EndIf
    Next
    $bStarted = True
    Else ; im Editormodus
    $iCounter = 0
    $arGames[$iGameIndex][1] = ""
    For $iRow = 0 To 8
    For $iColumn = 0 To 8
    $iValue = Int(GUICtrlRead($arField[$iRow][$iColumn]))
    If $iValue > 0 Then
    $iCounter += 1
    $arGames[$iGameIndex][1] &= String($iValue)
    Else
    $arGames[$iGameIndex][1] &= "0"
    EndIf
    Next
    Next

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

    $bSheetSaveOK = False
    If $iCounter > 13 Then $bSheetSaveOK = True

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

    $bSheetChanged = True
    _GUICtrlStatusBarSetText($StatusBar,$iCounter & " Ziffern")
    EndIf
    EndFunc ;==>FieldChange

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

    ; LevelChange -> Schwierigkeitsstufe wurde geändert
    Func LevelChange()
    $strLevel = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $strLevel Then ExitLoop
    Next
    $arGames = IniReadSection($cstrIniFile, $arLevels[$iIndex][0])
    If @error Then
    MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
    Exit
    EndIf
    Switch $arGames[0][0]
    Case 0
    MsgBox(4096, "", "Für diesen Level existieren keine Spiele")
    Return
    Case 1
    GUICtrlSetData($CBGames, "|" & $arGames[1][0], $arGames[1][0])
    If StringChrCount($arGames[1][1],"0") = 81 Then SetStates(False)
    Case Else
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0]
    $strGames &= $arGames[$iIndex][0] & "|"
    Next
    $strGames = StringTrimRight($strGames, 1)
    GUICtrlSetData($CBGames, "|" & $strGames, StringLeft($strGames, StringInStr($strGames, "|") - 1))
    EndSwitch
    GameChange()
    EndFunc ;==>LevelChange

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

    ; GameChange -> Neues Spiel wurde gewählt
    Func GameChange()
    $strGame = GUICtrlRead($CBGames)
    For $iIndex = 1 To $arGames[0][0]
    If $arGames[$iIndex][0] == $strGame Then ExitLoop
    Next

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

    For $iRow = 8 To 0 Step - 1
    For $iColumn = 8 To 0 Step - 1
    $iValue = StringMid($arGames[$iIndex][1], $iRow * 9 + $iColumn + 1, 1)
    If $iValue <> 0 Then
    GUICtrlSetData($arField[$iRow][$iColumn], $iValue)
    if $bGameMode = True Then ; im Spielmodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER, $ES_READONLY))
    Else ; im Editormodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Else
    GUICtrlSetData($arField[$iRow][$iColumn], "")
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Next
    Next

    if $bGameMode = True Then ; im Spielmodus
    $bStarted = False
    $iStartTime = 0
    Else ; im Editormodus
    $strTempGame = $arGames[$iIndex][1]
    $iGameIndex = $iIndex
    _GUICtrlStatusBarSetText($StatusBar,81 - StringChrCount($strTempGame,"0") & " Ziffern")
    EndIf
    EndFunc ;==>GameChange
    #endregion

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

    #region Funktionen für den Spielmodus ($bGameMode = True)
    Func ButRestartClick()
    GameChange()
    EndFunc ;==>ButRestartClick
    #endregion

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

    #region Funktionen für den Editormodus ($bGameMode = False)
    ; Button "Levelbez. ändern" wurde betätigt
    Func ButChangeLevelClick()
    $StrOldName = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $StrOldName Then ExitLoop
    Next

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

    $strNewName = InputBox("Levelbezeichnung ändern", "Bitte neue Levelbezeichnung eingeben!" & @CRLF & @CRLF & _
    "Die derzeitige Bezeichnung ist: " & $StrOldName)
    If $strNewName <> $StrOldName And StringLen($strNewName) Then
    $arLevels[$iIndex][1] = $strNewName
    $bLevelsChanged = True

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

    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0]
    $strLevels &= $arLevels[$iIndex][1] & "|"
    Next
    $strLevels = StringTrimRight($strLevels, 1)

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

    GUICtrlSetData($CBLevels, $strLevels, $strNewName)
    EndIf
    EndFunc ;==>ButChangeLevelClick

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

    ; Button "Neuer Level" wurde betätigt
    Func ButNewLevelClick()
    $strNewName = InputBox("Level hinzufügen", "Bitte Bezeichnung für den neuen Level eingeben!")

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

    If StringLen($strNewName) Then
    ReDim $arLevels[$arLevels[0][0] + 2][2]
    $arLevels[0][0] += 1

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

    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0] - 1
    $strLevels &= $arLevels[$iIndex][1] & "|"
    If Int(StringMid($arLevels[$iIndex][0], 6)) >= Int($arLevels[$arLevels[0][0]][0]) Then
    $arLevels[$arLevels[0][0]][0] = Int(StringMid($arLevels[$iIndex][0], 6)) + 1
    EndIf
    Next
    $arLevels[$arLevels[0][0]][0] = $strPreLevel & $arLevels[$arLevels[0][0]][0]
    $arLevels[$arLevels[0][0]][1] = $strNewName
    $strLevels &= $strNewName

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

    GUICtrlSetData($CBLevels, $strLevels, $strNewName)

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

    ReDim $arGames[2][2]

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

    $arGames[0][0] = 1
    $arGames[1][0] = "001"
    $arGames[1][1] = StringFormat("%081s", "0")
    GUICtrlSetData($CBGames, "001", "001")
    GameChange()
    $bLevelsChanged = True
    $bSheetChanged = True
    $bSheetSaveOK = False
    EndIf

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

    EndFunc ;==>ButNewLevelClick

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

    ; Button "Neues Blatt" wurde betätigt
    Func ButNewSheetClick()
    ReDim $arGames[$arGames[0][0] + 2][2]
    $arGames[0][0] += 1
    $arGames[$arGames[0][0]][1] = StringFormat("%081s", "0")

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

    Switch $arGames[0][0]
    Case 0
    MsgBox(4096, "", "Für diesen Level existieren keine Spiele!")
    Return

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

    Case 1
    GUICtrlSetData($CBGames, "|" & $arGames[1][0], $arGames[1][0])

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

    Case Else
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0] - 1
    $strGames &= $arGames[$iIndex][0] & "|"
    If Int($arGames[$iIndex][0]) >= Int($arGames[$arGames[0][0]][0]) Then
    $arGames[$arGames[0][0]][0] = StringFormat("%03i", Int($arGames[$iIndex][0]) + 1)
    EndIf
    Next
    $strGames &= $arGames[$arGames[0][0]][0]

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

    GUICtrlSetData($CBGames, "|" & $strGames, $arGames[$arGames[0][0]][0])
    EndSwitch

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

    GameChange()
    $bSheetSaveOK = False
    EndFunc ;==>ButNewSheetClick

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

    ; Button "Blatt löschen" wurde betätigt
    Func ButDelSheetClick()
    If MsgBox(262436, "Blatt löschen", "Soll das Blatt wirklich gelöscht werden?") = 6 Then
    $iCounter = 1
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0]
    If $iIndex = $iGameIndex Then ContinueLoop
    $arGames[$iCounter][0] = StringFormat("%03i",$iCounter)
    $arGames[$iCounter][1] = $arGames[$iIndex][1]
    $strGames &= $arGames[$iCounter][0] & "|"
    $iCounter += 1
    Next

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

    $strGames = StringTrimRight($strGames, 1)
    GUICtrlSetData($CBGames, "|" & $strGames, StringLeft($strGames, StringInStr($strGames, "|") - 1))

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

    $arGames[0][0] -= 1
    ReDim $arGames[$arGames[0][0]+1][2]
    ButSaveClick()
    EndIf
    EndFunc

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

    ; Button "Blatt speichern" wurde betätigt
    Func ButSaveClick()
    If $bLevelsChanged Then
    IniWriteSection($cstrIniFile, "Levels", $arLevels)

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

    If @error Then
    MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
    Exit
    EndIf
    $bLevelsChanged = False
    EndIf

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

    $strLevel = GUICtrlRead($CBLevels)

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

    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $strLevel Then ExitLoop
    Next

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

    IniWriteSection($cstrIniFile, $arLevels[$iIndex][0], $arGames)

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

    If @error Then
    MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
    Exit
    EndIf

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

    GameChange()
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndFunc ;==>ButSaveClick

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

    ; Button "Änderungen verwerfen" wurde betätigt
    Func ButUndoClick()
    $arGames[$iGameIndex][1] = $strTempGame
    GameChange()
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndFunc ;==>ButUndoClick

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

    ; Anzahl eines Zeichens im String zählen
    Func StringChrCount($String, $char)
    StringReplace($String,$char,$char)
    Return @extended
    EndFunc
    #endregion
    #endregion

    [/autoit]

    Edit: Dateianhang entfernt -> veraltet

  • Hallo Bernd670.

    Da kann ich nur eines zu sagen: BESTE LEISTUNG !!!

    LG Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo Huggy.

    Also ich bin ja gerade dabei so ab und an mal 10-20 Levels zu erstellen, nur bin ich jetzt bei den ganz schweren und die sind auch nicht gerade leicht zu erstellen. Sobalkd ich ausreichend habe, werde ich die INI-Datei hier posten.
    Aber dank bernd kann man jetzt ja auch die Spiele eingeben, die man in Zeitungen zum Beispiel findet.

    LG Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    Hallo,

    ich habe jetzt in C++ eine DLL geschrieben mit der man Spiele generieren und automatisch lösen kann. Der Algorithmus ist eine Idee von Moritz Lenz.

    Alle benötigten Dateien sind in der ZIP im Anhang! (s. Beitrag 49)

    Spoiler anzeigen
    [autoit]

    ; ----------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.2.4.0
    ; Author: bernd670
    ; Idea: Alina
    ;
    ; Script Function:
    ; Sudoku & Leveleditor
    ;
    ; ----------------------------------------------------------------------------
    #Region Compiler directives section
    #Compiler_Prompt=y
    #Compiler_Res_Language=1031
    #Compiler_Icon =.\Images\Sudoku.ico
    #Compiler_Res_LegalCopyright=bernd670 and Friends
    #Compiler_Res_Description=AutoIt v3 Skript - Sudoku
    #Compiler_Res_Comment=Sudoku Spiel
    #Compiler_OutFile_Type=exe
    #Compiler_Compression=4 ;Compression parameter 0-4 0=Low 2=normal 4=High
    #Compiler_Allow_Decompile=n
    #Compiler_Res_Field=Entwickler|bernd670
    #Compiler_Res_Field=Release Datum|%date% %time%
    #Compiler_Res_Field=Programmgruppe|Spiele
    #Compiler_Res_Field=Original Dateiname|Sudoku.exe
    #Compiler_Res_Field=Version|1.0
    #Compiler_Run_Obfuscator=n
    #endregion ; ==> Compiler directives section

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

    #region FileInstall
    If Not FileExists(@ScriptDir & "\Images") Then DirCreate(@ScriptDir & "\Images")
    FileInstall(".\Sudoku.dll", @ScriptDir & "\Sudoku.dll", 0)
    FileInstall(".\Images\Black.jpg", @ScriptDir & "\Images\Black.jpg",0)
    FileInstall(".\Images\Sudoku.ico", @ScriptDir & "\Images\Sudoku.ico",0)
    #endregion ; ==> FileInstall

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

    #region Includes
    #include <GUIConstants.au3>
    #Include <GuiStatusBar.au3>
    #endregion ; ==> Includes

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

    #region AutoItSetOptions
    Opt("GUIOnEventMode", 1)
    #endregion ; ==> AutoItSetOptions

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

    #region Konstantendefinitionen
    Const $ciTop = 40
    Const $ciLeft = 20
    Const $cstrIniFile = @ScriptDir & "\Sudoku.ini"
    #endregion ; ==> Konstantendefinitionen

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

    #region Variablendefinitionen

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

    #region Variablen für alle Modi
    Dim $arField[9][9] ; Speichert die ControlID's der Inputfelder
    Dim $arLevels ; Array für die Spielstufen
    Dim $arGames ; Array für die Spiele in den Spielstufen
    Global $bGameMode = True ; True = Spielmodus, False = Editormodus
    Local $arPartsWidth[2] = [ 55, -1 ]
    Local $arPartsText[2] = [ "Let's go!", "" ]
    #endregion ; ==> Variablen für alle Modi

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

    #region Variablen für den Spielmodus ($bGameMode = True)
    Dim $arResult[3][9] ; Zur Berechnung der Ergebnisse [0][x] = Zeile, [1][x] = Spalte, [2][x] = Block
    Global $bUnraveled = False ; True = Rätsel gelöst
    Global $bStarted = False ; True = Rätsel begonnen
    Global $bNoSolveMsg = False ; True = keine Message ausgeben wenn Spiel gelöst wurde
    Global $iStartTime ; Startzeit
    Global $iRunTime ; Spieldauer
    #endregion ; ==> Variablen für den Spielmodus ($bGameMode = True)

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

    #region Variablen für den Editormodus ($bGameMode = False)
    Global $bLevelsChanged ; Ist True wenn sich an den Levels was geändert hat
    Global $bSheetSaveOK ; Ist True wenn das Blatt mit mehr als 21 Ziffern gefüllt ist
    Global $bSheetChanged ; Ist True wenn das Blatt verändert wurde
    Global $iGameIndex ; Speichert die aktuelle Spielnummer
    Global $strTempGame ; Zwischenspeicher für das aktuelle Spiel
    Global $strPreLevel ; Text der den Key in der INI-Section Levels vorangestellt ist
    #endregion ; ==> Variablen für den Editormodus ($bGameMode = False)

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

    #endregion ; Variablendefinitionen

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

    #region GUI-Erstellung
    $FrmMain = GUICreate("Sudoku", 633, 454, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "FormMainClose")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "FormMainMinimize")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "FormMainMaximize")
    GUISetOnEvent($GUI_EVENT_RESTORE, "FormMainRestore")
    $ModeMenu = GUICtrlCreateMenu("&Modus")
    $ModeMenuItemGame = GUICtrlCreateMenuItem("&Spiel", $ModeMenu);,0,1)
    GUICtrlSetOnEvent(-1, "ModeChange")
    GUICtrlSetState(-1, $GUI_CHECKED)
    $ModeMenuItemEdit = GUICtrlCreateMenuItem("&Editor", $ModeMenu);,1,1)
    GUICtrlSetOnEvent(-1, "ModeChange")
    $PicLeft = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerLeft = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 113, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerRight = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 226, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicRight = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 339, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicTop = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop, 344, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerTop = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 5, $ciTop + 113, 334, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerBottom = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 5, $ciTop + 226, 334, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicBottom = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop + 339, 344, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    For $iRow = 0 To 8
    $iTop = $ciTop + 8 + $iRow * 35 + Int($iRow / 3) * 8
    For $iColumn = 0 To 8
    $iLeft = $ciLeft + 8 + $iColumn * 35 + Int($iColumn / 3) * 8
    $arField[$iRow][$iColumn] = GUICtrlCreateInput("", $iLeft, $iTop, 32, 32, BitOR($ES_CENTER, $ES_NUMBER))
    GUICtrlSetOnEvent(-1, "FieldChange")
    GUICtrlSetLimit(-1, 1)
    GUICtrlSetFont(-1, 16, 400, 0, "Arial")
    Next
    Next

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

    #region Controls für alle Modi (immer sichtbar)
    $LblLevels = GUICtrlCreateLabel("Level:", $ciLeft + 360, $ciTop + 5, 50, $WS_GROUP)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    $CBLevels = GUICtrlCreateCombo("", $ciLeft + 420, $ciTop + 5, 120, 100, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetOnEvent(-1, "LevelChange")
    $LblGames = GUICtrlCreateLabel("Spiel:", $ciLeft + 360, $ciTop + 30, 50)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    $CBGames = GUICtrlCreateCombo("", $ciLeft + 420, $ciTop + 30, 120, 100, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetOnEvent(-1, "GameChange")
    #endregion ; ==> Controls für alle Modi (immer sichtbar)

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

    #region Controls für den Spielmodus (sichtbar wenn $bGameMode = True)
    $ButGenerateGame = GUICtrlCreateButton("Spiel &generieren", $ciLeft + 360, $ciTop + 250, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButGenerateGameClick")
    $ButSolve = GUICtrlCreateButton("Spiel &lösen", $ciLeft + 360, $ciTop + 280, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButSolveClick")
    $ButRestart = GUICtrlCreateButton("Spiel &neustarten", $ciLeft + 360, $ciTop + 310, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButRestartClick")
    #endregion ; ==> Controls für den Spielmodus (sichtbar wenn $bGameMode = True)

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

    #region Controls für den Editormodus (sichtbar wenn $bGameMode = False)
    $ButChangeLevel = GUICtrlCreateButton("Levelbez. ä&ndern", $ciLeft + 360, $ciTop + 140, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButChangeLevelClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButNewLevel = GUICtrlCreateButton("Neuer &Level", $ciLeft + 360, $ciTop + 170, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButNewLevelClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButNewSheet = GUICtrlCreateButton("Neues &Blatt", $ciLeft + 360, $ciTop + 210, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButNewSheetClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButDelSheet = GUICtrlCreateButton("Blatt lösch&en", $ciLeft + 360, $ciTop + 240, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButDelSheetClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButSave = GUICtrlCreateButton("Blatt &speichern", $ciLeft + 360, $ciTop + 280, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButSaveClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButUndo = GUICtrlCreateButton("Änderungen &verwerfen", $ciLeft + 360, $ciTop + 310, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButUndoClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetState(-1, $GUI_HIDE)
    #endregion ; ==> Controls für den Editormodus (sichtbar wenn $bGameMode = False)

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

    $StatusBar = _GUICtrlStatusBarCreate($FrmMain, $arPartsWidth, $arPartsText)
    #endregion ; ==> GUI-Erstellung

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

    GUISetState(@SW_SHOW)

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

    #region Initialisierung
    $arLevels = IniReadSection($cstrIniFile, "Levels")
    If @error Then ; Fehler beim lesen der INI-Datei
    ButGenerateGameClick()
    GUICtrlSetState($CBLevels, $GUI_DISABLE)
    GUICtrlSetState($CBGames, $GUI_DISABLE)
    Else
    $strPreLevel = StringRegExp($arLevels[1][0], "(.*)\d+", 1)
    $strPreLevel = $strPreLevel[0]
    If $arLevels[0][0] > 1 Then
    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0]
    $strLevels &= $arLevels[$iIndex][1] & "|"
    Next
    $strLevels = StringTrimRight($strLevels, 1)
    GUICtrlSetData($CBLevels, $strLevels, StringLeft($strLevels, StringInStr($strLevels, "|") - 1))
    Else
    GUICtrlSetData($CBLevels, $arLevels[1][1], $arLevels[1][1])
    EndIf
    LevelChange()
    EndIf
    #endregion ; ==> Initialisierung

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

    #region Hauptschleife
    While 1
    If $bGameMode = True Then ; im Spielmodus

    If $bUnraveled = True Then
    If (Not $bNoSolveMsg) And MsgBox(262148, "", "Sudoku wurde gelöst!" & @CRLF & "Glückwunsch!" & @CRLF & @CRLF & "Weiterspielen ?") = 7 Then ExitLoop
    $bUnraveled = False
    $bNoSolveMsg = False
    EndIf

    If $bStarted = True Then
    If BitAND(GUICtrlRead($ModeMenu), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ModeMenu, $GUI_DISABLE) ; Während des Spieles Modus-Menü deaktivieren
    If $iStartTime = 0 Then $iStartTime = TimerInit()
    If $iRunTime <> Int(TimerDiff($iStartTime) / 1000) Then
    $iRunTime = Int(TimerDiff($iStartTime) / 1000)
    _GUICtrlStatusBarSetText($StatusBar, StringFormat("%02i:%02i:%02i", Int($iRunTime / 3600), Int(Mod($iRunTime, 3600) / 60), Mod($iRunTime, 60)), 0)
    EndIf

    If BitAND(GUICtrlGetState($ButRestart), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButRestart, $GUI_ENABLE)
    Else
    If BitAND(GUICtrlRead($ModeMenu), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ModeMenu, $GUI_ENABLE)
    _GUICtrlStatusBarSetText($StatusBar, "Let's go!", 0)
    If BitAND(GUICtrlGetState($ButRestart), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButRestart, $GUI_DISABLE)
    EndIf

    Else ; im Editormodus
    If Not $bSheetChanged Then
    If BitAND(GUICtrlGetState($ButNewLevel), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButNewLevel, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($ButUndo), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButUndo, $GUI_DISABLE)
    Else
    If BitAND(GUICtrlGetState($ButNewLevel), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButNewLevel, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($ButUndo), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButUndo, $GUI_ENABLE)
    EndIf

    If StringChrCount($strTempGame, "0") = 81 Then
    If BitAND(GUICtrlGetState($ButNewSheet), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButNewSheet, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($CBLevels), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($CBLevels, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($CBGames), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($CBGames, $GUI_DISABLE)
    Else
    If BitAND(GUICtrlGetState($CBLevels), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($CBLevels, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($CBGames), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($CBGames, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($ButNewSheet), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButNewSheet, $GUI_ENABLE)
    EndIf

    If $bSheetChanged And $bSheetSaveOK Then
    If BitAND(GUICtrlGetState($ButSave), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButSave, $GUI_ENABLE)
    Else
    If BitAND(GUICtrlGetState($ButSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButSave, $GUI_DISABLE)
    EndIf

    EndIf

    $CGF = ControlGetFocus($FrmMain)
    If StringLeft($CGF, 4) = "Edit" Then
    If _IsPressed("25") Then ; Cursor Links
    If Int(StringMid($CGF, 5)) = 1 Then
    GUICtrlSetState($arField[8][8], $GUI_FOCUS)
    Else
    ControlSend($FrmMain, "", "", "+{TAB}")
    EndIf
    EndIf
    If _IsPressed("26") Then ; Cursor hoch
    Switch Int(StringMid($CGF, 5))
    Case 1
    GUICtrlSetState($arField[8][8], $GUI_FOCUS)
    Case 2 To 9
    GUICtrlSetState($arField[8][Int(StringMid($CGF, 5)) - 2], $GUI_FOCUS)
    Case Else
    GUICtrlSetState($arField[Int((StringMid($CGF, 5) - 10) / 9) ][Int(Mod(StringMid($CGF, 5) - 10, 9)) ], $GUI_FOCUS)
    EndSwitch
    EndIf
    If _IsPressed("27") Then ; Cursor rechts
    If Int(StringMid($CGF, 5)) = 81 Then
    GUICtrlSetState($arField[0][0], $GUI_FOCUS)
    Else
    ControlSend($FrmMain, "", "", "{TAB}")
    EndIf
    EndIf
    If _IsPressed("28") Then ; Cursor runter
    If Int(StringMid($CGF, 5)) >= 73 Then
    GUICtrlSetState($arField[0][Int(Mod(StringMid($CGF, 5) + 9, 9)) ], $GUI_FOCUS)
    Else
    GUICtrlSetState($arField[Int((StringMid($CGF, 5) + 8) / 9) ][Int(Mod(StringMid($CGF, 5) + 8, 9)) ], $GUI_FOCUS)
    EndIf
    EndIf
    EndIf
    Sleep(80)
    WEnd
    #endregion ; ==> Hauptschleife

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

    #region Funktionen
    Func FormMainClose()
    If $bGameMode = False Then ; im Editormodus
    If $bSheetChanged Then
    $iAnswer = MsgBox(262436, "Beenden", "Wenn Sie jetzt beenden gehen" & @CRLF & "alle Änderungen verloren!" & @CRLF & @CRLF & "Soll wirklich beendet werden?")
    If $iAnswer = 7 Then Return
    EndIf
    EndIf
    Exit
    EndFunc ;==>FormMainClose

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

    Func FormMainMaximize()
    EndFunc ;==>FormMainMaximize
    Func FormMainMinimize()
    EndFunc ;==>FormMainMinimize
    Func FormMainRestore()
    EndFunc ;==>FormMainRestore

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

    #region Funktionen für alle Modi
    ; ModeChange -> wechsel zwischen Spiel und Editor
    Func ModeChange()
    Switch @GUI_CtrlId
    Case $ModeMenuItemGame ; In Spielmodus schalten
    If $bGameMode = False Then
    If $bLevelsChanged Or $bSheetChanged Then
    $iAnswer = MsgBox(262436, "Moduswechsel", "Wenn Sie jetzt in den Spielmodus schalten" & @CRLF & "gehen alle Änderungen verloren!" & @CRLF & @CRLF & "Wollen Sie wirklich umschalten?")
    If $iAnswer = 7 Then Return
    EndIf
    SetStates(True) ; Initialisierung für Spielmodus
    LevelChange()
    EndIf
    Case $ModeMenuItemEdit ; In Editormodus schalten
    If $bGameMode = True Then
    If Not FileExists(@ScriptDir & "\Sudoku.ini") Then
    $strPreLevel = "Level"
    Dim $arLevels[2][2]
    Dim $arGames[2][2]
    $arLevels[0][0] = 1
    $arLevels[1][0] = $strPreLevel & "1"
    $arLevels[1][1] = "Level 1"
    GUICtrlSetData($CBLevels, "Level 1", "Level 1")
    $arGames[0][0] = 1
    $arGames[1][0] = "001"
    $arGames[1][1] = StringFormat("%081s", "0")
    GUICtrlSetData($CBGames, "001", "001")
    IniWriteSection($cstrIniFile, "Levels", $arLevels)
    IniWriteSection($cstrIniFile, $arLevels[1][0], $arGames)
    EndIf
    SetStates(False) ; Initialisierung für Editmodus
    LevelChange()
    EndIf
    EndSwitch
    EndFunc ;==>ModeChange

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

    ; Initialisierung je nach Modus
    Func SetStates($bMode)
    If $bMode Then ; Spielmodus
    ;~ ConsoleWrite("Set Gamemode" & @CRLF)
    WinSetTitle($FrmMain, "", "Sudoku")
    GUICtrlSetState($ModeMenuItemGame, $GUI_CHECKED)
    GUICtrlSetState($ModeMenuItemEdit, $GUI_UNCHECKED)
    GUICtrlSetState($ButGenerateGame, $GUI_SHOW)
    GUICtrlSetState($ButSolve, $GUI_SHOW)
    GUICtrlSetState($ButRestart, $GUI_SHOW)
    GUICtrlSetState($ButChangeLevel, $GUI_HIDE)
    GUICtrlSetState($ButNewLevel, $GUI_HIDE)
    GUICtrlSetState($ButNewSheet, $GUI_HIDE)
    GUICtrlSetState($ButDelSheet, $GUI_HIDE)
    GUICtrlSetState($ButSave, $GUI_HIDE)
    GUICtrlSetState($ButUndo, $GUI_HIDE)
    $bGameMode = True
    $bUnraveled = False
    $bStarted = False
    Else ; Editormodus
    ;~ ConsoleWrite("Set Editmode" & @CRLF)
    WinSetTitle($FrmMain, "", "Sudoku - Level Editor")
    GUICtrlSetState($ModeMenuItemGame, $GUI_UNCHECKED)
    GUICtrlSetState($ModeMenuItemEdit, $GUI_CHECKED)
    GUICtrlSetState($ButGenerateGame, $GUI_HIDE)
    GUICtrlSetState($ButSolve, $GUI_HIDE)
    GUICtrlSetState($ButRestart, $GUI_HIDE)
    GUICtrlSetState($ButChangeLevel, $GUI_SHOW)
    GUICtrlSetState($ButNewLevel, $GUI_SHOW)
    GUICtrlSetState($ButNewSheet, $GUI_SHOW)
    GUICtrlSetState($ButDelSheet, $GUI_SHOW)
    GUICtrlSetState($ButSave, $GUI_SHOW)
    GUICtrlSetState($ButUndo, $GUI_SHOW)
    $bGameMode = False
    $bLevelsChanged = False
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndIf
    GUICtrlSetState($CBLevels, $GUI_ENABLE)
    GUICtrlSetState($CBGames, $GUI_ENABLE)

    Return $bMode
    EndFunc ;==>SetStates

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

    ; FieldChange -> eines der Inputfelder wurde geändert
    Func FieldChange()
    If $bGameMode = True Then ; im Spielmodus
    For $iRow = 0 To 8
    $arResult[0][$iRow] = 0
    For $iColumn = 0 To 8
    If $iRow = 0 Then
    $arResult[1][$iColumn] = 0
    $arResult[2][$iColumn] = 0
    EndIf
    $iValue = Int(GUICtrlRead($arField[$iRow][$iColumn]))
    $arResult[0][$iRow] += $iValue ; Zeilenergebnis
    $arResult[1][$iColumn] += $iValue ; Spaltenergebnis
    $arResult[2][Int($iRow / 3) * 3 + Int($iColumn / 3) ] += $iValue ; Blockergebnis
    Next
    Next
    $bUnraveled = True
    For $iIndex = 0 To 8
    If $arResult[0][$iIndex] <> 45 Or $arResult[1][$iIndex] <> 45 Or $arResult[2][$iIndex] <> 45 Then
    $bUnraveled = False
    ExitLoop
    EndIf
    Next
    $bStarted = True
    Else ; im Editormodus
    $iCounter = 0
    $arGames[$iGameIndex][1] = ""
    For $iRow = 0 To 8
    For $iColumn = 0 To 8
    $iValue = Int(GUICtrlRead($arField[$iRow][$iColumn]))
    If $iValue > 0 Then
    $iCounter += 1
    $arGames[$iGameIndex][1] &= String($iValue)
    Else
    $arGames[$iGameIndex][1] &= "0"
    EndIf
    Next
    Next
    $bSheetSaveOK = False
    If $iCounter > 13 Then $bSheetSaveOK = True
    $bSheetChanged = True
    _GUICtrlStatusBarSetText($StatusBar, $iCounter & " Ziffern")
    EndIf
    EndFunc ;==>FieldChange

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

    ; LevelChange -> Schwierigkeitsstufe wurde geändert
    Func LevelChange()
    $strLevel = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $strLevel Then ExitLoop
    Next
    $arGames = IniReadSection($cstrIniFile, $arLevels[$iIndex][0])
    If @error Then
    MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
    Exit
    EndIf
    Switch $arGames[0][0]
    Case 0
    MsgBox(4096, "", "Für diesen Level existieren keine Spiele")
    Return
    Case 1
    GUICtrlSetData($CBGames, "|" & $arGames[1][0], $arGames[1][0])
    If $bGameMode And (StringChrCount($arGames[1][1], "0") = 81) Then
    ButGenerateGameClick()
    GUICtrlSetState($CBLevels, $GUI_DISABLE)
    GUICtrlSetState($CBGames, $GUI_DISABLE)
    Return
    EndIf
    Case Else
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0]
    $strGames &= $arGames[$iIndex][0] & "|"
    Next
    $strGames = StringTrimRight($strGames, 1)
    GUICtrlSetData($CBGames, "|" & $strGames, StringLeft($strGames, StringInStr($strGames, "|") - 1))
    EndSwitch
    GameChange()
    EndFunc ;==>LevelChange

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

    ; GameChange -> Neues Spiel wurde gewählt
    Func GameChange()
    $strGame = GUICtrlRead($CBGames)
    For $iIndex = 1 To $arGames[0][0]
    If $arGames[$iIndex][0] == $strGame Then ExitLoop
    Next
    For $iRow = 8 To 0 Step - 1
    For $iColumn = 8 To 0 Step - 1
    $iValue = StringMid($arGames[$iIndex][1], $iRow * 9 + $iColumn + 1, 1)
    If $iValue <> 0 Then
    GUICtrlSetData($arField[$iRow][$iColumn], $iValue)
    If $bGameMode = True Then ; im Spielmodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER, $ES_READONLY))
    Else ; im Editormodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Else
    GUICtrlSetData($arField[$iRow][$iColumn], "")
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Next
    Next

    If $bGameMode = True Then ; im Spielmodus
    $bStarted = False
    $iStartTime = 0
    Else ; im Editormodus
    $strTempGame = $arGames[$iIndex][1]
    $iGameIndex = $iIndex
    _GUICtrlStatusBarSetText($StatusBar, 81 - StringChrCount($strTempGame, "0") & " Ziffern")
    EndIf
    EndFunc ;==>GameChange
    #endregion ; ==> Funktionen für alle Modi

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

    #region Funktionen für den Spielmodus ($bGameMode = True)
    ; Button "Spiel generieren" wurde betätigt
    Func ButGenerateGameClick()
    $szField = GenerateGame(Random(21,35,1),0)
    If Not @error Then
    If $bStarted And MsgBox(262436, "Spiel generieren", "Soll das aktuelle Blatt überschrieben werden?") = 7 Then Return

    For $iRow = 8 To 0 Step - 1
    For $iColumn = 8 To 0 Step - 1
    $iValue = StringMid($szField, $iRow * 9 + $iColumn + 1, 1)
    If $iValue <> 0 Then
    GUICtrlSetData($arField[$iRow][$iColumn], $iValue)
    If $bGameMode = True Then ; im Spielmodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER, $ES_READONLY))
    Else ; im Editormodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Else
    GUICtrlSetData($arField[$iRow][$iColumn], "")
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Next
    Next

    $bStarted = False
    $iStartTime = 0
    EndIf

    EndFunc ;==>ButGenerateGameClick

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

    ; Generiert ein Spiel nach einem Algorithmus von Moritz Lenz -> http://moritz.faui2k3.org/de/yasss
    Func GenerateGame($nDifficulty, $nDeviation = 0)
    $arDLL = DllCall("Sudoku.dll", "str", "SudokuGenerate", "int", $nDifficulty, "int", $nDeviation)
    If IsArray($arDLL) Then Return SetError(0, 0, $arDLL[0])
    Return SetError(1, 0, "")
    EndFunc ;==>GenerateGame

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

    Func ButSolveClick()
    Local $szField = ""

    If $bUnraveled = True Then Return

    If MsgBox(262436, "Spiel lösen", "Soll das jetzt automatisch gelöst werden?") = 7 Then Return

    For $iRow = 0 To 8
    For $iColumn = 0 To 8
    $chValue = GUICtrlRead($arField[$iRow][$iColumn])
    If $chValue = "" Then
    $szField &= "0"
    Else
    $szField &= $chValue
    EndIf
    Next
    Next

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

    $arDLL = DllCall("Sudoku.dll", "str", "SudokuSolve", "str", $szField)
    If IsArray($arDLL) Then $szField = $arDLL[0]

    For $iRow = 8 To 0 Step -1
    For $iColumn = 8 To 0 Step -1
    $chValue = StringMid($szField, $iRow * 9 + $iColumn + 1, 1)
    If $chValue <> 0 Then GUICtrlSetData($arField[$iRow][$iColumn], $chValue)
    Next
    Next
    FieldChange()
    $bNoSolveMsg = True
    EndFunc ;==>ButSolveClick

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

    Func ButRestartClick()
    GameChange()
    EndFunc ;==>ButRestartClick
    #endregion ; ==> Funktionen für den Spielmodus ($bGameMode = True)

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

    #region Funktionen für den Editormodus ($bGameMode = False)
    ; Button "Levelbez. ändern" wurde betätigt
    Func ButChangeLevelClick()
    $StrOldName = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $StrOldName Then ExitLoop
    Next
    $strNewName = InputBox("Levelbezeichnung ändern", "Bitte neue Levelbezeichnung eingeben!" & @CRLF & @CRLF & _
    "Die derzeitige Bezeichnung ist: " & $StrOldName)
    If $strNewName <> $StrOldName And StringLen($strNewName) Then
    $arLevels[$iIndex][1] = $strNewName
    $bLevelsChanged = True
    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0]
    $strLevels &= $arLevels[$iIndex][1] & "|"
    Next
    $strLevels = StringTrimRight($strLevels, 1)
    GUICtrlSetData($CBLevels, $strLevels, $strNewName)
    EndIf
    EndFunc ;==>ButChangeLevelClick

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

    ; Button "Neuer Level" wurde betätigt
    Func ButNewLevelClick()
    $strNewName = InputBox("Level hinzufügen", "Bitte Bezeichnung für den neuen Level eingeben!")
    If StringLen($strNewName) Then
    ReDim $arLevels[$arLevels[0][0] + 2][2]
    $arLevels[0][0] += 1
    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0] - 1
    $strLevels &= $arLevels[$iIndex][1] & "|"
    If Int(StringMid($arLevels[$iIndex][0], 6)) >= Int($arLevels[$arLevels[0][0]][0]) Then
    $arLevels[$arLevels[0][0]][0] = Int(StringMid($arLevels[$iIndex][0], 6)) + 1
    EndIf
    Next
    $arLevels[$arLevels[0][0]][0] = $strPreLevel & $arLevels[$arLevels[0][0]][0]
    $arLevels[$arLevels[0][0]][1] = $strNewName
    $strLevels &= $strNewName
    GUICtrlSetData($CBLevels, $strLevels, $strNewName)
    ReDim $arGames[2][2]
    $arGames[0][0] = 1
    $arGames[1][0] = "001"
    $arGames[1][1] = StringFormat("%081s", "0")
    GUICtrlSetData($CBGames, "001", "001")
    GameChange()
    $bLevelsChanged = True
    $bSheetChanged = True
    $bSheetSaveOK = False
    EndIf
    EndFunc ;==>ButNewLevelClick

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

    ; Button "Neues Blatt" wurde betätigt
    Func ButNewSheetClick()
    ReDim $arGames[$arGames[0][0] + 2][2]
    $arGames[0][0] += 1
    $arGames[$arGames[0][0]][1] = StringFormat("%081s", "0")
    Switch $arGames[0][0]
    Case 0
    MsgBox(4096, "", "Für diesen Level existieren keine Spiele!")
    Return
    Case 1
    GUICtrlSetData($CBGames, "|" & $arGames[1][0], $arGames[1][0])
    Case Else
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0] - 1
    $strGames &= $arGames[$iIndex][0] & "|"
    If Int($arGames[$iIndex][0]) >= Int($arGames[$arGames[0][0]][0]) Then
    $arGames[$arGames[0][0]][0] = StringFormat("%03i", Int($arGames[$iIndex][0]) + 1)
    EndIf
    Next
    $strGames &= $arGames[$arGames[0][0]][0]
    GUICtrlSetData($CBGames, "|" & $strGames, $arGames[$arGames[0][0]][0])
    EndSwitch
    GameChange()
    $bSheetSaveOK = False
    EndFunc ;==>ButNewSheetClick

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

    ; Button "Blatt löschen" wurde betätigt
    Func ButDelSheetClick()
    If MsgBox(262436, "Blatt löschen", "Soll das Blatt wirklich gelöscht werden?") = 6 Then
    $iCounter = 1
    $strGames = ""
    If $arGames[0][0] = 1 Then
    $arGames[1][1] = StringFormat("%081s", "0")
    Else
    For $iIndex = 1 To $arGames[0][0]
    If $iIndex = $iGameIndex Then ContinueLoop
    $arGames[$iCounter][0] = StringFormat("%03i", $iCounter)
    $arGames[$iCounter][1] = $arGames[$iIndex][1]
    $strGames &= $arGames[$iCounter][0] & "|"
    $iCounter += 1
    Next
    $strGames = StringTrimRight($strGames, 1)
    GUICtrlSetData($CBGames, "|" & $strGames, StringLeft($strGames, StringInStr($strGames, "|") - 1))
    $arGames[0][0] -= 1
    ReDim $arGames[$arGames[0][0] + 1][2]
    EndIf
    ButSaveClick()
    EndIf
    EndFunc ;==>ButDelSheetClick

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

    ; Button "Blatt speichern" wurde betätigt
    Func ButSaveClick()
    If $bLevelsChanged Then
    IniWriteSection($cstrIniFile, "Levels", $arLevels)
    If @error Then
    MsgBox(4096, "", "Fehler beim schreiben der Ini-Datei!")
    Exit
    EndIf
    $bLevelsChanged = False
    EndIf
    $strLevel = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $strLevel Then ExitLoop
    Next
    IniWriteSection($cstrIniFile, $arLevels[$iIndex][0], $arGames)
    If @error Then
    MsgBox(4096, "", "Fehler beim schreiben der Ini-Datei!")
    Exit
    EndIf
    GameChange()
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndFunc ;==>ButSaveClick

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

    ; Button "Änderungen verwerfen" wurde betätigt
    Func ButUndoClick()
    $arGames[$iGameIndex][1] = $strTempGame
    GameChange()
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndFunc ;==>ButUndoClick

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

    ; Anzahl eines Zeichens im String zählen
    Func StringChrCount($String, $char)
    StringReplace($String, $char, $char)
    Return @extended
    EndFunc ;==>StringChrCount
    #endregion ; ==> Funktionen für den Editormodus ($bGameMode = False)

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

    #endregion ; ==> Funktionen

    [/autoit]

    Edit: Ich habe die Initialisierungsroutine geändert, jetzt kann man auch spielen wenn noch keine Levels mit dem Editor erstellt wurden.

    Edit2: Wie so oft hat sich durch das beheben eines Fehlers gleich ein weiterer Fehler eingeschliechen;-) jetzt sollte es funktionieren!

  • also ich weiß nicht woran das liegt, aber jedesmal wenn ich die sudoko.exe oder au3 starte mit der neustes Autoitversion geht er sofort von Spiel auf Editormode rüber und wenn ich bei Modus es auf Spiel umstellen will springt er sofort auch editor um ;(

    und wenn ich dann auf blatt löschen gehe beim editor ohne irgendetwas einzutragen kommt:[Blockierte Grafik: http://leviathan-design.de/~upload1/ss212031.jpg]

    Einmal editiert, zuletzt von leviathan (9. Juni 2007 um 21:21)

    • Offizieller Beitrag

    Jetzt sollte alles funktionieren!

    Edit:

    Ich habe es mal an die neue AutoIt-Version (3.2.10.0) angepasst!
    Die zus. benötigten Datei sind in der ZIP!

    sudoku.au3
    [autoit]

    ; ----------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.2.10.0
    ; Author: bernd670
    ; Idea: Alina
    ;
    ; Script Function:
    ; Sudoku & Leveleditor
    ;
    ; ----------------------------------------------------------------------------
    #Region Compiler directives section
    ;~ #AutoIt3Wrapper_Prompt=y
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_Icon =.\Images\Sudoku.ico
    #AutoIt3Wrapper_Res_LegalCopyright=bernd670 and Friends
    #AutoIt3Wrapper_Res_Description=AutoIt v3 Skript - Sudoku
    #AutoIt3Wrapper_Res_Comment=Sudoku Spiel
    #AutoIt3Wrapper_OutFile_Type=exe
    #AutoIt3Wrapper_Compression=4 ;Compression parameter 0-4 0=Low 2=normal 4=High
    #AutoIt3Wrapper_Allow_Decompile=n
    #AutoIt3Wrapper_Res_Field=Entwickler|bernd670
    #AutoIt3Wrapper_Res_Field=Release Datum|%date% %time%
    #AutoIt3Wrapper_Res_Field=Programmgruppe|Spiele
    #AutoIt3Wrapper_Res_Field=Original Dateiname|Sudoku.exe
    #AutoIt3Wrapper_Res_Field=Version|1.0
    #AutoIt3Wrapper_Run_Obfuscator=n
    #endregion ; ==> Compiler directives section

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

    #region FileInstall
    FileInstall(".\Sudoku.dll", @ScriptDir & "\Sudoku.dll", 0)
    #endregion ; ==> FileInstall

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

    #region Includes
    #include <GUIConstants.au3>
    #Include <GuiStatusBar.au3>
    #endregion ; ==> Includes

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

    #region AutoItSetOptions
    Opt("GUIOnEventMode", 1)
    #endregion ; ==> AutoItSetOptions

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

    #region Konstantendefinitionen
    Const $ciTop = 40
    Const $ciLeft = 20
    Const $cstrIniFile = @ScriptDir & "\Sudoku.ini"
    #endregion ; ==> Konstantendefinitionen

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

    #region Variablendefinitionen

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

    #region Variablen für alle Modi
    Dim $arField[9][9] ; Speichert die ControlID's der Inputfelder
    Dim $arLevels ; Array für die Spielstufen
    Dim $arGames ; Array für die Spiele in den Spielstufen
    Global $bGameMode = True ; True = Spielmodus, False = Editormodus
    Local $arPartsWidth[2] = [ 55, -1 ]
    Local $arPartsText[2] = [ "Let's go!", "" ]
    #endregion ; ==> Variablen für alle Modi

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

    #region Variablen für den Spielmodus ($bGameMode = True)
    Dim $arResult[3][9] ; Zur Berechnung der Ergebnisse [0][x] = Zeile, [1][x] = Spalte, [2][x] = Block
    Global $bUnraveled = False ; Rätsel gelöst
    Global $bStarted = False ; Rätsel begonnen
    Global $iStartTime ; Startzeit
    Global $iRunTime ; Spieldauer
    #endregion ; ==> Variablen für den Spielmodus ($bGameMode = True)

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

    #region Variablen für den Editormodus ($bGameMode = False)
    Global $bLevelsChanged ; Ist True wenn sich an den Levels was geändert hat
    Global $bSheetSaveOK ; Ist True wenn das Blatt mit mehr als 21 Ziffern gefüllt ist
    Global $bSheetChanged ; Ist True wenn das Blatt verändert wurde
    Global $iGameIndex ; Speichert die aktuelle Spielnummer
    Global $strTempGame ; Zwischenspeicher für das aktuelle Spiel
    Global $strPreLevel ; Text der den Key in der INI-Section Levels vorangestellt ist
    #endregion ; ==> Variablen für den Editormodus ($bGameMode = False)

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

    #endregion ; Variablendefinitionen

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

    #region GUI-Erstellung
    $FrmMain = GUICreate("Sudoku", 633, 454, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "FormMainClose")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "FormMainMinimize")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "FormMainMaximize")
    GUISetOnEvent($GUI_EVENT_RESTORE, "FormMainRestore")
    $ModeMenu = GUICtrlCreateMenu("&Modus")
    $ModeMenuItemGame = GUICtrlCreateMenuItem("&Spiel", $ModeMenu);,0,1)
    GUICtrlSetOnEvent(-1, "ModeChange")
    GUICtrlSetState(-1, $GUI_CHECKED)
    $ModeMenuItemEdit = GUICtrlCreateMenuItem("&Editor", $ModeMenu);,1,1)
    GUICtrlSetOnEvent(-1, "ModeChange")
    $PicLeft = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerLeft = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 113, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerRight = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 226, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicRight = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 339, $ciTop + 5, 5, 334, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicTop = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop, 344, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerTop = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 5, $ciTop + 113, 334, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicInnerBottom = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft + 5, $ciTop + 226, 334, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    $PicBottom = GUICtrlCreatePic(@ScriptDir & "\Images\Black.jpg", $ciLeft, $ciTop + 339, 344, 5, BitOR($SS_NOTIFY, $WS_GROUP))
    For $iRow = 0 To 8
    $iTop = $ciTop + 8 + $iRow * 35 + Int($iRow / 3) * 8
    For $iColumn = 0 To 8
    $iLeft = $ciLeft + 8 + $iColumn * 35 + Int($iColumn / 3) * 8
    $arField[$iRow][$iColumn] = GUICtrlCreateInput("", $iLeft, $iTop, 32, 32, BitOR($ES_CENTER, $ES_NUMBER))
    GUICtrlSetOnEvent(-1, "FieldChange")
    GUICtrlSetLimit(-1, 1)
    GUICtrlSetFont(-1, 16, 400, 0, "Arial")
    Next
    Next

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

    #region Controls für alle Modi (immer sichtbar)
    $LblLevels = GUICtrlCreateLabel("Level:", $ciLeft + 360, $ciTop + 5, 50, $WS_GROUP)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    $CBLevels = GUICtrlCreateCombo("", $ciLeft + 420, $ciTop + 5, 120, 100, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetOnEvent(-1, "LevelChange")
    $LblGames = GUICtrlCreateLabel("Spiel:", $ciLeft + 360, $ciTop + 30, 50)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    $CBGames = GUICtrlCreateCombo("", $ciLeft + 420, $ciTop + 30, 120, 100, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetOnEvent(-1, "GameChange")
    #endregion ; ==> Controls für alle Modi (immer sichtbar)

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

    #region Controls für den Spielmodus (sichtbar wenn $bGameMode = True)
    $ButSolve = GUICtrlCreateButton("Spiel &lösen", $ciLeft + 360, $ciTop + 280, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButSolveClick")
    $ButRestart = GUICtrlCreateButton("Spiel &neustarten", $ciLeft + 360, $ciTop + 310, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButRestartClick")
    #endregion ; ==> Controls für den Spielmodus (sichtbar wenn $bGameMode = True)

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

    #region Controls für den Editormodus (sichtbar wenn $bGameMode = False)
    $ButChangeLevel = GUICtrlCreateButton("Levelbez. ä&ndern", $ciLeft + 360, $ciTop + 110, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButChangeLevelClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButNewLevel = GUICtrlCreateButton("Neuer &Level", $ciLeft + 360, $ciTop + 140, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButNewLevelClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButNewSheet = GUICtrlCreateButton("Neues &Blatt", $ciLeft + 360, $ciTop + 180, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButNewSheetClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButGenerateGame = GUICtrlCreateButton("Spiel &generieren", $ciLeft + 360, $ciTop + 210, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButGenerateGameClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButDelSheet = GUICtrlCreateButton("Blatt lösch&en", $ciLeft + 360, $ciTop + 240, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButDelSheetClick")
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButSave = GUICtrlCreateButton("Blatt &speichern", $ciLeft + 360, $ciTop + 280, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButSaveClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetState(-1, $GUI_HIDE)
    $ButUndo = GUICtrlCreateButton("Änderungen &verwerfen", $ciLeft + 360, $ciTop + 310, 190)
    GUICtrlSetFont(-1, 12, 600, 0, "Arial")
    GUICtrlSetOnEvent(-1, "ButUndoClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetState(-1, $GUI_HIDE)
    #endregion ; ==> Controls für den Editormodus (sichtbar wenn $bGameMode = False)

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

    $StatusBar = _GUICtrlStatusBar_Create($FrmMain, $arPartsWidth, $arPartsText)
    #endregion ; ==> GUI-Erstellung

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

    GUISetState(@SW_SHOW)

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

    #region Initialisierung
    $arLevels = IniReadSection($cstrIniFile, "Levels")
    If @error Then ; Fehler beim lesen der INI-Datei
    $strPreLevel = "Level"
    Dim $arLevels[2][2]
    Dim $arGames[2][2]
    $arLevels[0][0] = 1
    $arLevels[1][0] = $strPreLevel & "1"
    $arLevels[1][1] = "Level 1"
    GUICtrlSetData($CBLevels, "Level 1", "Level 1")
    $arGames[0][0] = 1
    $arGames[1][0] = "001"
    $arGames[1][1] = StringFormat("%081s", "0")
    GUICtrlSetData($CBGames, "001", "001")
    IniWriteSection($cstrIniFile, "Levels", $arLevels)
    IniWriteSection($cstrIniFile, $arLevels[1][0], $arGames)

    $bGameMode = SetStates(False) ; in Editormodus schalten
    GameChange()
    $bLevelsChanged = True
    $bSheetChanged = False
    $bSheetSaveOK = False
    Else
    $strPreLevel = StringRegExp($arLevels[1][0], "(.*)\d+", 1)
    $strPreLevel = $strPreLevel[0]
    If $arLevels[0][0] > 1 Then
    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0]
    $strLevels &= $arLevels[$iIndex][1] & "|"
    Next
    $strLevels = StringTrimRight($strLevels, 1)
    GUICtrlSetData($CBLevels, $strLevels, StringLeft($strLevels, StringInStr($strLevels, "|") - 1))
    Else
    GUICtrlSetData($CBLevels, $arLevels[1][1], $arLevels[1][1])
    EndIf
    LevelChange()
    EndIf
    #endregion ; ==> Initialisierung

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

    #region Hauptschleife
    While 1
    If $bGameMode = True Then ; im Spielmodus

    If $bUnraveled = True Then
    If MsgBox(262148, "", "Sudoku wurde gelöst!" & @CRLF & "Glückwunsch!" & @CRLF & @CRLF & "Weiterspielen ?") = 7 Then ExitLoop
    $bUnraveled = False
    EndIf

    If $bStarted = True Then
    If BitAND(GUICtrlRead($ModeMenu), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ModeMenu, $GUI_DISABLE) ; Während des Spieles Modus-Menü deaktivieren
    If $iStartTime = 0 Then $iStartTime = TimerInit()
    If $iRunTime <> Int(TimerDiff($iStartTime) / 1000) Then
    $iRunTime = Int(TimerDiff($iStartTime) / 1000)
    _GUICtrlStatusBar_SetText($StatusBar, StringFormat("%02i:%02i:%02i", Int($iRunTime / 3600), Int(Mod($iRunTime, 3600) / 60), Mod($iRunTime, 60)), 0)
    EndIf

    If BitAND(GUICtrlGetState($ButRestart), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButRestart, $GUI_ENABLE)
    Else
    If BitAND(GUICtrlRead($ModeMenu), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ModeMenu, $GUI_ENABLE)
    _GUICtrlStatusBar_SetText($StatusBar, "Let's go!", 0)
    If BitAND(GUICtrlGetState($ButRestart), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButRestart, $GUI_DISABLE)
    EndIf

    Else ; im Editormodus
    If Not $bSheetChanged Then
    If BitAND(GUICtrlGetState($ButNewLevel), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButNewLevel, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($ButUndo), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButUndo, $GUI_DISABLE)
    Else
    If BitAND(GUICtrlGetState($ButNewLevel), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButNewLevel, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($ButUndo), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButUndo, $GUI_ENABLE)
    EndIf

    If StringChrCount($strTempGame, "0") = 81 Then
    If BitAND(GUICtrlGetState($ButNewSheet), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButNewSheet, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($CBLevels), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($CBLevels, $GUI_DISABLE)
    If BitAND(GUICtrlGetState($CBGames), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($CBGames, $GUI_DISABLE)
    Else
    If BitAND(GUICtrlGetState($CBLevels), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($CBLevels, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($CBGames), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($CBGames, $GUI_ENABLE)
    If BitAND(GUICtrlGetState($ButNewSheet), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButNewSheet, $GUI_ENABLE)
    EndIf

    If $bSheetChanged And $bSheetSaveOK Then
    If BitAND(GUICtrlGetState($ButSave), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButSave, $GUI_ENABLE)
    Else
    If BitAND(GUICtrlGetState($ButSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButSave, $GUI_DISABLE)
    EndIf

    EndIf

    $CGF = ControlGetFocus($FrmMain)
    If StringLeft($CGF, 4) = "Edit" Then
    If _IsPressed("25") Then ; Cursor Links
    If Int(StringMid($CGF, 5)) = 1 Then
    GUICtrlSetState($arField[8][8], $GUI_FOCUS)
    Else
    ControlSend($FrmMain, "", "", "+{TAB}")
    EndIf
    EndIf
    If _IsPressed("26") Then ; Cursor hoch
    Switch Int(StringMid($CGF, 5))
    Case 1
    GUICtrlSetState($arField[8][8], $GUI_FOCUS)
    Case 2 To 9
    GUICtrlSetState($arField[8][Int(StringMid($CGF, 5)) - 2], $GUI_FOCUS)
    Case Else
    GUICtrlSetState($arField[Int((StringMid($CGF, 5) - 10) / 9) ][Int(Mod(StringMid($CGF, 5) - 10, 9)) ], $GUI_FOCUS)
    EndSwitch
    EndIf
    If _IsPressed("27") Then ; Cursor rechts
    If Int(StringMid($CGF, 5)) = 81 Then
    GUICtrlSetState($arField[0][0], $GUI_FOCUS)
    Else
    ControlSend($FrmMain, "", "", "{TAB}")
    EndIf
    EndIf
    If _IsPressed("28") Then ; Cursor runter
    If Int(StringMid($CGF, 5)) >= 73 Then
    GUICtrlSetState($arField[0][Int(Mod(StringMid($CGF, 5) + 9, 9)) ], $GUI_FOCUS)
    Else
    GUICtrlSetState($arField[Int((StringMid($CGF, 5) + 8) / 9) ][Int(Mod(StringMid($CGF, 5) + 8, 9)) ], $GUI_FOCUS)
    EndIf
    EndIf
    EndIf
    Sleep(80)
    WEnd
    #endregion ; ==> Hauptschleife

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

    #region Funktionen
    Func FormMainClose()
    If $bGameMode = False Then ; im Editormodus
    If $bSheetChanged Then
    $iAnswer = MsgBox(262436, "Beenden", "Wenn Sie jetzt beenden gehen" & @CRLF & "alle Änderungen verloren!" & @CRLF & @CRLF & "Soll wirklich beendet werden?")
    If $iAnswer = 7 Then Return
    EndIf
    EndIf
    Exit
    EndFunc ;==>FormMainClose

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

    Func FormMainMaximize()
    EndFunc ;==>FormMainMaximize
    Func FormMainMinimize()
    EndFunc ;==>FormMainMinimize
    Func FormMainRestore()
    EndFunc ;==>FormMainRestore

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

    #region Funktionen für alle Modi
    ; ModeChange -> wechsel zwischen Spiel und Editor
    Func ModeChange()
    Switch @GUI_CtrlId
    Case $ModeMenuItemGame ; In Spielmodus schalten
    If $bGameMode = False Then
    If $bLevelsChanged Or $bSheetChanged Then
    $iAnswer = MsgBox(262436, "Moduswechsel", "Wenn Sie jetzt in den Spielmodus schalten" & @CRLF & "gehen alle Änderungen verloren!" & @CRLF & @CRLF & "Wollen Sie wirklich umschalten?")
    If $iAnswer = 7 Then Return
    EndIf
    SetStates(True) ; Initialisierung für Spielmodus
    LevelChange()
    EndIf
    Case $ModeMenuItemEdit ; In Editormodus schalten
    If $bGameMode = True Then
    SetStates(False) ; Initialisierung für Editmodus
    LevelChange()
    EndIf
    EndSwitch
    EndFunc ;==>ModeChange

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

    ; Initialisierung je nach Modus
    Func SetStates($bMode)
    If $bMode Then ; Spielmodus
    ConsoleWrite("Set Gamemode" & @CRLF)
    WinSetTitle($FrmMain, "", "Sudoku")
    GUICtrlSetState($ModeMenuItemGame, $GUI_CHECKED)
    GUICtrlSetState($ModeMenuItemEdit, $GUI_UNCHECKED)
    GUICtrlSetState($ButSolve, $GUI_SHOW)
    GUICtrlSetState($ButRestart, $GUI_SHOW)
    GUICtrlSetState($ButChangeLevel, $GUI_HIDE)
    GUICtrlSetState($ButNewLevel, $GUI_HIDE)
    GUICtrlSetState($ButNewSheet, $GUI_HIDE)
    GUICtrlSetState($ButGenerateGame, $GUI_HIDE)
    GUICtrlSetState($ButDelSheet, $GUI_HIDE)
    GUICtrlSetState($ButSave, $GUI_HIDE)
    GUICtrlSetState($ButUndo, $GUI_HIDE)
    $bGameMode = True
    $bUnraveled = False
    $bStarted = False
    Else ; Editormodus
    ConsoleWrite("Set Editmode" & @CRLF)
    WinSetTitle($FrmMain, "", "Sudoku - Level Editor")
    GUICtrlSetState($ModeMenuItemGame, $GUI_UNCHECKED)
    GUICtrlSetState($ModeMenuItemEdit, $GUI_CHECKED)
    GUICtrlSetState($ButSolve, $GUI_HIDE)
    GUICtrlSetState($ButRestart, $GUI_HIDE)
    GUICtrlSetState($ButChangeLevel, $GUI_SHOW)
    GUICtrlSetState($ButNewLevel, $GUI_SHOW)
    GUICtrlSetState($ButNewSheet, $GUI_SHOW)
    GUICtrlSetState($ButGenerateGame, $GUI_SHOW)
    GUICtrlSetState($ButDelSheet, $GUI_SHOW)
    GUICtrlSetState($ButSave, $GUI_SHOW)
    GUICtrlSetState($ButUndo, $GUI_SHOW)
    $bGameMode = False
    $bLevelsChanged = False
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndIf
    GUICtrlSetState($CBLevels, $GUI_ENABLE)
    GUICtrlSetState($CBGames, $GUI_ENABLE)

    Return $bMode
    EndFunc ;==>SetStates

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

    ; FieldChange -> eines der Inputfelder wurde geändert
    Func FieldChange()
    If $bGameMode = True Then ; im Spielmodus
    For $iRow = 0 To 8
    $arResult[0][$iRow] = 0
    For $iColumn = 0 To 8
    If $iRow = 0 Then
    $arResult[1][$iColumn] = 0
    $arResult[2][$iColumn] = 0
    EndIf
    $iValue = Int(GUICtrlRead($arField[$iRow][$iColumn]))
    $arResult[0][$iRow] += $iValue ; Zeilenergebnis
    $arResult[1][$iColumn] += $iValue ; Spaltenergebnis
    $arResult[2][Int($iRow / 3) * 3 + Int($iColumn / 3) ] += $iValue ; Blockergebnis
    Next
    Next
    $bUnraveled = True
    For $iIndex = 0 To 8
    If $arResult[0][$iIndex] <> 45 Or $arResult[1][$iIndex] <> 45 Or $arResult[2][$iIndex] <> 45 Then
    $bUnraveled = False
    ExitLoop
    EndIf
    Next
    $bStarted = True
    Else ; im Editormodus
    $iCounter = 0
    $arGames[$iGameIndex][1] = ""
    For $iRow = 0 To 8
    For $iColumn = 0 To 8
    $iValue = Int(GUICtrlRead($arField[$iRow][$iColumn]))
    If $iValue > 0 Then
    $iCounter += 1
    $arGames[$iGameIndex][1] &= String($iValue)
    Else
    $arGames[$iGameIndex][1] &= "0"
    EndIf
    Next
    Next
    $bSheetSaveOK = False
    If $iCounter > 13 Then $bSheetSaveOK = True
    $bSheetChanged = True
    _GUICtrlStatusBar_SetText($StatusBar, $iCounter & " Ziffern")
    EndIf
    EndFunc ;==>FieldChange

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

    ; LevelChange -> Schwierigkeitsstufe wurde geändert
    Func LevelChange()
    $strLevel = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $strLevel Then ExitLoop
    Next
    $arGames = IniReadSection($cstrIniFile, $arLevels[$iIndex][0])
    If @error Then
    MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
    Exit
    EndIf
    Switch $arGames[0][0]
    Case 0
    MsgBox(4096, "", "Für diesen Level existieren keine Spiele")
    Return
    Case 1
    GUICtrlSetData($CBGames, "|" & $arGames[1][0], $arGames[1][0])
    If StringChrCount($arGames[1][1], "0") = 81 Then SetStates(False)
    Case Else
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0]
    $strGames &= $arGames[$iIndex][0] & "|"
    Next
    $strGames = StringTrimRight($strGames, 1)
    GUICtrlSetData($CBGames, "|" & $strGames, StringLeft($strGames, StringInStr($strGames, "|") - 1))
    EndSwitch
    GameChange()
    EndFunc ;==>LevelChange

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

    ; GameChange -> Neues Spiel wurde gewählt
    Func GameChange()
    $strGame = GUICtrlRead($CBGames)
    For $iIndex = 1 To $arGames[0][0]
    If $arGames[$iIndex][0] == $strGame Then ExitLoop
    Next
    For $iRow = 8 To 0 Step - 1
    For $iColumn = 8 To 0 Step - 1
    $iValue = StringMid($arGames[$iIndex][1], $iRow * 9 + $iColumn + 1, 1)
    If $iValue <> 0 Then
    GUICtrlSetData($arField[$iRow][$iColumn], $iValue)
    If $bGameMode = True Then ; im Spielmodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER, $ES_READONLY))
    Else ; im Editormodus
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Else
    GUICtrlSetData($arField[$iRow][$iColumn], "")
    GUICtrlSetStyle($arField[$iRow][$iColumn], BitOR($ES_CENTER, $ES_NUMBER))
    EndIf
    Next
    Next

    If $bGameMode = True Then ; im Spielmodus
    $bStarted = False
    $iStartTime = 0
    Else ; im Editormodus
    $strTempGame = $arGames[$iIndex][1]
    $iGameIndex = $iIndex
    _GUICtrlStatusBar_SetText($StatusBar, 81 - StringChrCount($strTempGame, "0") & " Ziffern")
    EndIf
    EndFunc ;==>GameChange
    #endregion ; ==> Funktionen für alle Modi

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

    #region Funktionen für den Spielmodus ($bGameMode = True)
    Func ButSolveClick()
    $szField = ""

    For $iRow = 0 To 8
    For $iColumn = 0 To 8
    $chValue = GUICtrlRead($arField[$iRow][$iColumn])
    If $chValue = "" Then
    $szField &= "0"
    Else
    $szField &= $chValue
    EndIf
    Next
    Next

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

    $arDLL = DllCall("Sudoku.dll", "str", "SudokuSolve", "str", $szField)
    If IsArray($arDLL) Then $szField = $arDLL[0]

    For $iRow = 0 To 8
    For $iColumn = 0 To 8
    $chValue = StringMid($szField, $iRow * 9 + $iColumn + 1, 1)
    If $chValue <> 0 Then GUICtrlSetData($arField[$iRow][$iColumn], $chValue)
    Next
    Next
    FieldChange()
    EndFunc ;==>ButSolveClick

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

    Func ButRestartClick()
    GameChange()
    EndFunc ;==>ButRestartClick
    #endregion ; ==> Funktionen für den Spielmodus ($bGameMode = True)

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

    #region Funktionen für den Editormodus ($bGameMode = False)
    ; Button "Levelbez. ändern" wurde betätigt
    Func ButChangeLevelClick()
    $StrOldName = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $StrOldName Then ExitLoop
    Next
    $strNewName = InputBox("Levelbezeichnung ändern", "Bitte neue Levelbezeichnung eingeben!" & @CRLF & @CRLF & _
    "Die derzeitige Bezeichnung ist: " & $StrOldName)
    If $strNewName <> $StrOldName And StringLen($strNewName) Then
    $arLevels[$iIndex][1] = $strNewName
    $bLevelsChanged = True
    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0]
    $strLevels &= $arLevels[$iIndex][1] & "|"
    Next
    $strLevels = StringTrimRight($strLevels, 1)
    GUICtrlSetData($CBLevels, $strLevels, $strNewName)
    EndIf
    EndFunc ;==>ButChangeLevelClick

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

    ; Button "Neuer Level" wurde betätigt
    Func ButNewLevelClick()
    $strNewName = InputBox("Level hinzufügen", "Bitte Bezeichnung für den neuen Level eingeben!")
    If StringLen($strNewName) Then
    ReDim $arLevels[$arLevels[0][0] + 2][2]
    $arLevels[0][0] += 1
    $strLevels = ""
    For $iIndex = 1 To $arLevels[0][0] - 1
    $strLevels &= $arLevels[$iIndex][1] & "|"
    If Int(StringMid($arLevels[$iIndex][0], 6)) >= Int($arLevels[$arLevels[0][0]][0]) Then
    $arLevels[$arLevels[0][0]][0] = Int(StringMid($arLevels[$iIndex][0], 6)) + 1
    EndIf
    Next
    $arLevels[$arLevels[0][0]][0] = $strPreLevel & $arLevels[$arLevels[0][0]][0]
    $arLevels[$arLevels[0][0]][1] = $strNewName
    $strLevels &= $strNewName
    GUICtrlSetData($CBLevels, $strLevels, $strNewName)
    ReDim $arGames[2][2]
    $arGames[0][0] = 1
    $arGames[1][0] = "001"
    $arGames[1][1] = StringFormat("%081s", "0")
    GUICtrlSetData($CBGames, "001", "001")
    GameChange()
    $bLevelsChanged = True
    $bSheetChanged = True
    $bSheetSaveOK = False
    EndIf
    EndFunc ;==>ButNewLevelClick

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

    ; Button "Neues Blatt" wurde betätigt
    Func ButNewSheetClick()
    ReDim $arGames[$arGames[0][0] + 2][2]
    $arGames[0][0] += 1
    $arGames[$arGames[0][0]][1] = StringFormat("%081s", "0")
    Switch $arGames[0][0]
    Case 0
    MsgBox(4096, "", "Für diesen Level existieren keine Spiele!")
    Return
    Case 1
    GUICtrlSetData($CBGames, "|" & $arGames[1][0], $arGames[1][0])
    Case Else
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0] - 1
    $strGames &= $arGames[$iIndex][0] & "|"
    If Int($arGames[$iIndex][0]) >= Int($arGames[$arGames[0][0]][0]) Then
    $arGames[$arGames[0][0]][0] = StringFormat("%03i", Int($arGames[$iIndex][0]) + 1)
    EndIf
    Next
    $strGames &= $arGames[$arGames[0][0]][0]
    GUICtrlSetData($CBGames, "|" & $strGames, $arGames[$arGames[0][0]][0])
    EndSwitch
    GameChange()
    $bSheetSaveOK = False
    EndFunc ;==>ButNewSheetClick

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

    ; Button "Blatt löschen" wurde betätigt
    Func ButDelSheetClick()
    If MsgBox(262436, "Blatt löschen", "Soll das Blatt wirklich gelöscht werden?") = 6 Then
    $iCounter = 1
    $strGames = ""
    For $iIndex = 1 To $arGames[0][0]
    If $iIndex = $iGameIndex Then ContinueLoop
    $arGames[$iCounter][0] = StringFormat("%03i", $iCounter)
    $arGames[$iCounter][1] = $arGames[$iIndex][1]
    $strGames &= $arGames[$iCounter][0] & "|"
    $iCounter += 1
    Next
    $strGames = StringTrimRight($strGames, 1)
    GUICtrlSetData($CBGames, "|" & $strGames, StringLeft($strGames, StringInStr($strGames, "|") - 1))
    $arGames[0][0] -= 1
    ReDim $arGames[$arGames[0][0] + 1][2]
    ButSaveClick()
    EndIf
    EndFunc ;==>ButDelSheetClick

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

    ; Button "Spiel generieren" wurde betätigt
    Func ButGenerateGameClick()
    If StringChrCount($strTempGame, "0") < 81 Then
    If MsgBox(262436, "Spiel generieren", "Soll das aktuelle Blatt überschrieben werden?") = 7 Then Return
    EndIf


    EndFunc ;==>ButGenerateGameClick

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

    ; Generiert ein Spiel nach einem Algorithmus von Moritz Lenz -> http://moritz.faui2k3.org/de/yasss
    Func GenerateGame($nDifficulty, $nDeviation = 0)
    $arDLL = DllCall("Sudoku.dll", "str", "SudokuGenerate", "int", $nDifficulty, "int", $nDeviation)
    If IsArray($arDLL) Then Return SetError(0, 0, $arDLL[0])
    Return SetError(1, 0, "")
    EndFunc ;==>GenerateGame

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

    ; Button "Blatt speichern" wurde betätigt
    Func ButSaveClick()
    If $bLevelsChanged Then
    IniWriteSection($cstrIniFile, "Levels", $arLevels)
    If @error Then
    MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
    Exit
    EndIf
    $bLevelsChanged = False
    EndIf
    $strLevel = GUICtrlRead($CBLevels)
    For $iIndex = 1 To $arLevels[0][0]
    If $arLevels[$iIndex][1] == $strLevel Then ExitLoop
    Next
    IniWriteSection($cstrIniFile, $arLevels[$iIndex][0], $arGames)
    If @error Then
    MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
    Exit
    EndIf
    GameChange()
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndFunc ;==>ButSaveClick

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

    ; Button "Änderungen verwerfen" wurde betätigt
    Func ButUndoClick()
    $arGames[$iGameIndex][1] = $strTempGame
    GameChange()
    $bSheetChanged = False
    $bSheetSaveOK = False
    EndFunc ;==>ButUndoClick

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

    ; Anzahl eines Zeichens im String zählen
    Func StringChrCount($String, $char)
    StringReplace($String, $char, $char)
    Return @extended
    EndFunc ;==>StringChrCount
    #endregion ; ==> Funktionen für den Editormodus ($bGameMode = False)

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

    #endregion ; ==> Funktionen

    [/autoit]
  • weiss ist alt aber egal ^^ wollt nur mal dran errinern, in der zip ist noch die alte au3 und ned die neue ;)

    mfg