Du rundest die Zahlen ja mit der Funktion Format.
Ergebnis = Format(Zahl4 + Zahl5, "###,###,##0.00") 'Berechnet das Ergebnis
lblRechnung.Caption = vbCrLf & _
vbCrLf & _
vbCrLf & _
Format(Zahl4, "###,###,##0.00") & vbCrLf & _
Format(Zahl5, "###,###,##0.00") & vbCrLf Der Fehler entsteht dadurch, dass du mit ungerundeten Zahlen rechnest, aber gerundete Zahlen anzeigst. Ein Beispiel: Interne Rechnung: 10.1351+10.1451=20.2802
gerundet: 20.28 ist das richtige Ergebnis. Dem User zeigst du aber schon die gerundeten Zahlen an:
10.14+10.15. Der rechnet 20.29 und prompt stimmt es mit dem internen Ergebnis nicht über ein! Verstehst du deinen Denkfehler?
So müsstest du den Code umschreiben:
Zahl4 = Format(Zahl4, "###,###,##0.00")
Zahl5 = Format(Zahl5, "###,###,##0.00")
Ergebnis = Zahl4 + Zahl5 'Berechnet das Ergebnis
lblRechnung.Caption = vbCrLf & _
vbCrLf & _
vbCrLf & _
Zahl4 & vbCrLf & _
Zahl5 & vbCrLf Da deine Zahlen sowieso nicht größer als 200 werden, kannst du bei der Format-Funktion auch Format(Zahl2,"0.00") hin schreiben. ###,##0 besagt ja nur, dass alle 100 ein Punkt gesetzt werden soll. Also wenn du 500000 als Zahl hast, formatiert er das in 500.000. Die größte Zahl die du in Level 5 haben wirst ist 500. Also brauchst du immer nur Format(Zahl,"0.00") schreiben.
Und die Funktion cmdAuswerten würde ich so schreiben:
Private Sub cmdAuswerten_Click()
'Wenn nichts reingeschrieben wurde
If txtErgebnis.Text = "" Then
MsgBox "Bitte ein Ergebnis eingeben!", vbInformation
txtErgebnis.SetFocus
exit sub
end if
lblAufgaben.Caption = Spieldauer - Spielrunde & " von " & Spieldauer & "" & _
"Rechnungen verbleibend"
'Wertet das Ergebnis aus
If Cdbl(txtErgebnis.Text) = Ergebnis Then
'Es werden nur "," als Komma erkannt.
'Wenn du auch Punkte als Komma erkennen möchtest, musst du mit der
'Funktion Replace die Punkte im string txtErgebnis.text durch "," ersetzen
MsgBox "Super, das Ergebnis ist richtig!", vbInformation,"Mathetrainer"
'Sonst steht im Titel der Textbox immer Project1. Und das ist ein bisschen dumm
pgbRichtig.Value = pgbRichtig.Value + 10 'Er bekommt 10 richtige Punkte
Spielrunde = Spielrunde + 1
lblAufgaben.Caption = Spieldauer - Spielrunde & " von " & Spieldauer & "" & _
"Rechnungen verbleibend"
Else
'Wenn Falsch
MsgBox "Schade, das Ergebnis ist nicht korrekt!" & vbCrLf & vbCrLf & _
"Das richige Ergebnis währe " & Ergebnis & " gewesen!", vbInformation, _
"Mathetrainer"
pgbFalsch.Value = pgbFalsch.Value + 10 'Er bekommt 10 falsche Punkte
Spielrunde = Spielrunde + 1
lblAufgaben.Caption = Spieldauer - Spielrunde & " von " & Spieldauer & "" & _
"Rechnungen verbleibend"
End If
If Spielrunde = Spieldauer Then
'Wenn Spiel zu Ende
MsgBox "Du hast das " & Level & " Level fertig gespielt!" & _
vbCrLf & vbCrLf & _
"Richtige Ergebnisse: " & int(pgbRichtig.Value / 10) & vbCrLf & _
"Falsche Ergebnisse: " & int(pgbFalsch.Value / 10), _
vbInformation
'int() rundet immer ab. Ist sicherer, sonst hast du vielleicht mal 3.7343
'richtige Ergebnisse und du möchtest ja wohl lieber immer ganze Zahlen dort
' stehen
' haben. Und bei der Progressbar kannst du mit den Eigenschaften min und max das
'Maximale und Minimale Value einstellen. Hier würde wohl min=0 sein und max=10.
Spielrunde = 0
pgbRichtig.Value = 0
pgbFalsch.Value = 0
txtErgebnis.Text = ""
lblRechnung.Caption = ""
cmdAuswerten.Enabled = False
txtErgebnis.Enabled = False
cmdNewGame.Enabled = True
Exit Sub
End If
cmdNewGame_click 'Es wird nächste Rechnung aufgelistet.
'Du hattest cmdNewGame.value=true geschrieben. Es ist aber besser einfach den
' Sub 'aufzurufen. Call cmdNewGame_Click ist auch möglich.
'In anderen Sprachen hätte der Compiler sofort herum gemeckert
txtErgebnis.Text = ""
txtErgebnis.SetFocus |