Hallo Dustin,
da ich die erste bin, die das ließt, Zeitverschiebung beantrag auf 17:00 Uhr.
LG Lina
Hallo Dustin,
da ich die erste bin, die das ließt, Zeitverschiebung beantrag auf 17:00 Uhr.
LG Lina
Hallo!
Ich habe jetzt mal die beiden Programmteile zusammengefügt!
; ----------------------------------------------------------------------------
;
; 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
#region Includes
#include <GUIConstants.au3>
#Include <GuiStatusBar.au3>
#endregion
#region AutoItSetOptions
Opt("GUIOnEventMode", 1)
#endregion
#region Konstantendefinitionen
Const $ciTop = 40
Const $ciLeft = 20
Const $cstrIniFile = @ScriptDir & "\Sudoku.ini"
#endregion
#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
Global $bGameMode = True ; True = Spielmodus, False = Editormodus
[/autoit] [autoit][/autoit] [autoit]Local $arPartsWidth[2] = [ 55, -1 ]
Local $arPartsText[2] = [ "Let's go!", "" ]
#endregion
#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
#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
#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
#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
#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
#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
$StatusBar = _GUICtrlStatusBarCreate ($FrmMain, $arPartsWidth, $arPartsText)
#endregion
GUISetState(@SW_SHOW)
#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
#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
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
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
#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
Func FormMainMaximize()
EndFunc ;==>FormMainMaximize
Func FormMainMinimize()
EndFunc ;==>FormMainMinimize
Func FormMainRestore()
EndFunc ;==>FormMainRestore
#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
; 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
; 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
; 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
; 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
#region Funktionen für den Spielmodus ($bGameMode = True)
Func ButRestartClick()
GameChange()
EndFunc ;==>ButRestartClick
#endregion
#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
; 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)
[/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
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")
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
; 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
; 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)
[/autoit] [autoit][/autoit] [autoit]For $iIndex = 1 To $arLevels[0][0]
If $arLevels[$iIndex][1] == $strLevel Then ExitLoop
Next
IniWriteSection($cstrIniFile, $arLevels[$iIndex][0], $arGames)
[/autoit] [autoit][/autoit] [autoit]If @error Then
MsgBox(4096, "", "Fehler beim lesen der Ini-Datei!")
Exit
EndIf
GameChange()
$bSheetChanged = False
$bSheetSaveOK = False
EndFunc ;==>ButSaveClick
; Button "Änderungen verwerfen" wurde betätigt
Func ButUndoClick()
$arGames[$iGameIndex][1] = $strTempGame
GameChange()
$bSheetChanged = False
$bSheetSaveOK = False
EndFunc ;==>ButUndoClick
; Anzahl eines Zeichens im String zählen
Func StringChrCount($String, $char)
StringReplace($String,$char,$char)
Return @extended
EndFunc
#endregion
#endregion
Edit: Dateianhang entfernt -> veraltet
Hallo Bernd670.
Da kann ich nur eines zu sagen: BESTE LEISTUNG !!!
LG Lina
Woi , respekt!
Hätte nicht gedacht, dass das so n großes script wird *g*
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
Vllt kannst du auch hier was entnehmen:
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)
; ----------------------------------------------------------------------------
;
; 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
#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
#region Includes
#include <GUIConstants.au3>
#Include <GuiStatusBar.au3>
#endregion ; ==> Includes
#region AutoItSetOptions
Opt("GUIOnEventMode", 1)
#endregion ; ==> AutoItSetOptions
#region Konstantendefinitionen
Const $ciTop = 40
Const $ciLeft = 20
Const $cstrIniFile = @ScriptDir & "\Sudoku.ini"
#endregion ; ==> Konstantendefinitionen
#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
#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)
#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)
#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
#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)
#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)
#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)
$StatusBar = _GUICtrlStatusBarCreate($FrmMain, $arPartsWidth, $arPartsText)
#endregion ; ==> GUI-Erstellung
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
#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) + / 9) ][Int(Mod(StringMid($CGF, 5) + 8, 9)) ], $GUI_FOCUS)
EndIf
EndIf
EndIf
Sleep(80)
WEnd
#endregion ; ==> Hauptschleife
#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
Func FormMainMaximize()
EndFunc ;==>FormMainMaximize
Func FormMainMinimize()
EndFunc ;==>FormMainMinimize
Func FormMainRestore()
EndFunc ;==>FormMainRestore
#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
; 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
; 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
; 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
; 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
#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
; 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
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
$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
Func ButRestartClick()
GameChange()
EndFunc ;==>ButRestartClick
#endregion ; ==> Funktionen für den Spielmodus ($bGameMode = True)
#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
; 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
; 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
; 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
; 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
; Button "Änderungen verwerfen" wurde betätigt
Func ButUndoClick()
$arGames[$iGameIndex][1] = $strTempGame
GameChange()
$bSheetChanged = False
$bSheetSaveOK = False
EndFunc ;==>ButUndoClick
; 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)
#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]
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!
; ----------------------------------------------------------------------------
;
; 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
#region FileInstall
FileInstall(".\Sudoku.dll", @ScriptDir & "\Sudoku.dll", 0)
#endregion ; ==> FileInstall
#region Includes
#include <GUIConstants.au3>
#Include <GuiStatusBar.au3>
#endregion ; ==> Includes
#region AutoItSetOptions
Opt("GUIOnEventMode", 1)
#endregion ; ==> AutoItSetOptions
#region Konstantendefinitionen
Const $ciTop = 40
Const $ciLeft = 20
Const $cstrIniFile = @ScriptDir & "\Sudoku.ini"
#endregion ; ==> Konstantendefinitionen
#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
#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)
#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)
#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
#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)
#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)
#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)
$StatusBar = _GUICtrlStatusBar_Create($FrmMain, $arPartsWidth, $arPartsText)
#endregion ; ==> GUI-Erstellung
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
#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) + / 9) ][Int(Mod(StringMid($CGF, 5) + 8, 9)) ], $GUI_FOCUS)
EndIf
EndIf
EndIf
Sleep(80)
WEnd
#endregion ; ==> Hauptschleife
#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
Func FormMainMaximize()
EndFunc ;==>FormMainMaximize
Func FormMainMinimize()
EndFunc ;==>FormMainMinimize
Func FormMainRestore()
EndFunc ;==>FormMainRestore
#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
; 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
; 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
; 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
; 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
#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
$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
Func ButRestartClick()
GameChange()
EndFunc ;==>ButRestartClick
#endregion ; ==> Funktionen für den Spielmodus ($bGameMode = True)
#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
; 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
; 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
; 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
; 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
; 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
; 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
; Button "Änderungen verwerfen" wurde betätigt
Func ButUndoClick()
$arGames[$iGameIndex][1] = $strTempGame
GameChange()
$bSheetChanged = False
$bSheetSaveOK = False
EndFunc ;==>ButUndoClick
; 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)
#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