Hilfe beim Einheitenlimit



  • Hy Leute

    Bin dran so ein kleines Spiel zu machen mit Rohstoffen und Einheiten in der Consolenanwendung. Ich benutze Microsoft Visual Studio.
    Leider seit ein Paar Tagen quäle ich mich schon mit der Berechnung des Einheitenlimits.
    Also z.B.

    Der Limit beträgt: 50.
    Ich gebe zuerst den Auftrag 12 Schwertkämpfer und dannach 12 Reiter auszubilden.
    Limit 24/50.
    Jetzt gebe ich den Auftrag weitere 30 Schwertkämpfer auszubilden.
    Limit 50/50 <- Das passt jetzt. 🕶
    Aber wenn ich eine Option öffne, dass mir die Einheiten und ihre Anzahl anzeigt dann steht dort:

    Schwertkämpfer: 42 😡 ⚠
    Reiter: 12

    Ich will aber, dass die Schwertkämpfer und Reiter zusammen 50 ergeben. Also muss man die Schwertkämpfer minimieren.
    Hier der Code. Sorry falls es euch merkwürdig erscheint ich habe es gemacht wie ich es kann.

    #include <iostream>
    #include <iomanip>
    #include <conio.h>
    using namespace std;
    
    void SchwertKAusb (int *einheiten, int *Kämpfer, int *Reiter, int limit, 
    				   int *Nahrung, int *Holz, int *Gold);
    
    void ReiterAusb (int *einheiten, int *Reiter, int *Kämpfer, int limit, 
    				 int *Nahrung, int *Holz, int *Gold);
    
    void Einheiten(int *einheiten, int *Reiter, int *Kämpfer, int limit);
    
    int main()
    {
    	int einheiten = 0;
    	int Kämpfer = 0, Reiter = 0;
    	int limit = 50;
    	int Nahrung = 5000, Holz = 5000, Gold = 5000;
    	int Ausw, Ausb; //Auswählen, Ausbilden
    
        do
    	{
    		system("CLS");
    
    		if (einheiten > limit)
    			einheiten = limit;
    
    		cout << "Nahrung: " << Nahrung << setw(10) << "Holz: " << Holz << setw(10) << "Gold: " << Gold << endl;
    	    cout << setw(70) << "Alle Einheiten: " << einheiten << " / " << limit << endl;	
    
    	    cout << "1.Einheiten ausbilden" << endl;
    	    cout << "2.Eigene Einheiten" << endl;
    		cout << "3.Spiel beenden\n\nIhre eingabe: ";
            cin >> Ausw;
    
    	switch(Ausw)
    	{
    		//----------------------case 1-------------------
    		case(1):
    			system("CLS");
    			if(Kämpfer + Reiter >= limit)
    		    {
    			    cout << "Limit erreicht" << endl;
    				cout << "\nBitte eine Taste druecken." << endl;
    				_getch();
    		    }
    			else
    			{
    
    			cout << "Einheiten ausbilden\n-------------------------\n"
    				    "1.Schwertkaempfer\n2.Reiter\n\nIhre eingabe: ";
    			cin >> Ausb;		
    
    			switch(Ausb)
    			{
    			case (1):
    				SchwertKAusb (&einheiten, &Kämpfer, &Reiter, limit, 
    					&Nahrung, &Holz, &Gold);
    				break;
    
    			case (2):
    				ReiterAusb (&einheiten, &Reiter, &Kämpfer, limit, 
    					&Nahrung, &Holz, &Gold);
    
    				break;
    
    			default:
    				{
    				cout << "1 oder 2 bitte!!" << endl;
    				cout << "\nBitte eine Taste druecken." << endl;
    				_getch();
    
    				break;
    				}
    			}				
    			}
    
    		    break;
    //------------------------case 2------------------
            case(2):
    
             Einheiten(&einheiten, &Reiter, &Kämpfer, limit);
    
    		    break;
    
    //-----------------------case 3---------------------
    		case(3):
    			return 0;
    
    		default:
    			cout << "Was zum?! Hey 1, 2 oder 3 druecken ok?!" << endl;
    			_getch();
    			break;
    	}
    	}while(Ausw != 3);
    
    		return 0;
    }//Ende von main
    
    void SchwertKAusb (int *einheiten, int *Kämpfer, int *Reiter, int limit, 
    				   int *Nahrung, int *Holz, int *Gold) //Ausbildung: Schwertkämpfer
    {
    	int Anzahl;
    	int nahrung = 40;
    	int holz = 35;
    	int gold = 80;
    
    	system("CLS");
    	cout << "Nahrung: 40\nHolz: 35\nGold: 80\n" << endl;
    	cout << "Wie viele Schwertkempfer sollen ausgebildet werden?\nAnzahl: ";
        cin >> Anzahl;
    
    	if (Anzahl > limit)
    		Anzahl = limit;
    
    	if(*Gold < gold || *Gold < (Anzahl * gold))
    	{
    		cout << "Zu wenig Gold" << endl;
    		cout << "\nBitte eine Taste druecken." << endl;
    		_getch();
    
    	}
    
    	else
    	{
    	*Gold -= gold *= Anzahl;
    
    	if(*Nahrung < nahrung || *Nahrung < (Anzahl * nahrung))
    	{
    		cout << "Zu wenig Nahrung" << endl;
    		cout << "\nBitte eine Taste druecken." << endl;
    		_getch();
    
    	}
    	else
    	{
    	*Nahrung -= nahrung *= Anzahl;
    
    	if(*Holz < holz || *Holz < (Anzahl * holz))
    	{
    		cout << "Zu wenig Holz" << endl;
    		cout << "\nBitte eine Taste druecken." << endl;
    		_getch();
    
    	}
    
    	else
    	{
    	*Holz -= holz *= Anzahl;
    	*einheiten += Anzahl;
    	*Kämpfer += Anzahl;
    
    	}
    	}
    	}
    
    }//ende
    
    void ReiterAusb (int *einheiten, int *Reiter, int *Kämpfer, int limit, 
    				 int *Nahrung, int *Holz, int *Gold) //Ausbildung: Reiter
    {
    	int Anzahl;
    	int nahrung = 60;
    	int holz = 40;
    	int gold = 35;
    
    	system("CLS");
    	cout << "Nahrung: 60\nHolz: 40\nGold: 35\n" << endl;
    	cout << "Wie viele Schwertkempfer sollen ausgebildet werden?\nAnzahl: ";
        cin >> Anzahl;
    
    	if (Anzahl > limit)
    		Anzahl = limit;
    
    	if(*Gold < gold || *Gold < (Anzahl * gold))
    	{
    		cout << "Zu wenig Gold" << endl;
    		cout << "\nBitte eine Taste druecken." << endl;
    		_getch();
    
    	}
    
    	else
    	{
    	*Gold -= gold *= Anzahl;
    
    	if(*Nahrung < nahrung || *Nahrung < (Anzahl * nahrung))
    	{
    		cout << "Zu wenig Nahrung" << endl;
    		cout << "\nBitte eine Taste druecken." << endl;
    		_getch();
    
    	}
    	else
    	{
    	*Nahrung -= nahrung *= Anzahl;
    
    	if(*Holz < holz || *Holz < (Anzahl * holz))
    	{
    		cout << "Zu wenig Holz" << endl;
    		cout << "\nBitte eine Taste druecken." << endl;
    		_getch();
    
    	}
    
    	else
    	{
    	*Holz -= holz *= Anzahl;
    	*einheiten += Anzahl;
    	*Reiter += Anzahl;
    
    	}
    	}
    	}
    }//ende
    
    //EINHEITENLIMIT
    void Einheiten(int *einheiten, int *Reiter, int *Kämpfer, int limit)
    {
    
    	cout << "Schwertkämpfer: " << *Kämpfer << endl;
    	cout << "Reiter: " << *Reiter << endl;
    
    			cout << "\nBitte eine Taste druecken." << endl;
    			_getch();
    }
    

    Ich weis auch nicht wirklich wohin diese Berechnung hingehört. 😕
    Bin Natürllich für jede Hilfe dankbar



  • du solltest beim erstellen vor einer unit nachgucken, wie hoch das limit ist - und nicht einfach bei jedem schleifendurchlauf nen limit = min(limit, 50) machen...

    bb



  • Zunächst einmal "Einrückungen sind nicht böße" 😃

    Dein Limit wird am Anfang mit 50 festgesetzt.
    In den jeweiligen Funktionen für Reiter und Schwertkämpfer prüfst du die aktuelle
    Eingabe gegen das Limit. << Dabei vergisst du die bereits hinterlegten anderen Einheiten.

    Bsp:

    Limit 50 --> Eingabe 20 Reiter
        20 ist kleiner als 50 und somit OK
    
    Limit 50 --> Eingabe 20 Schwertkämpfer
        20 ist kleiner als 50 und somit OK (falsch)
        40 ist kleiner als 50 und somit OK (richtig weil auch Reiter mit beachtet werden müssen)
    
    Limit 50 --> Eingabe 15 Reiter
        15 ist kleiner als 50 und somit OK (falsch)
        55 ist groesser als 50 also Minimierung der Eingabe um 5
    

    Falsch bzw. nicht vollständig ist somit

    if (Anzahl > limit)
            Anzahl = limit;
    //und
    *Reiter += Anzahl;
    


  • Und schau dir mal Referenzen an, dann kannst du dir das ständige Dereferenzieren ersparen:

    int a(int *x)
    {
     *x = 10;
    }
    
    // Benutzung:
    a(&var);
    

    vs.

    int a(int& x)
    {
     x = 10;
    }
    
    // Benutzung:
    a(var);
    


  • Heey danke BasicMan!! 😮 🙂
    Hat Funktioniert.

    Und "......"? 😃
    Ja diese Referenzen lerne ich gerade, schauen auch wirklich ein wenig einfacher aus.

    Nochmal: DANKE!


Log in to reply