Brauche Hilfe bei Anfängerspiel



  • Hallo erstmal!
    Zu allererst, da ich hier neu bin, möchte ich mich als "Programmierer" wenn man es so nennen kann, vorstellen. Ich bin ein totaler Anfänger, habe erst vor kruzem in der Schule angefangen C++ zu lernen, Systemgestaltung usw..
    Ich muss ehrlich gestehen das ich noch etwas Schwierigkeiten habe, mich in all dem Programmierzeugs zurecht zu finden, aber ich möchte c++ wirklich gerne lernen.
    Meine Lehrer sind allerdings keine große Hilfe, um ehrlich zu sein, versteh ich mehr was in Büchern steht, als was die mir vor labern.

    Mein Problem ist jetzt das ich noch überhaupt keinen Plan habe WIE ich etwas zusammen stelle, ich habe, hoff ich jedenfalls, die Grundzüge verstanden und von der Schule aus haben wir eine Hausarbeit auf bekommen.

    Die Aufgabe lautet " erstelle ein Programm deiner Wahl, inklusive Kommentare, Spezifikation und Strucktogramm."
    Bla, bla, klingt ganz einfach, aber wenn man keine Ahnung hat was man mit seinen "Kenntnissen" (ich setze es in " weil ich wahrscheinlich im Gegensatz zu manch andren hier ABSOLUTE keine Ahnung habe) anfangen soll, fällt es schon ganz schön schwer.

    Aber ich komm natürlich nicht ohne irgendwas daher, von wegen "schickt mir bitte nen Quellcode" 😑 so doof bin ich gott sei dank nicht...

    Ich hätte hier ein Spiel, wahrscheinlich kennt ihr das schon das heißt das "Nimm - Spiel".
    Man gibt die Zahl von Münzen ein mit denen man spielen will und abwechselnd nimmt der Computer und der Spieler selbst 1-3 Münzen (also eine, zwei oder drei Münzen, mehr oder weniger sind nicht erlaubt). Am Schluss gewinnt, wer die letzte Münze nimmt (vlt. kennt ihr das auch so, das man die letzte NICHT nehmen darf, es gibt beides, ich bevorzuge diese Variante).

    Unser Lehrer hat uns noch gesagt das wir am besten alle 4 wichtigen Befehle drin haben sollen, also for, while, switch und if, es wäre allerdings nicht so wild wenn wir eine einzige auslassen.

    ich hänge mal den code an:

    #include <iostream.h>
    
    int Spieler (int zugSpieler);
    int Computer (int zugBOT)
    
    void main ()
    {
    
    int MAnzahl;
    
    cout<<"Bitte geben sie die Anzahl der Muenzen ein mit denen sie spielen wollen: "<<endl;
    cin>>MAnzahl;
    cout<<"Der Spieler macht den ersten Zug "<<endl;
    
                                                                 //Programmabolauf start
    
    while(true)
       {
          MAnzahl=MAnzahl-Spieler(zugSpieler);
          if(MAnzahl==0)
          {
             cout<<"Spieler gewinnt!"<<endl;
             return;
          };
          MAnzahl=MAnzahl-BOT(zugBOT);
          if(MAnzahl==0)
          {
             cout<<"Computer gewinnt!"<<endl;
             return;
          };
       };
                                                                 //Programmablauf Ende
    
    }
    
    //Unterprogramme
    //Zug des Spielers
    int Spieler (int zugSpieler){
    int spielerM;
    
    cout<<"Es liegen "MAnzahl" Muenzen auf dem Tisch."<<endl;        //Ausgabe der derzeitigen Muenzanzahl
    cout<<"Geben sie die Anzahl der Muenzen ein, die sie nehmen möchten. Sie duerfen nur bis zu 3 Muenzen nehmen, 0 ist nicht erlaubt: "<<endl;
    
    // endlosschleife; wird erst bei korrekter Eingabe beendet
    for(;;)
    {
    cin>>spielerM;            //Eingabe der Muenzen die der Spieler nehmen moechte
    
    if(anzahlDerMuenzen-ergebnis>=0 && ergebnis>=1 && ergebnis<=3)           //Bedingung zur Muenznahme
    return spielerM;                                                        //Bei erfuellung der Bedingung, Rueckgabe des Wertes
    cout<<"Nur die Zahlen 1, 2, und 3 sind erlaubt! Neue Eingabe erforderlich!"<<endl;    //Andernfalls diese Ausgabe und Rueckkehr an den Anfang der Schleife
    }
    
    }
    //Unterprogramm 1 zum Zug des Spielers beendet!
    
    //Zweites Unterprogramm zum Zug des Computers
    int Computer (int zugBOT)
    {
    int BOTM
    cout<<"Der Computer ist am Zug und waehlt nun die Anzahl der Muenzen die er vom Feld nehmen wird: "<<endl;
    cout<<"Im Moment liegen <<MAnzahl<< Muenzen auf dem Feld"<<endl;
    cout<<"Der Computer nimmt <<BOTM<< Muenzen vom Feld";
    int BOTM=MAnzahl%4;
       if(BOTM==0)
          return 1;
       else
          return BOTM;
    
    }
    

    Ich hoffe es ist verständlich.
    MAnzahl soll die gesamte Münzanzahl sein, die sich ja im laufe des Spiels von Zug zu Zug ändert.

    spielerM sind die Münzen die der Spieler in seiner Runde von den gesamten Münzen, also MAnzahl abzieht. Die Bedingung für diese Zahl ist, dass sie nicht kleiner als 1 und nicht größer als 3 ist.

    und BOTM ist die Zahl der Münzen des Computers, die er jede Runde auswählt, welche wiederum von der Gesamtmünzahl abzieht. Auch diese drüfen nicht kleiner als 1 und nicht größer als 3 sein.

    Ich habe diesen Quelltext nicht ohne Hilfe erstellen können, er ist jedoch fast ausschließlich von mir, dass ist zu 100% auch der Grund dafür, dass er nicht funktioniert ^^.

    Ich hoffe das vlt einer oder zwei von euch so freundlich wären, eure geschulten Augen mal darauf zu richten und mir zu sagen wo oder was ich falsch gemacht habe oder was zu verbessern wäre.

    Ihr drüft absolut ehrlich sein, wenn ihr glaubt das es kompletter Mist ist und ich lieber etwas andres tun sollte, dann nur raus damit.

    Eine letzte Idee die ich mir vorgestellt habe, aber noch nicht im Quelltext entahlten ist, wäre jedes Mal wenn der Computer am Zug ist einen Check up, mit einem Unterprog. zu machen.
    Schließlich soll mein Computer ja nicht so dumm sein und 2 Münzen nehmen, wenn noch drei übrig sind, damit hätte er ja seinen Sieg verschenkt.
    Meine Frage wäre nun, könnte man diesen Checkup mit einer Switch anweisung machen? Denn das wäre die Anweisung die noch in meinem Programm fehlt, dann hätte ich alle 4.
    Wenn das aber zu umständlich wäre, vlt habt ihr andere, bessere Vorschläge.

    Ich möchte mich für eure Hilfe herzlichst bedanken und ich wünsche allen noch ein gutes neues Jahr!

    mfg LoTuS



  • erstmal ein hinweis:

    int BOTM=MAnzahl%4;
    

    liefert eine zahl zwischen 0 und 3...

    if(BOTM==0) return 1; else return BOTM;
    

    ...fuehrt dazu, dass "1" doppelt so oft vorkommt wie andere zahlen.

    Schließlich soll mein Computer ja nicht so dumm sein und 2 Münzen nehmen, wenn noch drei übrig sind

    eine (sehr) einfache ki muesste also:
    1. wenn moeglich alle muenzen nehmen
    2. so viele muenzen uebrig lassen, dass der menschliche spieler beim naechsten zug nicht alle aufnehmen kann
    3. verhindern dass nach dem folgenden zug des menschlichen spielers 4 muenzen verbleiben.
    versuch doch mal, das als code zu formulieren.

    ansonsten solltest du dir mal ueberlegen, ob man viele konstruktionen nicht eleganter loesen koennte - zb:

    while (mAnzahl>0)
    {
      spielerAmZug^=1; // spieler wechselt
      switch (spielerAmZug)
      {
        case 0:
          // mensch
          break;
        case 1:
          // computer
          break;
      }
      mAnzahl-=gewaehlteMuenzen;
    }
    
    // auswertung ergebnis
    


  • wow, ja danke erstmal für die schnelle reaktion.

    außerdem bin ich überrascht das du nur so wenig mängel gefunden hast, ich dachte jetzt da wären mehr XD.

    aber ich muss gestehen das ich deinen vorschlag nicht so ganz verstehe, also was du tust.

    du sagst unter der bedingung das die gesamtanzahl der münzen größer 0 ist spieler am zug = 1 ???
    und dann die switchanweisung die zwei cases vorgibt, aber wann werden denn die cases aktiviert? dass versteh ich nicht so ganz.

    mAnzahl-=gewaehlteMuenzen;

    gibt doch keinen sinn oder?
    jedenfalls hab ich soetwas noch nie gesehen, könntest du das vlt genauer erläutern. (ich meine jetzt mAnzahl- = gewaehlteMuenzen also was soll das - vor dem gleich)

    alles andere hab ich verstanden und werd ich ändern bzw umsetzen versuchen, vielen dank nochmal 🙂

    noch eine frage, wie könnte ich eine zufalls wahl einbauen. also das der computer selbst eine zahl zwischen zwei parametern sucht, in diesem fall wäre das 1-3. damit der computer wärend der spielzeit nicht immer NUR 3, 2 oder 1 nimmt.
    das war ja auch mein problem, dass wenn ich durch % teile, mehrere möglichkeiten, bzw alle möglichkeiten eingegeben werden.

    wie gesagt, noch anfänger, deswegen hab ich zu solchen dingen auch so viele fragen ^^".

    [edit]
    hmm ich hab grad mit meinem c++builder die routine versucht, aber er sagt wenn der curser hinter dem void steht "fehler in der deklarationssyntax" wie darf ich das verstehn, meint er damit ein fehler in den unterprogrammen?

    der quelltext ist der selbe wie oben angegeben



  • bin ich überrascht das du nur so wenig mängel gefunden hast, ich dachte jetzt da wären mehr

    da sind auch mehr.

    das code-beispiel ist als leere pseudo-code huelse zu verstehen. es geht dabei nur um die struktur - den inhalt musst du selbst einfuegen, sonst lernst du nichts dabei - und laesst sich auf diverse andere deiner konstruktionen uebertragen.

    grundsaetzlich geht es darum, dass eine while-schleife bereits eine abbruchbedingung bietet. diese nutzt du nicht (while(true)) sondern springst einfach bei bestimmten (identischen) bedingungen raus - das ist haesslich und dumm.

    die zugrundeliegende idee war die, die schleife solange laufen zu lassen, bis alle muenzen weg sind und bei jedem schleifendurchlauf den am zug befindlichen spieler zu wechseln (xor-verknuepfung). nach terminieren der schleife weisst du dadurch, welcher spieler den letzten zug gemacht hat, ergo gewonnen hat.

    fuer zufallszahlen kannst du zb die funktion rand() aus stdlib.h nutzen.
    "a-=b" ist eine verkuerzte schreibweise fuer "a=a-b" - funktioniert auch fuer alle anderen operatoren.
    bemuehe fuer derartige fragen aber ruhig die dokumentation.



  • Ich habe das selbst schon Programmiert.
    Am anfang gibt man an wieviel Münzen auf dem Tisch liegen. Nur leider Gewinnt der PC IMMER, weil er anfängt.
    Der Code ist

    #include <iostream.h>
    #include <conio.h>
    int zugrechner(int muenzen2)
    {
    int zug = muenzen2%4;
    if (muenzen2%4 == 0)
       return 1;
    return zug;
    }
    
    int zugmensch(int muenzen2)
    {
    int eingabe;
    cout<<"Es liegen "<<muenzen2<<" auf dem Tisch!"<<endl;
    cin>>eingabe;
    return eingabe;
    }
    
    int main()
    {
        int muenzen;
        cout<<"Gib die Anzahld der Muenzen ein: ";
        cin>>muenzen;
    
        while(true)
        {
        muenzen = muenzen - zugrechner(muenzen);
        if (muenzen==0)
           {
           cout<<"Pc hat gewonnen!";
           break;
           }
        muenzen = muenzen - zugmensch(muenzen); 
            if (muenzen==0)
            {
            cout<<"Sie haben gewonnen!";
            break;
            }
        }
    getch();
    }
    


  • leider gewinnt der PC immer, weil er anfängt

    das stimmt nicht.



  • Ich habe schon sehr oft gespielt aber noch nie gewonnen!
    €: Hast du schon gespielt?





  • danke erstmal für die vielen antworten und ich wünsch noch allen n frohes neues

    allerdings zu den codes muss ich sagen, dass ich teile davon kenne und sie gelesen habe, aber ich möchte auch keine genaue Kopie von denen haben, weil es schließlich sowas wie ne hausaufgabe ist und es geht ja vorallem ums verstehen. deswegen möcht ich das schon irgendwie auf meine weise hinbekommen. trotzdem vielen dank, so seh ich jedenfalls mal ein paar bsps wie es sein könnte, das hilft mir auch schon sehr. danke nochmal!



  • LoTuS schrieb:

    #include <iostream.h>
    ...
    void main ()
    

    Wenn dir das dein Lehrer beigebracht hat, lies lieber ein Buch über C++, statt ihm weiter zuzuhören. Oder mach ihn mal darauf aufmerksam, dass ISO-14882 existiert. 🙂



  • ja, dass hab ich von meinem lehrer, aber ich wie gesagt ich bin absoluter anfänger, wahrscheinlich hat er uns das deswegen beigebracht.

    ansonten muss ich leider fragen was iso ... ist. weil ich ISO zwar gehört habe aber keine ahnung davon hab.^^



  • LoTuS schrieb:

    ja, dass hab ich von meinem lehrer, aber ich wie gesagt ich bin absoluter anfänger, wahrscheinlich hat er uns das deswegen beigebracht.

    Er hat euch leider kein C++ beigebracht, sondern etwas, was er fälschlicherweise für C++ hält. Er ist ganz offensichtlich nicht dazu qualifiziert.

    ansonten muss ich leider fragen was iso ... ist. weil ich ISO zwar gehört habe aber keine ahnung davon hab.^^

    http://de.wikipedia.org/wiki/Internationale_Organisation_für_Normung

    http://www.ishiboo.com/~nirva/c++/C++STANDARD-ISOIEC14882-1998.pdf



  • danke an alle die hier kommentare gepostet haben. ich hab das programm jetzt vollständig zum laufen gebracht, also nochmals vielen Dank 🙂


Anmelden zum Antworten