Random zugehörigkeit

  • Heyho,
    also mein Projekt grad ist, ein Quiz zu erstellen (was für ein was ich noch nicht) und normal is das ja kein Problem.. also GUI und
    den Rest hab ich... aber da ich Faul bin und das ganze übersichtlich halten will, will ich die Fragen als Array machen.

    Ich Schreib mal ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include "GUIConstants.au3" ;Fragt nicht wegen den ganzen Includes^^ ich hab einfach mal reingehauen
    #include "Constants.au3" ;wo ich denke das ichs brauch
    #include "ButtonConstants.au3"
    #include "GuiConstantsEx.au3"
    #include "Array.au3"

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

    Local $Array[2] ;Hier stehen die Fragen drin.. Wie bringe ich die Antwort unter??
    $Array[0] = "Wecher Befehl erstellt ein Graphical User Interface"
    $Array[1] = "Welcher Befehl Zerteilt Strings"

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

    HauptFunktion()
    Func HauptFunktion()
    $StartGUI = GUICreate("AutoIt Quiz",120,140,500,300)
    $SchwierigkeitsGruppe = GUICtrlCreateGroup("Schwierigkeitsgrad",5,5,110,90)
    $GUIRadioNoob = GUICtrlCreateRadio("B00n-Level",15,25,70,20)
    $GUIRadioPro = GUICtrlCreateRadio("Pro-Level",15,45,70,20)
    $GUIRadioBugfix = GUICtrlCreateRadio("BugFixes",15,65,70,20)
    $StartButton = GUICtrlCreateButton("Quiz",27,100,60,30)
    GUISetState()

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $StartButton ;RadioButton abfrage. Wie geht das?
    GUIDelete($StartGUI)
    StartQuizBoon()
    EndSwitch
    WEnd
    EndFunc

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

    Func StartQuizBoon()
    $FrageGUI = GUICreate("Frage",300,120,300,300)
    $FrageRandom = GUICtrlCreateLabel("Frage:",5,5,30,20) ;Hinter Frage: soll eine Random Frage aus dem Array oben stehen
    $AntwortInput = GUICtrlCreateInput("",5,50,290,20)
    $WeiterButton = GUICtrlCreateButton("Weiter >>",230,80,60,30)
    $PunkteLabel = GUICtrlCreateLabel("Deine Punkte:",5,85,100,30)
    GUICtrlSetFont($PunkteLabel,12,500,0,"Comic Sans MS"); Wie lasse ich ihn, Punkte dazu zählen?
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case ; Hier soll dieser Syntax rein: Wenn Antwort zu Frage gehört, dann nächste Frage in diesem GUI
    EndSwitch
    WEnd
    EndFunc

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

    ;Hier würden dann die Funktionen für Pro und BugFix kommen

    [/autoit]

    Ich hoffe das ihr das versteht ^^ bin grad echt aufgeschmissen...

  • Ist jetzt zwar nicht die Antwort auf deine Frage, aber Radiobuttonabfragen habe ich mit Select gelöst, also

    [autoit]

    Select
    Case GUICtrlRead($GUIRadioNoob) = 1
    ;bla bla
    Case GUICtrlRead($GUIRadioPro) = 1
    ;bla bla
    EndSelect

    [/autoit]

    Nebenbei würde ich vielleicht einen Standartbutton angeben, welcher dann schon selected ist.
    GUICtrlSetState($GUIRadioNoob, $GUI_CHECKED)

    Mit 2D Arrays kann ich leider nicht helfen

  • Hallo,
    Wenn dir 2-dimensionale Arrays "zu schwer" sind, dann kannst du auch mit einem eindimensionalen Array glücklich werden

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    dim $array[10]

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

    for $i=0 to ubound($array)-2 step 2
    $array[$i]="Frage"&$i/2
    $array[$i+1]="Antwort"&$i/2
    next
    _arraydisplay($array)

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

    $random=random(0,(ubound($array)-1)/2,1)*2 ;gerade Zahlen sind die Fragen

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

    $antwort=" nicht"
    if stringinstr(inputbox("Quiz","Bitte beantworten Sie die folgende Frage:"&@crlf&$array[$random],""),$array[$random+1]) then $antwort=""
    msgbox(0,0,"Ihre Antwort ist"&$antwort&" richtig!")

    [/autoit]
  • Zitat

    Hallo,
    Wenn dir 2-dimensionale Arrays "zu schwer" sind, dann kannst du auch mit einem eindimensionalen Array glücklich werden

    Das ist eher der falsche Ansatz, wenn man etwas nicht kann sollte man versuchen sich damit zu beschäftigen und gerade mehrdimensionale Arrays sind lebenswichtig, frag mal den King of Array-->BugFix^^

    Natürlich ist es nie schlecht Alternativen zu kennen aber sowas gehört schon fast zu den Grundlagen würde ich sagen ;)

    @razor
    Mit der Hilfe und dem Tut von BugFix (gibts das noch?) kann man das sehr einfach verstehen wie es funktioniert :)

    //EDIT
    Ja das Tutorial gibts noch: http://www.bug-fix.info/array_tut.htm

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Okay, danke... ich probier mal ob ich das Tut blick, wenn nicht dann melde ich mich nochmal^^ danke für die schnelle antwort
    usw...

  • Also das mit den 2D Array war ne super Idee und checken tu ich eig auch muss nur ein bissel mein Hirn anstrengen ;)

    Meine andere Frage war aber wie ich das mit den Punkten mach

    Spoiler anzeigen
    [autoit]

    Func StartQuizBoon()
    $FrageGUI = GUICreate("Frage",300,120,300,300); Hier sollte nach möglichkeit die Nummer der Frage(also wie viele schon beantwortet wurden) stehen
    $FrageRandom = GUICtrlCreateLabel("Frage:",5,5,30,20)
    $AntwortInput = GUICtrlCreateInput("",5,50,290,20)
    $WeiterButton = GUICtrlCreateButton("Weiter >>",230,80,60,30)
    $PunkteLabel = GUICtrlCreateLabel("Deine Punkte:",5,85,100,30); Wie lasse ich ihn, Punkte dazu zählen?
    GUICtrlSetFont($PunkteLabel,12,500,0,"Comic Sans MS")
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd
    EndFunc

    [/autoit]
  • FireFlyer

    Zitat

    Das ist eher der falsche Ansatz, wenn man etwas nicht kann sollte man versuchen sich damit zu beschäftigen


    Schreib das als Antwort unter jeden der "Leg mir mal einer den Arm aus der Sonne"-Threads hier im Forum!
    Fakt ist, daß die Tutorials nur von denen gelesen werden, die sowieso schon wissen um was es geht. Ansonsten wären ca 80% der Fragen hier im Forum überflüssig!
    Was ich nicht nachvollziehen kann, ist

    Zitat

    und gerade mehrdimensionale Arrays sind lebenswichtig

    Ich kenne Leute die mehrere hundertausend Euro im Jahr verdienen (u.A. auch in der IT) ohne ein einziges Mal in ihrer Laufbahn mit mehrdimensionalen Arrays zu tun gehabt haben. Also kanns soooo wichtig ja nicht sein ;)
    Aber du hast schon recht, ein zweidimensionales Array bietet sich im vorliegenden Fall an :rolleyes:
    Man hätte die Fragen und Antworten auch in eine Zeile einer Datei schreiben können und von dort mit "simplen" Stringfunktionen verarbeiten können ohne überhaupt irgend ein Array zu verwenden....
    ciao
    Andy

  • Zitat

    Meine andere Frage war aber wie ich das mit den Punkten mach


    Jedes Mal, wenn eine Antwort gegeben wird, erhöhst du die Variable $Anzahl_Antworten um eins. Genau so machst du es bei richtigen Antworten mit der Variable $Anzahl_Richtige_Antworten. Diese beiden Variablen musst du dann nur noch mit guictrlsetdata() in deine GUI schreiben.

  • @razor09
    ggf solltest du dir wirklich mal Gedanken machen, ob die Fragen und Antworten nicht in einer Textdatei viel besser aufgehoben wären.
    Diese Textdatei könntest du mit Notepad bearbeiten, die Fragen/Antworten ändern, ergänzen oder erweitern und brauchst nicht immer den Compiler anzuwerfen um nur eine simple Frage hinzuzufügen.

    • Offizieller Beitrag

    Du kannst es auch mit einer INI machen und dann in einem Rutsch alle Fragen/Antworten eines Levels in ein Array einlesen (IniReadSection).
    Bsp. für INI:

  • Also das mit der Ini check ich nicht...

    Hab sie so gemacht wie du gesagt hast, aber er sagt mir, das keine Inidatei vorhanden ist (hab sie im selben verzeichnis)

    hab es auch schon mit

    [autoit]

    IniReadSection(@ScriptDir"Fragen.ini","LevelNoob")

    [/autoit]


    und mit

    [autoit]

    IniReadSection("Fragen.ini","LevelNoob")

    [/autoit]


    probiert und immer kam fehler, das die nicht existiert

  • Bei solchen sachen sich immer mal wieder den Pfad mit ner MsgBox anschaun
    Nehmen wir mal an dein @ScriptDir ist C:\Programme
    Du schreibst also @ScriptDir&"fragen.ini", was passiert also: C:\Programmefragen.ini

    Demnach
    @ScriptDir&"\fragen.ini" --> C:\Programme\fragen.ini

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Zitat

    Bei solchen sachen sich immer mal wieder den Pfad mit ner MsgBox anschaun


    Oder in einem "Tutorial" nachlesen wie man selbst diese kleinen Fehler findet, freundlicherweise vom Cheffe sogar gepinnt...
    Tutorial zur Fehlersuche

  • @ Fireflyer ok danke für die info ich glaub zwar das iuch das auch schon gemaht hab aber ich probiers trotzdem nochmal
    BugFix könntest du mir ein beispiel sagen, wie ich dn text dann in die GUI bekomm und abfragen kann?

    • Offizieller Beitrag

    Hi,
    hab mal im Bsp. eine Combo verwendet. Kannst du ja umbauen, wie du möchtest.

    [autoit]

    #Include <SendMessage.au3>
    Global $INI = @ScriptDir & '\fragen.ini'
    Global $arLevel1 = IniReadSection($INI, 'level1') ; in [n][0] sind Fragen, in [n][1] die zugehörigen Antworten
    Global $arLevel2 = IniReadSection($INI, 'level2')
    Global $arLevel3 = IniReadSection($INI, 'level3')
    Global $msg, $gui, $bt1, $bt2, $bt3, $bt4, $combo, $current

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

    Global Const $CB_ADDSTRING = 0x143
    Global Const $CB_GETCURSEL = 0x147
    Global Const $CB_SETCURSEL = 0x14E
    Global Const $CB_RESETCONTENT = 0x14B

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

    $gui = GUICreate('Test')
    $bt1 = GUICtrlCreateButton('Level 1', 20, 20, 100)
    $bt2 = GUICtrlCreateButton('Level 2', 140, 20, 100)
    $bt3 = GUICtrlCreateButton('Level 3', 260, 20, 100)
    $combo = GUICtrlCreateCombo('', 20, 60)
    $bt4 = GUICtrlCreateButton('Zeige Antwort', 20, 100, 100)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    Case $bt1
    _FillCombo($arLevel1, $combo)
    $current = 1
    Case $bt2
    _FillCombo($arLevel2, $combo)
    $current = 2
    Case $bt3
    _FillCombo($arLevel3, $combo)
    $current = 3
    Case $bt4
    MsgBox(0, 'Antwort', _GetAnswer() )
    EndSwitch
    WEnd

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

    Func _FillCombo($ARRAY, $IDcombo)
    Local $struc, $hWnd = GUICtrlGetHandle($IDcombo)
    _SendMessage($hWnd, $CB_RESETCONTENT)
    For $i = 1 To UBound($ARRAY) -1 ; du kannst natürlich auch GuiCtrlSetData verwenden ;=)
    $struc = DllStructCreate('char [' & StringLen($ARRAY[$i][0])+1 & ']')
    DllStructSetData($struc, 1, $ARRAY[$i][0])
    _SendMessage($hWnd, $CB_ADDSTRING, 0, DllStructGetPtr($struc))
    Next
    _SendMessage($hWnd, $CB_SETCURSEL)
    EndFunc

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

    Func _GetAnswer()
    Local $indx = _SendMessage(GUICtrlGetHandle($combo), $CB_GETCURSEL)
    Switch $current
    Case 1
    Return $arLevel1[$indx+1][1]
    Case 2
    Return $arLevel2[$indx+1][1]
    Case 3
    Return $arLevel3[$indx+1][1]
    EndSwitch
    EndFunc

    [/autoit]
  • Also thx für eure Hilfe... habs jetz hin bekommen. Werde es mit einem 2D Array machen, das ich mit include einfüge, so kann ichs immer veränderen einfach..

    Damit wären meine Fragen beantwortet