Suche Anregung für Bonus System

  • Hallo zusammen,

    ich baue mir gerade eine kleine Anwendung, die die Computer Onlinezeit meiner Kinder beobachtet (also ähnlich http://www.parents-friend.de - aber das funktioniert bei mir nicht sauber, deshalb was eigenes), jedoch überwache ich nur die Zeiten wo die Kinder online gehen dürfen. Pro Wochentag haben Sie unterschiedlich lange Onlinezeiten.

    Beispiel:

    Montags von 12:00 - 19:00 Uhr. In dieser Zeit dürfen Sie 30 Minuten an den PC. Danach fährt der PC runter (und wir Eltern sind außen vor, da das ja der PC bestimmt und nicht wir :)

    Ich möchte jetzt gerne ein Bonussystem mit einführen, d.h. wenn die Kinder z.B. beim Stausaugen geholfen haben, dann bekommen Sie 15 Bonus Minuten.

    Dazu bräuchte ich 3 Dinge (und ich vermute das ich mich dann mal mit Arrays auseinander setzen muss ....)

    1. Einen Zahlengenerator der z.B. 8 stellige Zahlen generiert, die als Quersumme z.B. 15 oder 30 ergeben
    2. Eine Funktion in Autoit, die dann die Quersumme errechnet (hier kommt vermutlich das Array zum Einsatz)
    3. Wenn die Quersumme passt, d.h. das Kind hat einen richtigen Code eingegeben (bekommt es 15 oder 30 Minuten extra Onlinezeit), dann soll dieser Code in eine ini Datei geschrieben werden (nicht schwer). Diese vielen Codes aus der ini Datei müssten dann aber bei Punkt 2 ausgelesen und verglichen werden, damit ein und der selbe Code nicht nochmals genommen wird

    Hat einer eine Idee, wie man das verwirklichen kann, bzw hat in die Richtung schon jemand was gemacht.

    Gruss Hassan

  • Punkt 1: Ich würde vllt erstmal ein Array mit 8 Indexen erstellen, dieses mit Zufällgen Zahlen füllen lassen und dann von hinten die Zahlen verößern/verkleinern, jenachdem wie das Ergebnis des Array ist ---> Das bringt uns zu Punkt 2:

    Man hat z.B. durch eine Inputbox einen Stirng bekommen der (Nach überprüfen durch StringIsInt) in ein N großes Array gesplittet wird (Durch StringSplit ($sInput, "")).
    Dann lässt du in einer For Schleife die einzelnen Werte addieren in eine Variable.

    Beispiel:

    [autoit]

    $nSumme = 0
    For $i = 0 to UBound ($aArray, 1) -1
    $nSumme += $aArray[$i]
    Next

    [/autoit]

    Zu 3: Einfach mal die Ini Funktionen in der Hilfe anschauen. Am besten eine Sektion ("Codes", "Bonus" oder so) mit Schlüsseln die sich hochzählen (von 1-n) und die Werte dann einfach der Bonuscode der eingegeben wurde.

    Gruß ;)

    PS: Wenn du dich noch nicht so gut mit Arrays auskennst (Kann sein das ich das falsch verstanden hab :rolleyes: ) schau dir mal das Tutorial von BugFix an.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Warum gerade Quersummen? Also eine Zahlenkette mit mathematischem Hintergrund? Nimm doch einfach 1000 wahllose Zahlenketten und lasse sie dir in eine Datei generieren und dann wird bei der Eingabe einfach nur geprüft ob die Kette korrekt ist und wenn sie das ist, dann wird sie aus der Datei gelöscht, damit sie nicht erneut verwendet wird.

  • Ich hab mir grad gedacht, dass ich das mal als Übung mache. Ich will dir den Code mit den Quersummen nicht vorenthalten.
    Die Ini würde ich so aufbaun:
    Codes Anzahl --> Anzahl der Codes
    Codes 0 --> 2342432423
    Codes 1 --> 3345345342

    BTW: Tolle idee ^^

    [autoit]

    Func Quersumme($Zahl)
    Local $Str = "", $i = 0, $Ret = 0
    $Str = StringSplit($Zahl, "")
    For $i = 1 To $Str[0] Step +1
    $Ret += $Str[$i]
    Next
    Return $Ret
    EndFunc

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

    Func GenerateCode()
    Local $Code = ""
    Do
    If Quersumme($Code) > 66 Then ;66 = Zielquersumme - 9
    $Code &= String(Random(0, 75 - Quersumme($Code), 1)) ;75 = Zielquersumme
    Else
    $Code &= String(Random(0, 9, 1))
    EndIf
    Until Quersumme($Code) = 75 ;75 = Zielquersumme
    Return $Code
    EndFunc

    [/autoit]

    #

    Gruß,
    Tobolobo

  • Hi,
    die Quersumme ist denkbar ungeeignet, da sämtliche Zahlendreher als "richtig eingegeben" gezählt werden.
    Ich würde eine Reihe Zahlen in eine Datei generieren und diese auf ein Blatt Papier ausdrucken, in kleine Streifen geschnitten mit einem "Bonus"-Bildchen dabei, ist das ein handfester Gutschein^^
    Dann haben die Kinder die Belohnung auch "in der Hand" und könne sie einsetzen wann sie wollen....und auch gegenseitig tauschen :D

  • Hallo zusammen,

    erst mal vielen Dank für die vielen konstruktiven Vorschläge. Wie in meinem ersten Post schon erwähnt, habe ich von Arrays technisch noch gar keinen Plan. Ich werde mich also mal auf die Suche nach dem Tutotial von Bugfix machen :)

    Die Idee einfach eine Datei befüllen zu lassen, diese auszudrucken und die Schnipsel den Kiddies zu geben, hatte ich auch. Die "handfeste" Belohnung macht es ja aus.

    Damit ich das ungefähr richtig verstehe.

    1. Ich muss via Schleife eine x-stelligen Zufallscode erzeugen und diesen in eine Fileschreiben, dann neue Zeile und alles wieder von Vorne, bis Schleife zu Ende ist.
    2. File ausdrucken (das bekomme ich 100% hin - auch ohne Array :rofl:
    3. Nach Eingabe eines Codes in eine Inputbox muss diese Variable mit dem Inhalt der Datei verglichen werden (vermutlich wieder mit Array und Schleifen ...)
    4. Wenn der Code dann vorhanden ist, wird der Bonus gewährt, und der Code aus dem File gelöscht, damit er beim nächsten Vergleich fehl schlägt und der Bonus mit der "alten" Nummer dann nicht mehr gewährt wird.

    Ohjeee, da habe ich mir ja was aufgehalst. Das wird eine ganze Weile dauern, bis ich da durchblicke

    Gruss Hassan

    • Offizieller Beitrag

    Ich hatte mal eine Funktion zum generieren von Seriennummern geschrieben. Dabei werden keine doppelten Nummern generiert.
    Und es wird außerdem eine Datei mit den MD5-Checksummen erzeugt, die man dann auf dem Zielcomputer zum vergleichen verwenden kann.

    Hier die Funktion:

    Spoiler anzeigen
    [autoit]


    #include <Crypt.au3>
    _GenSerials(1000, @ScriptDir & '\_Nummern.txt', @ScriptDir & '\_MD5Checksummen.txt')
    ;~ If @error Then MsgBox(0, 'Fehler aufgetreten!', 'Fehlernummer: ' & @error)

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

    #cs
    ======================================================================================================================
    Function Name: _GenSerials($iCount, $sSerialFile, $sMD5File)
    Description: Seriennummern nach folgendem Muster "AAAA-BBBB-CCCC-DDDD-EEEE" generieren (keine Doppelten)
    Parameter(s): $iCount = Anzahl der Seriennummern
    $sSerialFile = Datei, in der die Seriennummern gespeichert werden
    $sMD5File = Datei, in der die MD5-Hashwerte gespeichert werden
    Author(s): Oscar (http://www.autoit.de)
    ======================================================================================================================
    #ce
    Func _GenSerials($iCount, $sSerialFile, $sMD5File)
    If $iCount < 1 Or Not IsNumber($iCount) Then Return SetError(1, 0, 0)
    Local $hFile1 = FileOpen($sSerialFile, 2)
    Local $hFile2 = FileOpen($sMD5File, 2)
    If $hFile1 <> -1 And $hFile2 <> -1 Then
    Local $sSerialOut = '', $sMD5Out = ''
    For $i = 1 To $iCount
    ToolTip('Generiere Seriennummer: ' & $i, @DesktopWidth/2-100, 0)
    Do
    Local $sTmp = ''
    For $j = 1 To 20
    $sTmp &= StringMid('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890', Random(1, 36, 1), 1)
    If $j/4 = Int($j/4) And $j < 20 Then $sTmp &= '-'
    Next
    Until Not StringInStr($sSerialOut, $sTmp)
    $sSerialOut &= $sTmp & @CRLF
    $sMD5Out &= _Crypt_HashData($sTmp, $CALG_MD5) & @CRLF
    Next
    FileWrite($hFile1, StringTrimRight($sSerialOut, 2))
    FileClose($hFile1)
    FileWrite($hFile2, StringTrimRight($sMD5Out, 2))
    FileClose($hFile2)
    Return 1
    Else
    Return SetError(2, 0, 0)
    EndIf
    EndFunc

    [/autoit]
  • Also, hier mal ein Beispiel zur Code-Erzeugung:

    [autoit]


    $iDezimalstellen = 10
    $iCodes = 15
    $sDatei = "codes.txt"

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

    $hDatei = FileOpen($sDatei,1)
    For $iDurchlauf = 1 To $iCodes
    $iCode = ""
    For $i = 1 To $iDezimalstellen
    $iCode &= Random(0,9,1)
    Next
    FileWrite($hDatei,$iCode & @CRLF)
    Next
    FileClose($hDatei)

    [/autoit]

    Und hier dann, um die Codes zu überprüfen:

    [autoit]


    #include <File.au3>

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

    $sDatei = "codes.txt"
    $sCode = InputBox("Code-Überprüfung","Dein Code:")
    $fGueltig = False

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

    Dim $asCodes

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

    _FileReadToArray($sDatei,$asCodes)
    For $i = 1 To $asCodes[0] ;> [0] enthält die Anzahl der Zeilen von codes.txt
    If $sCode = $asCodes[$i] Then
    $fGueltig = True
    _FileWriteToLine($sDatei,$i,"",1) ;Zeile löschen
    ExitLoop
    EndIf
    Next

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

    If $fGueltig = False Then
    MsgBox(16,"","Der Code stimmt leider nicht überein!")
    Exit
    EndIf

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

    MsgBox(0,"","Der Code war richtig!")

    [/autoit]

    Das soll jetzt nur ein Beispiel sein. Wenn du mit etwas nicht klarkommst/etwas nicht verstehst, dann sag bescheid. ;)

    Aber was das Thema jetzt allgemein angeht... wie alt sind deine Kinder? Ich war nämlich mit 10 Jahren schon so weit, den Prozess von meinem Überwachungsprogramm zu killen. ;)

    lg chess

  • Dann versteckt man die Datei einfach :D
    Namen einer Windows .exe um 1 Buchstaben oder so Verändern, z. B. Service.exe.

    BTW: Ich hab einfach mal an dem Oberen von mir weitergearbeitet und nen ganzen Code gemacht. Kannst dir ja mal anschaun.

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>

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

    ClipPut(GenerateCode())

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

    #NoTrayIcon

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

    $dll = DllOpen("user32.dll")

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

    Dim $Delay = 30 * 60000

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

    $Timer = TimerInit()

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

    Do
    If _IsPressed(61, $dll) = True Then
    $Input = InputBox("Code", "Code eingeben:")
    If $Input <> "" Then
    If TestCode($Input) = True Then
    $Count = IniRead("Codes.ini", "Codes", "Anzahl","0")
    $Bool = False
    For $i = 1 To Number($Count) Step + 1
    If IniRead("Codes.ini", "Codes", String($i), "") = $Input Then
    $Bool = True
    EndIf
    Next
    If $Bool = False Then
    MsgBox(64, "Erfolg", "Code aktiviert!")
    $Read = IniRead("Codes.ini", "Codes", "Anzahl","0")
    IniWrite("Codes.ini", "Codes", "Anzahl", Number($Read) + 1)
    IniWrite("Codes.ini", "Codes", Number($Read) + 1, $Input)
    $Delay += 15 * 60000
    Else
    MsgBox(16, "Code", "Falscher Code!")
    EndIf
    Else
    MsgBox(16, "Code", "Falscher Code!")
    EndIf
    Else
    MsgBox(16, "Code", "Kein Code eingegeben!")
    EndIf
    ElseIf _IsPressed(62, $dll) = True Then
    ClipPut(GenerateCode())
    EndIf
    ToolTip(TimerDiff($Timer) & @CRLF & $Delay)
    Sleep(100)
    Until TimerDiff($Timer) > $Delay

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

    MsgBox(64, "Zeit", "Zeit ist vorüber!")

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

    DllClose($dll)

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

    Func Quersumme($Zahl)
    Local $Str = "", $i = 0, $Ret = 0
    $Str = StringSplit($Zahl, "")
    For $i = 1 To $Str[0] Step +1
    $Ret += $Str[$i]
    Next
    Return $Ret
    EndFunc

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

    Func TestCode($Code)
    Local $Str = "", $i = 0, $Ret = 0
    $Str = StringSplit($Code, "")
    For $i = 1 To $Str[0] - 2 Step +1
    $Ret += $Str[$i]
    Next
    If $Ret = StringRight($Code, 2) Then
    Return True
    Else
    Return False
    EndIf
    EndFunc

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

    Func GenerateCode()
    Local $Code = "", $Quersumme = 0
    $Quersumme = Random(50, 99, 1)
    If Mod($Quersumme, 2) = 1 Then
    $Quersumme -= 1
    EndIf
    Do
    If Quersumme($Code) > $Quersumme - 9 Then
    $Code &= String(Random(0, $Quersumme - Quersumme($Code), 1))
    Else
    $Code &= String(Random(0, 9, 1))
    EndIf
    Until Quersumme($Code) = $Quersumme
    $Code &= $Quersumme
    Return $Code
    EndFunc

    [/autoit]
  • Wow da ich ja was losgetreten :)

    vielen Dank nochmals an alle.

    Ich muss mich jetzt erst mal mit Eurer Materie auseinander setzen (das wird ein wenig dauern)

    und BTW: Die Tochter ist gerade mal 7 Jahre und hat eigentlich noch gar kein richtiges Interesse am Computer. Ab und zu mal Sandmaennchen.de oder https://autoit.de/www.die-maus.de
    Wir wollen ja nur das der Computer entscheidet, wann Schluss ist.

    Ich halt Euch auf dem Laufenden, für was ich mich entschieden habe, wird aber vermutlich einige Zeit dauern, da ich gerade etwas Land unter bin ..

    Gruss Hassan

  • Ich will dich hier jetzt nicht in deinem Eifer bremsen, aber warum installierst du auf dem PC nicht einfach ein Kinderschutzprogramm? Eine Funktion, um die PC Nutzung zeitlich einzuschränken, gehört ja zu Standartausstattung eines solchen Programms. Auch ein Belohnungssystem ist meistens mit dabei. Und ganz nebenbei wird deine Tochter noch vor ungeeigneten Internetseiten geschützt.

  • Ich will dich hier jetzt nicht in deinem Eifer bremsen, aber warum installierst du auf dem PC nicht einfach ein Kinderschutzprogramm? Eine Funktion, um die PC Nutzung zeitlich einzuschränken, gehört ja zu Standartausstattung eines solchen Programms. Auch ein Belohnungssystem ist meistens mit dabei. Und ganz nebenbei wird deine Tochter noch vor ungeeigneten Internetseiten geschützt.

    Ganz einfach.

    1.) Die meisten Programme funktionieren nicht so, wie Sie es versprechen
    2.) Ich will mich ja in Autoit weiterentwickeln, von daher finde ich das ein schönes kleines Projekt, was auch noch einen Nutzen für mich hat
    3.) Die Internetseitekontrolle passiert an 2 anderen Stellen.

    Gruss Hassan

  • Ich würde die Schlüssel einfach verschlüsselt in eine Datei schreiben und dann mit dieser arbeiten, das ist einfach und mit Abstand sicher genug für ein 7 jähriges Kind.

    MfG, James

    Beispiel
    [autoit]

    #include <String.au3>

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

    ;~ GenerateKeyFile(100, "123456", @ScriptDir & "\backup-07132012.dll")

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

    If UseKeyFile("ABCD-EFGH-IJKL-MNOP", "123456", @ScriptDir & "\backup-07132012.dll") Then
    MsgBox(64, "", "Der Code 'ABCD-EFGH-IJKL-MNOP' wurde aktiviert!")
    Else
    MsgBox(16, "", "Der Code 'ABCD-EFGH-IJKL-MNOP' wurde nicht gefunden!" & @CRLF & "Bitte überprüfe deine Eingabe und versuche es erneut.")
    EndIf

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

    Func GenerateKeyFile($nKeys, $Password, $Filename)
    Local $Data = "", $i, $File
    For $i = 1 To $nKeys
    $Data &= "<" & RandomKey() & ">"
    Next
    $Data = _StringEncrypt(1, $Data, $Password)
    $File = FileOpen($Filename, 2)
    FileWrite($File, $Data)
    FileClose($File)
    EndFunc
    Func RandomKey()
    Local $Key = "", $i, $j
    For $i = 1 To 4
    For $j = 1 To 4
    $Key &= Chr(Random(65, 90, 1))
    Next
    If ($i <> 4) Then $Key &= "-"
    Next
    Return $Key
    EndFunc
    Func UseKeyFile($Key, $Password, $Filename)
    Local $File, $Data
    $File = FileOpen($Filename)
    $Data = FileRead($File)
    FileClose($File)
    $Data = _StringEncrypt(0, $Data, $Password)
    If (StringInStr($Data, "<" & $Key & ">") > 0) Then
    $Data = StringReplace($Data, "<" & $Key & ">", "")
    $Data = _StringEncrypt(1, $Data, $Password)
    $File = FileOpen($Filename, 2)
    FileWrite($File, $Data)
    FileClose($File)
    Return True
    Else
    Return False
    EndIf
    EndFunc

    [/autoit]