BPS #20: Kopfrechnen-Spiel - Auswertung
Übersicht

![]() |
XeresModeratorBetreff: BPS #20: Kopfrechnen-Spiel - Auswertung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das war die Aufgabe
Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern. Diskussion Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen. Nächste Aufgabe In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt. Viel Spaß & viel Erfolg! Musterlösung: BlitzMax: [AUSKLAPPEN] SuperStrict |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
- Zuletzt bearbeitet von Xeres am Mo, Jun 11, 2012 0:06, insgesamt 2-mal bearbeitet
bizzlBetreff: Hier meine Lösung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe mir vor kurzem BlitzMax gekauft und experimentiere ein wenig damit herum.
Das ist dabei herausgekommen: Code: [AUSKLAPPEN] Rem Ich habe einen -zugegeben primitiven- Formelparser geschrieben, um die Rechenaufgaben per Zufallsgenerator erstellen zu können. Der Formelparser beherrscht nur die 4 Grundrechenarten (Punkt- vor Strichrechnung) und kann mit negativen Zahlen umgehen. Es fehlen Klammerrechnug und Trigonometrie, das war für diese Aufgabe allerdings auch nicht gefordert. endrem SuperStrict Global a:TList = New TList 'hier wird der Term eingetragen 'Die Funktion "Rechne" ist die Startfunktion des Formelparsers. 'Hier wird die als String übergeben Rechenaufgabe in eine Liste umgewandelt. 'In dieser Liste stehen abwechselnd die Zahlen und die Operatoren. Function Rechne:String(Ausdruck:String) Local e:String a.clear() For Local c:Int=0 Until Ausdruck.length Local z:Byte = Ausdruck[c] If z = Asc("-") And e = "" e = "-" ; Continue 'negatives Vorzeichen? If z >= Asc("0") And z <= Asc("9") 'Ziffer ? e:+ Chr(z) Else 'Operator ? a.addlast(e) 'Zahl und... e = "" a.addlast(Chr(z)) '...Rechenzeichen in Liste schreiben EndIf Next a.addlast(e) 'Letzte Zahl anhängen Pri() 'Liste nach Priorität abarbeiten Return a.first().tostring() 'und Ergebnis zurückgeben EndFunction Function Pri() Local rz:String For rz = EachIn a 'Hier wird die Liste zuerst nach Punkt... If rz = "*" Scan("*") If rz = "/" Scan("/") Next For rz = EachIn a '...und dann nach Strichrechnung durchgegangen If rz = "+" Scan("+") If rz = "-" Scan("-") Next EndFunction Function Scan(z:String) Local t:TLink = a.findlink(z) 'Rechenzeichen suchen Local l:TLink = t.prevlink() 'Zahlen links und... Local r:TLink = t.nextlink() '... rechts davon bestimmen Local links:String = l.value().tostring() Local rechts:String = r.value().tostring() Local ergebnis:String Select z 'je nach Rechenzeichen Berechnung ausführen Case "*" ergebnis = links.toint() * rechts.toint() Case "/" If rechts.toint() = 0 Notify("Division durch Null!") ; End ergebnis = links.toint() / rechts.toint() Case "+" ergebnis = links.toint() + rechts.toint() Case "-" ergebnis = links.toint() - rechts.toint() EndSelect t.remove 'den berechneten Ausdruck... l.remove a.insertafterlink(ergebnis , r) 'durch das Ergebnis... r.remove 'ersetzen EndFunction 'Spielstart Local r:String[] = ["+" , "-" , "*" , "+"] , jn:String 'Um es nicht zu schwer zu machen, habe ich die Division draußen gelassen, 'dafür die Chance auf Addition verdoppelt SeedRnd MilliSecs() Local maximum:Int Repeat Local schwer:Int Local pGes:Int = 0 , richtig:Int = 0 Repeat schwer = Input("~n~nSchwierigkeitsgrad (1-5) ?").toint() Until schwer > 0 And schwer < 6 For Local aufgabe:Int = 1 To 10 'wir wollen 10 Aufgaben lösen Local l:Int = Rand(Schwer) 'Anzahl der Rechenzeichen Local p:Int = l + 1 'je länger die Aufgabe ist, desto meht Punkte gibt es Local e:String While l Local z:String = r[Rand(0 , 3)] maximum = 99 'Bei Strichrechnung sind Zahlen von 1-99 zugelassen, If z = "*" Or z = "/" maximum = 9 'bei Punktrechnung Zahlen von 1-9 e:+ Rand(maximum) 'Rechenaufgabe zusammensetzen e:+ z l:- 1 EndWhile e:+ Rand(maximum) Local loesung:Int=Rechne(e).toint() 'Die Lösung Print "~nAufgabe " + aufgabe + ":" Print "~t"+e+" = ?" Local eingabe:Int = Input("~t>").toint() If eingabe = loesung Print "~tRichtig!" Print "~t" + p + " Punkte." pGes:+ p richtig:+ 1 Else Print "~tLeider falsch!" Print "~t" + e + "=" + loesung EndIf Next Print "~n~tSie haben " + richtig + " mal richtig geantwortet und " + pges + " Punkte erreicht." jn = Input("~tNoch ein Spiel ? (j/n)") If jn <> "j" Exit Forever |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sehr hübsch! Die vielen einbuchstabigen Variablen könnten etwas länger und selbsterklärender sein, aber bis auf die Kosmetik sehr Vorbildlich. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group