Das Quiz(erster versuch)

    • VB.NET

    Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

      Das Quiz(erster versuch)

      Edit by ErfinderDesRades: Ich schiebs mal in den SourceCode-Austausch, weil offensichtlich wird hier Sourcecode ausgetauscht ;)


      Hallo leute hier mein erstes programm.
      Um genau zu sein ist es ein quiz(für bio)

      Hier der code

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private weiter As Integer = 0
      3. Private richtig As Integer = 0
      4. Private falsch As Integer = 0
      5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      6. Select Case weiter.ToString
      7. Case 0
      8. ROTFür()
      9. Case 1
      10. weiskorp()
      11. Case 2
      12. eherz()
      13. End Select
      14. End Sub
      15. Private Function ROTFür() As String
      16. If Rabtn1.Checked = True Then
      17. MsgBox("Nicht Richtig", MsgBoxStyle.Critical)
      18. falsch = falsch + 1
      19. ElseIf Rabtn3.Checked = True Then
      20. MsgBox("Nicht Richtig", MsgBoxStyle.Critical)
      21. falsch = falsch + 1
      22. ElseIf Rabtn2.Checked = True Then
      23. MsgBox("Richtige Antwort", MsgBoxStyle.Information)
      24. Rabtn2.Checked = False
      25. weiter = weiter + 1
      26. weiskorp()
      27. End If
      28. End Function
      29. Private Function weiskorp() As String
      30. Label1.Text = "Bio Quiz Frage 2"
      31. Label2.Text = "Wozu braucht dein Körper Weiße Blutkörperchen?"
      32. Rabtn1.Text = "Um Eindringlinge wie Bakterien oder andere krankheitserreger zu erledigen"
      33. Rabtn2.Text = "Um Sauerstoff zu den Zellen zu Transportieren"
      34. Rabtn3.Text = "Um Keime und Viren auf der Haut zu zerstören"
      35. If Rabtn1.Checked = True Then
      36. MsgBox("Richtige Antwort", MsgBoxStyle.Information)
      37. Rabtn1.Checked = False
      38. eherz()
      39. weiter = weiter + 1
      40. ElseIf Rabtn3.Checked = True Then
      41. MsgBox("Nicht Richtig", MsgBoxStyle.Critical)
      42. falsch = falsch + 1
      43. ElseIf Rabtn2.Checked = True Then
      44. MsgBox("Nicht Richtig", MsgBoxStyle.Critical)
      45. falsch = falsch + 1
      46. End If
      47. End Function
      48. Private Function eherz() As String
      49. Label1.Text = "Bio Quiz Frage 3"
      50. Label2.Text = "Wofür brauchst du ein Herz?"
      51. Rabtn1.Text = "Um zu Atmen"
      52. Rabtn2.Text = "Um das gehirn durch venen mit sauerstoff zu versorgen"
      53. Rabtn3.Text = "Um den Stoffaustausch im Körper aufrecht zu erhalten"
      54. If Rabtn1.Checked = True Then
      55. MsgBox("Nicht Richtig", MsgBoxStyle.Critical)
      56. falsch = falsch + 1
      57. ElseIf Rabtn3.Checked = True Then
      58. MsgBox("Richtige Antwort", MsgBoxStyle.Information)
      59. ElseIf Rabtn2.Checked = True Then
      60. MsgBox("Nicht Richtig", MsgBoxStyle.Critical)
      61. falsch = falsch + 1
      62. End If
      63. End Function
      64. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
      65. Label3.Text = richtig
      66. Label5.Text = falsch
      67. End Sub
      68. End Class


      Ich weiß es gibt bessere lösungen (denke ich mal) aber wie gesagt mein erstes programm
      Auf lob und kritik wäre ich dankbar ( und natürlich tipps)
      !! It's not a bug it's a feature !!

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

      PSPlover schrieb:

      tipps
      Gib Deinem Programm zunächst Option Strict On.
      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!
      1. Option strict on:

      C#-Quellcode

      1. Select Case weiter.ToString 'String
      2. Case 0 'Zahl
      3. ROTFür()
      4. Case 1
      5. weiskorp()
      6. Case 2
      7. eherz()
      8. End Select


      2. Benenn deine Prozeduren/Variablen/etc anständig.
      Hab dafür einige Sachen worauf man achten sollte:

      -Klassen/Eigenschaften immer mit einem Großbuchstaben anfangen
      -Methoden mit einem kleinbuchstaben anfangen und jedes weitere Wort dann mit einem großbuchstaben anfangen (aber alle wörter zusammenschreiben)
      -Parameter mit 'p' anfangen und dann wie bei Klassen/Eigenschaften
      -lokale Variablen mit 'l' anfangen und dann wie bei Klassen/Eigenschaften
      -getter/setter von Eigenschaften mit '_' anfangen und kleinschreiben
      -Interfaces immer mit 'I' anfangen
      -restliche globale Variablen kleinschreiben

      3.
      Messagebox.Show() benutzen
      Msgbox() ist nur ein wrapper dafür, aber da wird noch einiges konvertiert (weil msgbox() object parameter annimmt und man nur strings anzeigen lassen kann)
      Für einen ersten Versuch ist es doch gar nicht mal schlecht. Ich würde tippen, dass über 50% hier im Forum so angefangen hat.
      Aber natürlich gibt es da noch enorm viel zu Verbessern. (vom reinen Code mal ganz abgesehen)

      In der Programmierung wirst du merken, ist richtige Struktur/Aufbau des Programms entscheident.
      Am Anfang wird dir das eher unnötig erscheinen. Aber mit der Zeit (z.B auch wenn du ein Programm erweitern) willst, wirst du merken, dass es einfacher ist wenn du alles gut überlegt programmiert hast.
      Du hast hier eine Klasse und schreibst alles direkt hart in deine Controls rein.
      Was ist denn wenn du jetzt andere Fragen haben möchtest? Oder welche hinzufügen?
      Dann musst du recht viel ändern.

      Hier vielleicht ein Vorschlag, wie ich da rangehen würde. Ich würde objektorientiert programmieren. de.wikipedia.org/wiki/Objektorientierte_Programmierung
      D.h. dass ich mir erstmal anschaue was ich hier gerade vor mir habe.
      Ein Quiz. Ein Quiz hat Fragen und Antworten uns muss verwaltet werden.
      Hier sieht man ja direkt, dass man irgenwie drei Grundkomponenten hat.
      Du hast mehrere Fragen. D.h. du machst dir eine Klasse Frage. So kannst du mehrere Fragen verwalten (z.B über eine Liste)
      Eine Frage kann mehrere Antworten haben. D.h. in der Klasse Frage sollte es eine Auflistung (List(of ...)) von Antworten zu deiner Frage geben.
      Dementsprechend wird auch eine Klasse Antwort benötigt.
      Hier würde ich eventuell noch eine Eigenschaft anlegen ob diese Antwort die richtige auf die Frage ist. Diese Eigenschaft kann dann von der Klasse Frage verwaltet werden und nach außen hin dem User angezeigt werden. (z.B kann man in der Frage noch ein Attribut machen wie viele Punkte diese Frage gibt)

      So, nun steht ein recht simples Klassenmodell. Natürlich musst du in die Klassen noch ein paar Sachen wie Textattribute o.ä. einbauen.
      Nun würde ich mich an das Datenmodell sitzen. Sehr viele Programme haben etwas mit Datenverwaltung zu tun.
      Die Frage ist dabei manchmal wie groß man das auziehen möchte. Bei dir würde z.B auch eine Datenbank passen, aber das wäre m.M.n zu groß für das kleine Projekt.
      Schön ist es die Daten aus einer Datei zu holen.
      .NET bietet schöne Sachen mit XML an. So kann man z.B ein ganzes Objekt (eine Frage) speichern. Dann ist die Frage und alle Antworten dazu in einer Datei gespeichert.
      Auslesen geht ebenso einfach. Du merkst, wenn du dir vorher gut überlegst wie du es machen willst kannst du dir viel "Wirr-War" ersparen.

      Also probier doch einfach mal aus diese Klassen anzulegen.
      Und überleg einfach mal weiter wie man es schön machen könnte. Das Gute ist, dass man in so einem Modell schön neues Sachen einbauen kann.
      z.B dass es Spezialfragen oder so gibt, und wenn man die richtig beantwortet kriegt man ein Bild von einem Keks o.ä. :D

      ThePlexian schrieb:

      Und warum updatest du die Labels mit nem Timer ?
      Immer updaten, wenn Änderung vorhanden.

      Und wie soll das gehen?(code , wie gesagt anfänger)



      LaMiy schrieb:

      So kannst du dir viel "Wirr-War" ersparen.

      Danke für deinen tipp (werde ich bald mal testen)

      LaMiy schrieb:


      Das Gute ist, dass man in so einem Modell schön neues Sachen einbauen kann.
      z.B dass es Spezialfragen oder so gibt, und wenn man die richtig beantwortet kriegt man ein Bild von einem Keks o.ä.

      Das mit dem keks ist auch keine schlechte idee :D :)
      Und was ich noch fragen wollte , kannst du mir ein ebook empfehlen?
      !! It's not a bug it's a feature !!

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

      C#-Quellcode

      1. using System;
      2. using System.Collections.Generic;
      3. using System.ComponentModel;
      4. using System.Data;
      5. using System.Drawing;
      6. using System.Linq;
      7. using System.Text;
      8. using System.Windows.Forms;
      9. namespace WindowsFormsApplication1
      10. {
      11. public partial class Form1 : Form
      12. {
      13. private Quiz myQuiz;
      14. public Form1()
      15. {
      16. InitializeComponent();
      17. myQuiz = new Quiz();
      18. myQuiz.addQuestion(new Question("Wieviele Tage hat ein Monat?", new Answer("30", true), new Answer("25", false)));
      19. myQuiz.addQuestion(new Question("Wieviele Tage hat eine Woche?", new Answer("4", false), new Answer("7", true), new Answer("14", false)));
      20. myQuiz.addQuestion(new Question("Wer ist der coolste?", new Answer("RushDen", true), new Answer("Ich", false)));
      21. lblQuestion.DataBindings.Add(new Binding("Text", myQuiz, "ActualQuestion", true, DataSourceUpdateMode.OnPropertyChanged));
      22. updateLb();
      23. myQuiz.PropertyChanged += new PropertyChangedEventHandler(PropertyChanged);
      24. }
      25. private void updateLb()
      26. {
      27. listBox1.DataSource = null;
      28. listBox1.DataSource = myQuiz.ActualQuestion.Answers;
      29. }
      30. private void PropertyChanged(object sender, PropertyChangedEventArgs e)
      31. {
      32. if (e.PropertyName == "ActualQuestion")
      33. updateLb();
      34. }
      35. private void button1_Click(object sender, EventArgs e)
      36. {
      37. if (myQuiz.checkAnswer(listBox1.GetItemText(listBox1.SelectedItem)))
      38. {
      39. if (!(myQuiz.nextQuestion()))
      40. {
      41. MessageBox.Show("Du hast das Quiz durch!");
      42. myQuiz.mixQuestions();
      43. myQuiz.restart();
      44. }
      45. }
      46. else { MessageBox.Show("Falsch!"); }
      47. }
      48. }
      49. public class Question
      50. {
      51. public Question(string pQuestText, params Answer[] pQuestAnswers)
      52. {
      53. this._questionText = pQuestText;
      54. this._answers = pQuestAnswers;
      55. }
      56. private readonly string _questionText;
      57. public string QuestionText
      58. {
      59. get { return _questionText; }
      60. }
      61. private readonly Answer[] _answers;
      62. public Answer[] Answers
      63. {
      64. get { return _answers; }
      65. }
      66. public override string ToString()
      67. {
      68. return this.QuestionText;
      69. }
      70. }
      71. public class Answer
      72. {
      73. public Answer(string pAnswerText, bool pIsCorrect)
      74. {
      75. this._answerText = pAnswerText;
      76. this._isCorrect = pIsCorrect;
      77. }
      78. private readonly string _answerText;
      79. public string AnswerText
      80. {
      81. get { return _answerText; }
      82. }
      83. private readonly bool _isCorrect;
      84. public bool IsCorrect
      85. {
      86. get { return _isCorrect; }
      87. }
      88. public static bool operator ==(Answer pFirst, string pSecond)
      89. {
      90. return pFirst.AnswerText == pSecond;
      91. }
      92. public static bool operator !=(Answer pFirst, string pSecond)
      93. {
      94. return !(pFirst == pSecond);
      95. }
      96. public override bool Equals(object obj)
      97. {
      98. return base.Equals(obj);
      99. }
      100. public override int GetHashCode()
      101. {
      102. return base.GetHashCode();
      103. }
      104. public override string ToString()
      105. {
      106. return this.AnswerText;
      107. }
      108. }
      109. public class Quiz : INotifyPropertyChanged
      110. {
      111. public event PropertyChangedEventHandler PropertyChanged;
      112. protected virtual void OnPropertyChanged(string pProp)
      113. {
      114. if (this.PropertyChanged != null)
      115. this.PropertyChanged(this, new PropertyChangedEventArgs(pProp));
      116. }
      117. public Quiz()
      118. {
      119. this.actualIndex = 0;
      120. this.questions = new List<Question>();
      121. this.newRandom = new Random();
      122. this.mixQuestions();
      123. }
      124. public void addQuestion(Question pQuestion)
      125. {
      126. this.questions.Add(pQuestion);
      127. }
      128. public void addQuestion(string pQuestText, params Answer[] pQuestAnswers)
      129. {
      130. this.questions.Add(new Question(pQuestText, pQuestAnswers));
      131. }
      132. private Random newRandom;
      133. private List<Question> questions;
      134. private int _actualIndex;
      135. private int actualIndex
      136. {
      137. get
      138. {
      139. return _actualIndex;
      140. }
      141. set
      142. {
      143. _actualIndex = value;
      144. OnPropertyChanged("ActualQuestion");
      145. }
      146. }
      147. public Question ActualQuestion
      148. {
      149. get { return questions[actualIndex]; }
      150. }
      151. public bool checkAnswer(string pAns)
      152. {
      153. return questions[actualIndex].Answers.Where(item => item == pAns).First().IsCorrect;
      154. }
      155. public bool nextQuestion()
      156. {
      157. bool lAvailable = !(actualIndex == questions.Count() - 1);
      158. if (lAvailable)
      159. actualIndex++;
      160. return lAvailable;
      161. }
      162. public void restart()
      163. {
      164. this.actualIndex = 0;
      165. }
      166. public void mixQuestions()
      167. {
      168. this.questions = this.questions.OrderBy<Question, int>((item) => newRandom.Next(0, this.questions.Count())).ToList();
      169. }
      170. }
      171. }


      Hab dir das mal kurz gebastelt, gucks dir einfach mal an.

      (Du benötigst:
      1 Label (Darstellung der Frage)
      1 Listbox (Darstellung der Antworten)
      1 Button (Antwort bestätigen)

      Ist aber in C# (kannst einen Online Converter benutzen).
      @RushDen : Wie wäre es wenn die richtige Antwort mit "_" beginnt? Wird natürlich nicht angezeigt im Programm selbst und im Konstruktor von Answer wird ausgelesen welche Antwort richtig ist anhand des "_".

      Anwendung:

      VB.NET-Quellcode

      1. myQuiz.addQuestion(new Question("Wieviele Tage hat ein Monat?", new Answer("_30"), new Answer("25")));


      Der Konstruktor:

      VB.NET-Quellcode

      1. public Answer(string pAnswerText)
      2. {
      3. this._answerText = pAnswerText;
      4. this._isCorrect = pAnswerText.StartsWith("_")
      5. }


      8-) faxe1008 8-)
      @faxe1008
      Ich denke, dass das nicht ganz so optimal wäre, weil man dann bei den Antworten eingeschränkt wird. Da es immer nur eine Antwort gibt, würde ich den Konstruktor von der Question so machen:

      C#-Quellcode

      1. public Question(string pQuestText, Answer trueanswer, params Answer[] pQuestAnswers)
      2. {
      3. this._questionText = pQuestText;
      4. trueanswer.IsCorrect = true;
      5. pQuestAnswers.Add(trueanswer); //ToDo: Zufällig sortieren
      6. this._answers = pQuestAnswers;
      7. }
      Mfg
      Vincent

      Dann musst du allerdings anstatt der Listbox eine CheckedListBox zur Darstellung der Daten verwenden, wenn es mehr ne Art Multiple-Choice werden soll ;D. Oder mit sehr viel Eigenbastelei mit .MultiSelect bei der Listbox sollte das auch gehen.

      8-) faxe1008 8-)

      faxe1008 schrieb:

      Wie wäre es wenn die richtige Antwort mit "_" beginnt?
      Ich weiss zufällig, dass es bei Quizduell so ist, dass die richtige Antwort immer die ist, die als erstes übertragen wurde (also das 1. Item in der Antworten-Liste) und die Antworten anschließen nur im UI an anderen Positionen angezeigt werden. Ich glaube die haben das mit einem Binding bei der Grid-Position (Row/Column) und einem Random-Faktor gemacht. Weiss ich nicht mehr genau. Könnte man hier so ähnlich machen. Oder auch nicht.

      @RushDen Ich glaube du meinst mit "actual question" (="wirkliche" Frage) eher "current question" (=aktuelle Frage).
      Das, was du dir da mit der List<T> hingebastelt hast erinnert an eine Queue<T>. Vielleicht könntest du die ja statt einer List<T> verwenden.
      Von meinem iPhone gesendet