Leiterspiel



  • Guten Abend,

    ich muss ein Leiterspiel programmieren und komme an leider nicht weiter.
    Allg.: Das Spiel geht von Spielfeld 1-99. und an verschiedene Spielfeldern kann man mithilfe von Leitern hoch oder runterspringen. Man muss genau auf 99 kommen um das Spiel zu beenden.

    Mein Problem: Ich muss die durchschnittliche Spieldauer in Würfen ausgeben.

    Anbei der Code:

    #include<iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    using namespace std;
    
    int wuerfel()
    {
    	int würfelaugen = 0;
    	return würfelaugen = 1 + (rand() % 6);
    }
    
    int main()
    {
    	int const Ziel = 99;
    	int anzahl = 0;
    	int neueposition = 1;
    	int runden = 0;
    	int überschuss= 0;
    	int würfelaugen = 0;
    	int SpieldauerInWürfen = 0;
    	int AnzahlWuerfe = 0;
    	int Runden = 0;
    
    	bool on = true;
    
    	cout << " Bitte geben Sie bitte die Anzahl an wie oft das Spiel simuliert werden soll" << endl;
    	cin >> anzahl;
    
    	do
    	{
    		srand((unsigned)time(0));
    		for (int i = 1; i <= anzahl; i++)
    		{
    			Runden++;
    			würfelaugen =wuerfel();
    			neueposition = neueposition + würfelaugen;
    
    			if (neueposition > Ziel)
    			{
    				überschuss = neueposition - Ziel;
    				neueposition = Ziel - überschuss;
    			}
    
    			switch (neueposition)
    			{
    			case 3:
    			{
    				Runden = Runden+1;
    			} break;
    			case 5:
    			{
    				neueposition = 26;
    			} break;
    			case 9:
    			{
    				neueposition = 18;
    			} break;
    			case 18:
    			{
    				neueposition = 9;
    			} break;
    			case 23:
    			{
    				neueposition = 45;
    			} break;
    			case 26:
    			{
    				neueposition = 5;
    			} break;
    			case 31:
    			{
    				neueposition = 36;
    			} break;
    			case 36:
    			{
    				neueposition = 31;
    			} break;
    			case 39:
    			{
    				neueposition = 66;
    			} break;
    			case 45:
    			{
    				neueposition = 23;
    			} break;
    			case 46:
    			{
    				neueposition = 58;
    			} break;
    			case 49:
    			{
    				neueposition = 54;
    			} break;
    			case 53:
    			{
    				neueposition = 81;
    			} break;
    			case 54:
    			{
    				neueposition = 49;
    			} break;
    			case 58:
    			{
    				neueposition = 46;
    			} break;
    			case 61:
    			{
    				neueposition = 74;
    			} break;
    			case 66:
    			{
    				neueposition = 39;
    			} break;
    			case 68:
    			{
    				neueposition = 98;
    			} break;
    			case 74:
    			{
    				neueposition = 61;
    			} break;
    			case 77:
    			{
    				neueposition = 90;
    			} break;
    			case 79:
    			{
    				neueposition = 87;
    			} break;
    			case 81:
    			{
    				neueposition = 53;
    			} break;
    			case 87:
    			{
    				neueposition = 79;
    			} break;
    			case 90:
    			{
    				neueposition = 77;
    			} break;
    			case 98:
    			{
    				neueposition = 68;
    			} break;
    			case 99:
    			{
    				on = false;
    			}
    			}
    		}
    	}while (neueposition == Ziel);
    
    	SpieldauerInWürfen = Runden;
    
    	cout << "Die durchschnittliche Spieldauer in Würfen beträgt:" << SpieldauerInWürfen<< endl;
    
    	system("pause");
    	return 0;
    }
    


  • mc52 schrieb:

    Mein Problem: Ich muss die durchschnittliche Spieldauer in Würfen ausgeben.

    Hallo mc52,

    sicher dass das Dein Problem wiederspiegelt?
    Der Code ist nicht mal kompilierfähig. (siehe Zeile 50 -> Semikolon vergessen)

    Ich verstehe noch nicht, wo das Problem ist den Mittelwert der notwendigen Würfen zu bestimmen.

    Viele Grüße

    Jakob

    PS: Seit wann gehen den Umlaute für Variablennamen?!? 😕


  • Mod

    jb schrieb:

    PS: Seit wann gehen den Umlaute für Variablennamen?!? 😕

    Geht in manchen Implementierungen, wird aber nicht vom Standard verlangt. Ist daher nicht zu empfehlen.



  • Mein Problem liegt nach der for-Schleife.
    Ich weiß nicht so ganz wie ich die Spieldauer in Würfen bestimmen soll.



  • SpieldauerInWürfen = Runden / Anzahl;
    

    oder gerundet

    SpieldauerInWürfen = (Runden + Anzahl/2) / Anzahl;
    

    Aber du hast noch einige logische Fehler in deinem Programmcode:
    - vertausche die do-while und for-Schleife (du willst ja 'anzahl'-mal ein Spiel durchspielen):

    for (int i = 1; i <= anzahl; i++)
    {
      do
      {
      } while (...)
    }
    

    (wenn du die innere Schleife in eine eigene Funktion auslagern würdest, wäre es noch besser 😉

    - die Bedingung deiner do-while-Schleife paßt nicht:

    while (neueposition != Ziel)
    

    Und packe den srand-Aufruf an den Anfang der main-Funktion (vor die Schleifen), sonst erhältst du nahezu immer dieselben Zufallszahlen (und damit immer dasselbe Rundenergebnis).



  • Guten Abend,

    erst einmal vielen Dank für die hilfreiche Antwort. Also ich habe die mängel versucht zu beheben einige in Funktionen zusammenzukapseln.

    #ifndef Leiterspiel_h
    #define Leiterspiel_h
    
    void welcome();
    int würfeln();
    int zieleinlauf(int position, int würfelaugen);
    void spielfeld(int position);
    
    #endif
    
    #include <time.h>
    #include "Leiterspiel.h"
    using namespace std;
    
    int main()
    {
    	int anzahl = 0;
    	welcome();
    	cin >> anzahl;
    	int neueposition = 1;
    	spielfeld(neueposition);
    
    	system("pause");
    	return 0;
    }
    
    #include<iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include "Leiterspiel.h"
    using namespace std;
    
    int anzahl = 0;
    int const Ziel = 99;
    unsigned long SpieldauerInWürfen = 0;
    bool on = true;
    
    void welcome()
    {
    	cout << " Bitte geben Sie die Anzahl an wie oft das Spiel simuliert werden soll" << endl;
    }
    
    int würfeln()
    {
    	srand((unsigned)time(0));
    	int wuerfel = 1 + (rand() % 6);
    	return wuerfel;
    }
    
    int zieleinlauf(int neueposition, int würfelaugen)
    {
    	if (neueposition > Ziel)
    	{
    		int überschuss = neueposition - Ziel;
    		neueposition = Ziel - überschuss;
    		return neueposition;
    	}
    }
    
    void spielfeld(int neueposition)
    {
    	int Runden = 0;
    	for (int i = 1; i <= anzahl; i++)
    	{
    		do
    		{
    			int würfelaugen = würfeln();
    			neueposition = neueposition + würfelaugen;
    
    			switch (neueposition)
    			{
    			case 5:
    			{
    				neueposition = 26;
    			} break;
    			case 9:
    			{
    				neueposition = 18;
    			} break;
    			case 18:
    			{
    				neueposition = 9;
    			} break;
    			case 23:
    			{
    				neueposition = 45;
    			} break;
    			case 26:
    			{
    				neueposition = 5;
    			} break;
    			case 31:
    			{
    				neueposition = 36;
    			} break;
    			case 36:
    			{
    				neueposition = 31;
    			} break;
    			case 39:
    			{
    				neueposition = 66;
    			} break;
    			case 45:
    			{
    				neueposition = 23;
    			} break;
    			case 46:
    			{
    				neueposition = 58;
    			} break;
    			case 49:
    			{
    				neueposition = 54;
    			} break;
    			case 53:
    			{
    				neueposition = 81;
    			} break;
    			case 54:
    			{
    				neueposition = 49;
    			} break;
    			case 58:
    			{
    				neueposition = 46;
    			} break;
    			case 61:
    			{
    				neueposition = 74;
    			} break;
    			case 66:
    			{
    				neueposition = 39;
    			} break;
    			case 68:
    			{
    				neueposition = 98;
    			} break;
    			case 74:
    			{
    				neueposition = 61;
    			} break;
    			case 77:
    			{
    				neueposition = 90;
    			} break;
    			case 79:
    			{
    				neueposition = 87;
    			} break;
    			case 81:
    			{
    				neueposition = 53;
    			} break;
    			case 87:
    			{
    				neueposition = 79;
    			} break;
    			case 90:
    			{
    				neueposition = 77;
    			} break;
    			case 98:
    			{
    				neueposition = 68;
    			} break;
    			case 99:
    			{
    				on = false;
    			}
    			}
    			Runden++;
    			SpieldauerInWürfen += Runden;
    		} while (neueposition != Ziel);
    
    		SpieldauerInWürfen = Runden / anzahl;
    
    		cout << "Die durchschnittliche Spieldauer in Wuerfen ist:" << SpieldauerInWürfen << endl;
    	}
    }
    

    Die Ausführung klappt jedoch erhalte ich keine Ausgabe und kann den Fehler nicht finden.


  • Mod

    Was machst du, wenn du auf Position 98 stehst und eine 6 würfelst?



  • Tipp: du benutzt 'zieleinlauf' nirgendswo...

    Edit: und diese Funktion hat auch noch einen Fehler (schalte mal alle Warnungen bei deinem Compiler ein)



  • Auch den Zufallsgenerator brauchst du nicht jedesmal neu initialisieren.



  • Stimmt, jetzt kommt (innerhalb von einer Sekunde) immer derselbe Würfelwert raus!



  • Also leider kann ich mit den Antworten relativ wenig anfangen.

    Habe den zieleinlauf nun in die main gebracht und in der schleife kleine änderungen vorgenommen. Erhalte als Ausgabe immer die 0. Das Programm zählt meine Runden und Anzahle nicht hoch.

    #include<iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include "Leiterspiel.h"
    using namespace std;
    
    int anzahl = 0;
    int const Ziel = 99;
    unsigned long SpieldauerInWürfen = 0;
    bool on = true;
    
    void welcome()
    {
    	cout << " Bitte geben Sie die Anzahl an wie oft das Spiel simuliert werden soll" << endl;
    }
    
    int würfeln()
    {
    	srand((unsigned)time(0));
    	int wuerfel = 1 + (rand() % 6);
    	return wuerfel;
    }
    
    int zieleinlauf(int neueposition, int würfelaugen)
    {
    	if (neueposition > Ziel)
    	{
    		int überschuss = neueposition - Ziel;
    		neueposition = Ziel - überschuss;
    		return neueposition;
    	}
    }
    
    void spielfeld(int neueposition)
    {
    	int Runden = 0;
    	for (int i = 1; i <= anzahl; i++)
    	{
    		do
    		{
    			int würfelaugen = würfeln();
    			neueposition = neueposition + würfelaugen;
    
    			switch (neueposition)
    			{
    			/*case 3:
    			{
    				Runden = Runden + 1;
    			} break;*/
    			case 5:
    			{
    				neueposition = 26;
    			} break;
    			case 9:
    			{
    				neueposition = 18;
    			} break;
    			case 18:
    			{
    				neueposition = 9;
    			} break;
    			case 23:
    			{
    				neueposition = 45;
    			} break;
    			case 26:
    			{
    				neueposition = 5;
    			} break;
    			case 31:
    			{
    				neueposition = 36;
    			} break;
    			case 36:
    			{
    				neueposition = 31;
    			} break;
    			case 39:
    			{
    				neueposition = 66;
    			} break;
    			case 45:
    			{
    				neueposition = 23;
    			} break;
    			case 46:
    			{
    				neueposition = 58;
    			} break;
    			case 49:
    			{
    				neueposition = 54;
    			} break;
    			case 53:
    			{
    				neueposition = 81;
    			} break;
    			case 54:
    			{
    				neueposition = 49;
    			} break;
    			case 58:
    			{
    				neueposition = 46;
    			} break;
    			case 61:
    			{
    				neueposition = 74;
    			} break;
    			case 66:
    			{
    				neueposition = 39;
    			} break;
    			case 68:
    			{
    				neueposition = 98;
    			} break;
    			case 74:
    			{
    				neueposition = 61;
    			} break;
    			case 77:
    			{
    				neueposition = 90;
    			} break;
    			case 79:
    			{
    				neueposition = 87;
    			} break;
    			case 81:
    			{
    				neueposition = 53;
    			} break;
    			case 87:
    			{
    				neueposition = 79;
    			} break;
    			case 90:
    			{
    				neueposition = 77;
    			} break;
    			case 98:
    			{
    				neueposition = 68;
    			} break;
    			case 99:
    			{
    				on = false;
    			}
    			}
    			Runden++;
    			SpieldauerInWürfen += Runden;
    		} while (neueposition != Ziel);
    	}
    
    	SpieldauerInWürfen = Runden / anzahl;
    	cout << "Die durchschnittliche Spieldauer in Wuerfen ist:" << SpieldauerInWürfen << endl;
    }
    
    int main()
    {
    	int anzahl = 0;
    	welcome();
    	cin >> anzahl;
    	int neueposition = 1;
    	int würfelaugen = 1;
    	zieleinlauf(neueposition,würfelaugen);
    	spielfeld(neueposition);
    
    	system("pause");
    	return 0;
    }
    


  • Schau mal kritisch auf die Variable(n) 'anzahl'. Lasse sie dir zur Not mal zu beginn von spielfeld() ausgeben.



  • Th69 schrieb:

    Und packe den srand-Aufruf an den Anfang der main-Funktion (vor die Schleifen), sonst erhältst du nahezu immer dieselben Zufallszahlen (und damit immer dasselbe Rundenergebnis).

    srand soll nur einmal im ganzen Programm aufgerufen werden.


Anmelden zum Antworten