Fragen zu Funktionen



  • Guten Abend,

    im Zuge meiner Prüfungsvorbereitung habe ich ein kleines
    Schrere, Stein, Papier - Spiel geschrieben.

    was soweit auch funktioniert.

    Ich habe die rand() funktion verwendet wohlwissend, dass sie nur Pseudozufallszahlen raushaut, aber für diesen Zweck ausreicht.

    Was ich mich allerdings frage, wie ich den Code kompakter machen könnte.

    if (cpuWahl == 1)
                        cout << " vs : Stein \n Unentschieden!" << endl;
    
                 else if(cpuWahl == 2)
                        cout << " vs : Schere\n Du verlierst!";
    
                 else
                        cout << " vs : Papier du gewinnst!";
    

    Das ist die ganz schnelle Lösung, aber nicht die schönste.

    Wie kann ich zwei Funktionsergebnisse vergleichen?
    Wenn ich jetzt einfache Funktionen wahlUser() und wahlCpu() erstelle und darüber
    den Sieger auslote? Mit boolean? Oder ist sowas wie

    (wahlUser() > wahlCpu()) 
    

    drin?

    Und der Ästhetik wegen, wie kann ich nach jedem Durchgang die Konsole clearen?

    Hat wer ein paar Worte ?

    Danke

    Lou



  • Nimm z.B. folgende Werte an:
    Schere = 0
    Stein = 1
    Papier = 2

    Dann nimm dir folgende Formel:
    x = (Wahl1 - Wahl2 + 3) % 3
    Mach eine Tabelle mit allen Möglichkeiten, rechne überall x aus und schreib daneben wer gewinnt. Und dann guck ob dir etwas auffällt 😉

    Falls du den % Operator nicht kennst: der heisst "modulo" und berechnet die Restklasse. Was fancy-speak für "Rest der bei der Division übrig bleibt" ist.



  • krasser Scheiß!
    Stammt das aus deiner Feder oder ist das so ne gängige Formel für diesen Zweck?


  • Mod

    @Lou-Cyphr3 Das ist nicht so kompliziert, wie es aussieht. Er hat die drei Optionen in der Reihenfolge aufgelistet, in der sie sich gegenseitig uebertrumpfen. Die Differenz bestimmt dann den Gewinner. E.g. -1 verliert, +1 gewinnt. Die Differenzen in einer Restklasse Modulo 3 fuehren zum selben Ergebnis, daher muessen wir uns nur um 0, 1 und 2 (kongruent zu -1) kuemmern.

    Es waere vermutlich minimal schneller und simpler, ein zweidimesionales Array einzusetzen. 😛



  • @Columbo @hustbaer
    okay. danke für die heißen Tipps.

    kann noch wer was zu der clear Sache sagen?

    danke

    lou


  • Mod

    Standard C++ hat kein Konzept einer "Konsole", sondern lediglich eines Zeichenstroms namens stdout. Du musst eine entsprechende Funktion deines Betriebssystems aufrufen. Ich bin sicher, dein ausgepraegter Sinn fuer Recherche wird dir dort weiterhelfen.



  • @hustbaer sagte in Fragen zu Funktionen:

    und berechnet die Restklasse

    Sorry, wenn ich jetzt so blöd frage, aber woher kennst du solche Begriffe? Ich dachte, du hättest nicht studiert?



  • @Mechanics Ich hab "Restklassendivision" (=der Begriff den ich als alternative Bezeichnung für "modulo" kannte) gegoogelt, weil's doch schon ein paar Jahre her war dass ich den gehört/verwendet habe und ich keinen Mist schreiben wollte. Und bin auf der Wikipediaseite zu Restklasse gelandet 😉
    Woher ich den Begriff Restklassendivision wiederrum kannte... pfuh, weiss ich nicht so genau.

    Aber ist ja bloss ein Wort für ne relativ simple Sache, das kann man schnell mal wo aufschnappen. Das worum es geht (=die "modulo" Operation) verstehen ja durchaus die meisten Programmierer. Ne zweite Bezeichnung dafür zu kennen finde ich dann nicht so erwähnenswert.

    ps:
    Genau so gut könntest du mich fragen warum ich programmieren kann. Das hab ich schliesslich auch in keiner Schule/Universität und keinem Kurs gelernt.



  • @hustbaer sagte in Fragen zu Funktionen:

    Das worum es geht (=die "modulo" Operation) verstehen ja durchaus die meisten Programmierer.

    Ja klar. Das war auch keineswegs negativ gemeint. Ich war tatsächlich ehrlich überrascht, den Begriff zu sehen, weil ich den Begriff hauptsächlich mit der Mengenlehre und dem Studium assoziiere (wenn man lernt zu abstrahieren und versteht, dass sich die Welt nicht nur um (natürliche) Zahlen dreht), und den ansonsten nicht oft gesehen habe. Kann aber auch sein, dass ich mich täusche und der Begriff tatsächlich geläufig ist, auch wenn man nicht an die Mengenlehre denkt.



  • @hustbaer sagte in Fragen zu Funktionen:

    Dann nimm dir folgende Formel:
    x = (Wahl1 - Wahl2 + 3) % 3

    Für Rock Paper Scissors Lizard Spock geht's aber nicht so schön kurz, oder?


  • Mod

    @Swordfish Warum?

    Scissors = 0
    Paper = 1
    Rock = 2
    Lizard = 3
    Spock = 4

    Die Formel ist (Wahl1 - Wahl2 + 5) %5, Array {0, -1, 1, -1, 1}.



  • @Columbo sagte in Fragen zu Funktionen:

    Warum?

    Weil ich zu doof war ein Array mit den Outcomes zu nehmen.



  • @Mechanics sagte in Fragen zu Funktionen:

    Kann aber auch sein, dass ich mich täusche und der Begriff tatsächlich geläufig ist, auch wenn man nicht an die Mengenlehre denkt.

    Den Begriff Restklasse kannte ich davor auch nicht, nur den Begriff Restklassendivision 🙂


Anmelden zum Antworten