Bilder-Quiz in VB für Kinder

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von 0ptix.

    Bilder-Quiz in VB für Kinder

    Hallo zusammen,

    also, es geht um folgendes: Für unsere Kleine möchte ich gerne ein Bilderrätsel erstellen um diverse Tiere, Bäume, Länder usw. besser zu lernen & zu erkennen.

    Was möchte ich machen?
    - Es soll ein Bild eingeblendet werden unter dem dann 4 RadioButtons angezeigt werden.
    - Eine dieser 4 Möglichkeiten ist dann die richtige antwort. -> Also Radio Button anklicken, dann auf den Button "Prüfen"
    - nachdem das Bild "richtig" erkannt wurde, soll ein neues Bild mit neuen Antworten angezeigt werden.
    - Dann im Prinzip das gleiche von vorne

    Was hab ich bereits?

    - Das erste Bild wird beim öffnen der Form bereits geladen
    - Nachdem es richtig beantwortet bzw. erkannt wurde wird das nächste Bild angezeigt.
    - Das zweite Bild lade ich hiermit:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. If rdBtn1.Checked Then
    3. MsgBox("Richtig, das hast du sehr gut gemacht!", MsgBoxStyle.Information)
    4. PictureBox1.BackgroundImage = My.Resources._2
    5. rdBtn1.Checked = False
    6. Else
    7. MsgBox("Leider falsch! Wir wissen dass du die richtige Antwort kennst. Versuchs einfach noch mal.", MsgBoxStyle.Critical)
    8. End If

    -Nach der Antwort wird der RadioButton wieder entfernt, d.h. er wird auf "unchecked" gesetzt.

    Meine derzeitige Lösung:
    - Ich erstelle für jedes Bild eine neue Form, lade diese nachdem der richtige RadioButton markiert war und auf Button1 geklickt wurde. Danach schließe ich die voran gegangene Form und lade das neue Bild beim laden der neuen Form mithilfe von

    VB.NET-Quellcode

    1. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. PictureBox1.BackgroundImage = My.Resources._3
    3. End Sub


    - Unfassbar mühsam bei mehr als 500 Bildern.
    - Hab nach etwa 10 Bildern aus offensichtlichen Gründen aufgehört..

    Wo liegt mein Problem / Was ist meine Frage?
    - Wie kann ich jetzt z.b. Bild 3, Bild 4 usw. laden ohne jedes mal eine neue Form erstellen zu müssen?
    - Muss ich jedes mal von Hand die RadioButtons neu benennen? Oder kann ich das irgendwie automatisiert machen? (Bei über 500 Bildern is es echt mühsam jedes mal den Text der RadioButtons anzupassen und eine neue Form zu erstellen.)
    Jetzt hatte ich überlegt dass ich eine Art Liste (als Text-File und dann in "Resources") mache in der meinetwegen sowas steht wie
    "PictureBox1.BackgroundImage = My.Resources._3 | Antwort 1 | Antwort 2 | Antwort 3 | Antwort 4 // Correct Answer = 3
    wobei Antwort 1 = RadioButton1, Antwort 2 = RadioButton2, Antwort 3 = RadioButton3, Antwort 4 = RadioButton4
    wenn das dann richtig beantwortet wurde soll automatisch in die nächste Zeile gesprungen werden (vermutlich "for each"?) und soll dann so aussehen:
    "PictureBox1.BackgroundImage = My.Resources._4 | Antwort 1 | Antwort 2 | Antwort 3 | Antwort 4 // Correct Answer = 1

    Also im Kopf hatte ich dann sowas wie (als Liste)

    VB.NET-Quellcode

    1. PictureBox1.BackgroundImage = My.Resources._4 | Antwort 1 | Antwort 2 | Antwort 3 | Antwort 4 // Correct Answer = 1
    2. PictureBox1.BackgroundImage = My.Resources._5 | Antwort 1 | Antwort 2 | Antwort 3 | Antwort 4 // Correct Answer = 2
    3. PictureBox1.BackgroundImage = My.Resources._6 | Antwort 1 | Antwort 2 | Antwort 3 | Antwort 4 // Correct Answer = 4
    4. PictureBox1.BackgroundImage = My.Resources._7 | Antwort 1 | Antwort 2 | Antwort 3 | Antwort 4 // Correct Answer = 3
    5. PictureBox1.BackgroundImage = My.Resources._8 | Antwort 1 | Antwort 2 | Antwort 3 | Antwort 4 // Correct Answer = 2


    und als Code irgendwie sowas wie:

    VB.NET-Quellcode

    1. rdBtn1.text = Antwort 1
    2. rdBtn2.text = Antwort 2
    3. rdBtn3.text = Antwort 3
    4. rdBtn4.text = Antwort 4


    Dann zum beantworten der Frage bzw. zum erkennen des Bildes:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. If rdBtn.Checked with Correct Answer Then
    3. MsgBox("Richtig, das hast du sehr gut gemacht!", MsgBoxStyle.Information)
    4. load next Line / Picture from file
    5. rdBtn.Checked = False
    6. Else
    7. MsgBox("Leider falsch! Wir wissen dass du die richtige Antwort kennst. Versuchs einfach noch mal.", MsgBoxStyle.Critical)
    8. End If



    Hat da jemand vielleicht eine Idee wie man das umsetzen könnte? Ich zerbrech mir seit gestern früh den Kopf und weiß einfach nicht weiter.
    Und evtl nach der 10ten richtigen Frage oder so eine MessageBox mit "Jetz hast du dir ne Kleinigkeit verdient" oder so

    Danke euch schon mal, ich hoffe dass alles soweit halbwegs verständlich erklärt ist.
    @0ptix Mach Dir eine datengetriebene Anwendung:
    • Bilder nicht in die Ressourcen, sondern in ein Verzeichnis neben die Exe,
    • Datenklasse mit den Properties { ImageName, Frage, 4 Antworten und RichtigerIndex }.
      Eine List(Of DeineDatenKlasse) wird als XML-Datei serialisiert.
    • Das Programm liest die XML ein und arbeitet sie ab.
    Feddich.
    Und:
    MsgBoxStyle.Critical für eine falsche Antwort ist etwas zu herb.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany klingt alles echt super ich hab allerdings keine Ahnung was du meinst noch wie das geht :(
    Ich dachte halt dass mand as als resource einbinden kann um dann z.b das einfach auf einen USB Stick zu kopieren und dann von überall aus starten kann ohne die Bilder kopieren zu müssen.
    Vor allem kann es ja mal passieren dass die Bilde rin diesem Ordner ausversehen umbenannt werden und dann geht ja nichts mehr..
    Wenn sie z.b mal bei Oma ist und die kennt sich ja nicht wirklich aus mit PCs.. Da ist es einfacher einfach den USB-Stick rein, doppelklick und gut ohne dass ich groß installieren muss oder so.
    War eben mein Wunschgedanke :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „0ptix“ ()

    @0ptix Das geht natürlich auch.
    Dann musst Du eine Tabelle coden mit ebendiesem Inhalt.
    Und wenn dann alle das Quizz drei Mal gelöst haben, kommen sie zu Dir und wollen ein neues.
    Dann fängst Du von vorn an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,
    also ich würde auch eher den Ansatz von @RodFromGermany anpeilen...
    wemm jemand dein Programm nutzt und löscht die Bilder, isser ja selbst schuld wenn dann das Programm crasht oder keine Bilder mehr anzeigt.
    Um dem ein klein wenig entgegen zu gehen könntest du die Bilder in einen Zip packen, beim starten entpacken und beim beenden den entpackten Ordner wieder löschen. Wenn du dann noch die Dateiendung von Zip auf dat änderst, ist es für den normalen User nicht ersichtlich das dort Bilder sind.

    Der Vorteil der oben angesprochenen Variante ist aber wie Rod schon angedeutet hat, die Wartbarkeit, du kannst ganz easy die Bilder austauschen und die dazugehörige xml Datei mit den Fragen und Antworten und musst das Programm nicht neu erstellen...
    alles in eine .exe zu packen kann auch schwierig werden wenn du von 500 Bildern sprichst, am Ende sind die noch Hoch Auflösend, dann ist deine .exe mehrere GB groß und brauch ne zeitlang zum starten...
    "Hier könnte Ihre Werbung stehen..."
    Hast du auch wieder Recht.. Aber ich steh momentan wie der Ochs vorm Berg und hab da im Moment noch nicht mal einen Ansatz dazu wie ich an die Sache rangehen könnte..
    xml.. noch nie in Verbindung mit VB gemacht.. Ich hätte auch absolut keinen Plan wie das ginge..
    Hast du da evtl n "Denkanstoß"?
    Also ich mein ich find ne Menge im Internet was ein Quiz angeht aber nie in Kombination mit Bildern und xml..

    *Unnötiges Vollzitat entfernt* ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Naja, kommt auf deinen Kenntnisstand an.
    Für den Anfang würde ja auch eine TextDatei reichen da kannst mit File.WriteText oder File.ReadText reinschreiben und raus lesen.
    Probier das mal mit einem Konsolenprojekt aus, wenn das klappt kannste dir ja ne ListOf(string) erstellen und die Liste in eine Datei schreiben usw.
    bei konkreten Fragen dazu, schreib einfach
    "Hier könnte Ihre Werbung stehen..."

    0ptix schrieb:

    xml.. noch nie in Verbindung mit VB gemacht.. Ich hätte auch absolut keinen Plan wie das ginge..
    Einfach ein normales Objekt erstellen und dieses Serialisieren / Deserialisieren.
    Das Framework nimmt dir die Arbeit ab.
    docs.microsoft.com/en-us/dotne…ples-of-xml-serialization
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @0ptix Ich hab mal ein Beispiel gemacht, musst Du natürlich an Deine Bedürfnisse anpassen.
    Form mit zwei Buttons.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private XmlFile As String = "c:\temp\data.xml" ' Pfad zum Speichern / Lesen
    3. Private Data As MyData
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. '' Daten-Instanz erstellen und befüllen
    6. 'Me.Data = New MyData()
    7. 'Me.Data.name = "Test Status"
    8. 'Me.Data.address = "0000"
    9. 'Me.Data.type = 9999
    10. 'Me.Data.timestamp = DateTime.Now
    11. 'Me.Data.flags = 0
    12. 'Me.Data.user = "Tester"
    13. 'Me.Data.SingleValues = New List(Of Integer) From {1, 2, 3, 4, 5}
    14. End Sub
    15. ''' <summary>
    16. ''' Daten auf Festplatte schreiben
    17. ''' </summary>
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. Me.Data.WriteData(Me.XmlFile)
    20. End Sub
    21. ''' <summary>
    22. ''' Daten von Festplatte laden
    23. ''' </summary>
    24. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    25. Me.Data = MyData.LoadData(Me.XmlFile)
    26. End Sub
    27. ''' <summary>
    28. ''' aktuelle Daten darstellen
    29. ''' </summary>
    30. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    31. Me.ListBox1.Items.Clear()
    32. ' hier: nur das Integer-Array
    33. For Each value In Me.Data.SingleValues
    34. Me.ListBox1.Items.Add(value)
    35. Next
    36. End Sub
    37. End Class
    38. '#####################################################
    39. '#####################################################
    40. '#####################################################
    41. Imports System.IO
    42. Imports System.Text
    43. Imports System.Xml.Serialization
    44. ''' <summary>
    45. ''' Datenklasse
    46. ''' </summary>
    47. ''' <remarks>mit XML-Serialisierung</remarks>
    48. Public Class MyData
    49. ' alle vorkommenden Daten
    50. Public Property name() As String
    51. Public Property address() As String
    52. Public Property type() As Integer
    53. Public Property timestamp() As DateTime
    54. Public Property flags() As Integer
    55. Public Property user() As String
    56. Public Property SingleValues() As List(Of Integer)
    57. Public Sub New()
    58. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    59. Me.name = "Hase"
    60. Me.SingleValues = New List(Of Integer)
    61. End Sub
    62. ''' <summary>
    63. ''' Daten aus einer Datei lesen
    64. ''' </summary>
    65. ''' <param name="file">Dateiname</param>
    66. ''' <returns>die geladene Instanz</returns>
    67. Public Shared Function LoadData(file As String) As MyData
    68. Dim data As New MyData()
    69. Try
    70. ' Deserialize XML file to a new object.
    71. Using sr As New StreamReader(file, Encoding.Default)
    72. Dim x As New XmlSerializer(data.GetType())
    73. data = DirectCast(x.Deserialize(sr), MyData)
    74. End Using
    75. Return data
    76. Catch
    77. ' nix tun, die Daten-Instanz ist nicht valid,
    78. ' es wird die Instanz übergeben, die bei New() erzeugt wird
    79. End Try
    80. Return data
    81. End Function
    82. ''' <summary>
    83. ''' Daten in eine Datei schreiben
    84. ''' </summary>
    85. ''' <param name="file">Dateiname</param>
    86. Public Sub WriteData(file As String)
    87. ' Serialize object to a XML file.
    88. Using sw As New StreamWriter(file, False, Encoding.Default)
    89. Dim x As New XmlSerializer(Me.GetType())
    90. x.Serialize(sw, Me)
    91. End Using
    92. End Sub
    93. End Class
    Und:
    Unterlass das vollständige Zitieren vpn Posts über Deinen :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe mal ein Projekt erstellt.
    Schau dir das mal an, das soll ein kleines Beispiel sein.
    Viel Spaß! :)
    vb-paradise.de/index.php/Attac…7e9d705a62534b19a408c1554

    (Ich habe die Bilder mit Googel gefunden, falls ein Bild geschützt ist, werde ich es sofort aus dem Projekt nehmen!)

    edit2:
    VB Quiz-Beispiel-Ohne EXE.zip
    Ich habe das Projekt erneut hochgeladen ohne EXE.
    Aber im Debug befinden sich noch zwei weitere Ordner.
    Und zwei weitere Bilddateien.
    Ich hoffe das ist nun so erlaubt! :!:

    *Anhang mit EXE entfernt*

    @Cheffboss bitte lade es nochmals ohne "bin" Ordner hoch da Executables nicht erlaubt sind. Danke ~NoFear23m
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Cheffboss“ ()

    @0ptix
    Ich habe das Projekt erneut hochgeladen ohne die EXE-Datei.
    Einfach das Projekt mit Visual Studio starten.
    Ich verwende VS2017, falls du eine ältere Version verwendest.
    Einfach ein neues Projekt anlegen und die Form1.vb usw. hinzufügen.
    Viel Spaß! ;)
    Freue mich auf ein Feedback.
    Visual Basic.NET 8o
    MS-SQL
    8o