- Offizieller Beitrag
Der Glückstester von "nof@ker2" brachte mich auf die Idee auch mal so ein statistisches Lottoprogramm zu schreiben.
Man kann 6 Zahlen eingeben und auswählen bei welchem Gewinn (3, 4, 5 oder 6 Richtige) das Programm abbrechen soll (Achtung! 6 Richtige dauert u.U. sehr lange!). Mit der [ESC]-Taste kann man den Vorgang abbrechen.
Es werden am Schluß die Anzahl der Ziehungen, sowie die benötigte Zeit angezeigt. Während das Script läuft, wird ebenfalls die Anzahl der Ziehungen angezeigt. Um aber nicht die gesamte Rechenzeit für die Aktualisierung der Anzeige aufzubrauchen, wird nur alle 500 Ziehungen die Anzeige aktualisiert.
Spoiler anzeigen
#include <ComboConstants.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
Opt('GUIOnEventMode', 1)
Global $aLottoNum[49], $timer, $bBreak = False
For $i = 1 To 49
$aLottoNum[$i - 1] = $i
Next
GUICreate('Lottogewinn 6 aus 49', 510, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
GUISetBkColor(0xaaaaaa)
HotKeySet('{ESC}', '_Break')
Global $ahCheck[49]
For $i = 0 To 48
$ahCheck[$i] = GUICtrlCreateCheckbox($i + 1, 20 + Mod($i, 7) * 70, 10 + Int($i / 7) * 30, 60, 25)
GUICtrlSetOnEvent(-1, '_CheckboxCounter')
Next
$hMatch = GUICtrlCreateCombo('3 Richtige', 10, 240, 75, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, '4 Richtige|5 Richtige|6 Richtige', '5 Richtige')
GUICtrlSetTip(-1, 'Abbruchbedingung auswählen!')
$hStart = GUICtrlCreateButton('Start', 90, 240, 50, 20)
GUICtrlSetOnEvent(-1, '_Start')
GUICtrlSetState($hStart, $GUI_DISABLE)
GUICtrlCreateLabel('Anzahl der Ziehungen:', 150, 242, 130, 25)
GUICtrlSetFont(-1, 10, 400)
$hDrawCount = GUICtrlCreateLabel('0', 285, 242, 100, 25)
GUICtrlSetFont(-1, 10, 400)
$hStatus = GUICtrlCreateLabel(' 6 Zahlen auswählen!', 0, 280, 510, 20)
GUICtrlSetBkColor(-1, 0xeeeeee)
GUICtrlSetFont(-1, 12, 400)
GUISetState()
While True
Sleep(10)
WEnd
Func _End()
Exit
EndFunc ;==>_End
Func _Break()
$bBreak = True
EndFunc ;==>_Break
Func _Start()
Local $aTip[6], $iCount = 0, $aDraw, $iWin = StringLeft(GUICtrlRead($hMatch), 1)
GUICtrlSetState($hMatch, $GUI_DISABLE)
GUICtrlSetState($hStart, $GUI_DISABLE)
For $i = 0 To 48
If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED) Then
$aTip[$iCount] = $i + 1
$iCount += 1
EndIf
Next
$iCount = 0
GUICtrlSetData($hStatus, ' Bitte warten...')
$timer = TimerInit()
AdlibEnable('_DisplayTimer', 1000)
Do
$iCount += 1
If $iCount / 500 = Int($iCount / 500) Then GUICtrlSetData($hDrawCount, $iCount)
$aDraw = _Lottodraw()
Until _Win($aTip, $aDraw, $iWin) Or $bBreak
If Not $bBreak Then
GUICtrlSetData($hStatus, ' Gewonnen!')
MsgBox(0, 'Lottogewinn', 'Hurra, ' & $iWin & ' Richtige!' & @CRLF & 'Anzahl der Ziehungen: ' _
& $iCount & @CRLF & 'Benötigte Zeit: ' & Round(TimerDiff($timer) / 1000, 3) & ' sek.')
EndIf
$bBreak = False
GUICtrlSetData($hDrawCount, '0')
GUICtrlSetData($hStatus, ' Start-Button anklicken!')
GUICtrlSetState($hMatch, $GUI_ENABLE)
GUICtrlSetState($hStart, $GUI_ENABLE)
AdlibDisable()
EndFunc ;==>_Start
Func _DisplayTimer()
GUICtrlSetData($hStatus, ' Bitte warten... Benötigte Zeit: ' & Int(TimerDiff($timer) / 1000) & ' sek.')
EndFunc ;==>_DisplayTimer
Func _Lottodraw()
Local $aTmp = $aLottoNum, $aDraw[6], $iTmp
For $i = 0 To 5
$iRandom = Random(0, 48 - $i, 1)
$aDraw[$i] = $aTmp[$iRandom]
$aTmp[$iRandom] = $aTmp[48 - $i]
Next
_ArraySort($aDraw)
Return $aDraw
EndFunc ;==>_Lottodraw
Func _Win($aTip, $aDraw, $iWin)
Local $iCount = 0
For $i = 0 To 5
If $aTip[$i] = $aDraw[$i] Then $iCount += 1
Next
Return $iCount >= $iWin
EndFunc ;==>_Win
Func _CheckboxCounter()
Local $iCount = 0
For $i = 0 To 48
$iCount += BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED)
Next
GUICtrlSetData($hStatus, ' ' & 6 - $iCount & ' Zahlen auswählen!')
If $iCount = 6 Then
_CheckboxState($GUI_DISABLE)
GUICtrlSetState($hStart, $GUI_ENABLE)
GUICtrlSetData($hStatus, ' Start-Button anklicken!')
Else
_CheckboxState($GUI_ENABLE)
GUICtrlSetState($hStart, $GUI_DISABLE)
EndIf
EndFunc ;==>_CheckboxCounter
Func _CheckboxState($State)
For $i = 0 To 48
If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_UNCHECKED) Then GUICtrlSetState($ahCheck[$i], $State)
Next
EndFunc ;==>_CheckboxState