Algorithmus gesucht "Mastermind-spiel"



  • hi leute ich hab mal wieder ein kleines problemchen bei dem ich auf dem schlauch hock... ich hock schon seit moins früh dran und ich komm net dahinter..
    ich hab zwei klassenmethoden die einen array durchsuchen und aufkunft geben ob man "eingebene zahlen erraten hat. ich weiss ihr haltet nix davon code durchzulesen aber für die erklärung bedarf es dafür.

    > also.. die funktion bekommt durch my meinen "eingebenen array"
    die erste funktion überprüft ob mein array mit dem des generierten Arrays
    digits[i] übereinstimmt.. sozusagen ob die position richtig ist....
    so nun zur zweiten funktion, die soll nun auskunft geben ob sonst noch eingegebene zahlen richtig sind.. das macht die zwar aaaaaaaaaaaber....
    z.b wenn der generierte array digits[i]= 1,2,3,4 enthält und ich 1,5,5,1 eingegeben habe sagt mir meine funktion locationwrong ich hätte 2 nummern richtig..was falsch ist... ich weiss auch warum weil er ja einmal durchgeht bei der ersten 1 und des zweite mal bei der vierten 1... wie verhindere ich das??? ich hasse algorithmen programmieren und steh auf kriegsfuss damit, desshalb frag ich euch....

    int MastermindDigits::locationRight(MastermindDigits& my)const
    {
    	cout<<"locationRight"<<endl;
    	status=0;
    	for (int i=0; i<=3; i++)
    	{
    		if(digits[i]==my.digits[i])
    			status++;
    
    	}
    	cout<<"Computerantwort: "<<status<<" an der richtigen Stelle;";
    return status;
    }
    
    int MastermindDigits::locationWrong(MastermindDigits& my)const
    {
    
    	cout<<"locationWrong"<<endl;
    	int numberright=0;
    	for (int i=0; i<=3; i++)
    	{
    		for (int y=0; y<=3; y++)
    		{
    			if(digits[i]==my.digits[y])
    			{numberright++;}
    		}	
    	}
    	cout<<"sonst richtig sind: "<<numberright<<endl;;
    return numberright;
    }
    

    achja schleifenabbruch hatte ich schon probiert aber dann werden ja die anderen zahlen net überprüft 😕



  • Ich würde beide Listen sortieren und mit set_intersection() bestimmen, welche (und damit auch wieviele) Ziffern sie gemeinsam haben - das achtet auch auf doppelt vorkommende Werte.

    (PS: korrekterweise müsste die zweite Funktion übrigens bei digit ={1,2,3,4} und my.digit={1,5,5,1} 0 ausgeben - die erste 1 steht schon richtig, die zweite 1 hat kein Gegenstück in der Lösung.)



  • CStoll schrieb:

    Ich würde beide Listen sortieren und mit set_intersection() bestimmen, welche (und damit auch wieviele) Ziffern sie gemeinsam haben - das achtet auch auf doppelt vorkommende Werte.

    (PS: korrekterweise müsste die zweite Funktion übrigens bei digit ={1,2,3,4} und my.digit={1,5,5,1} 0 ausgeben - die erste 1 steht schon richtig, die zweite 1 hat kein Gegenstück in der Lösung.)

    nein sortieren darf ich den array nicht da sonst der sinn des Mastermindspiels verloren geht:

    ich hab einen ansatz aber leider noch nicht ganz richtig , hab eine temp eingeführt...

    die variable status hab ich global damit die gefundenen stellen von locationRight nicht nochmal mitgezählt werden
    leider ist das ergebnis immer noch falsch wenn auch etwas verbessert 🙄
    bsp.
    zu ratende zahl ist: 6414 ;meine eingabe ist: 1455
    und es kommt raus es wären sonst richtig : 3 😕

    int status=0;
    int MastermindDigits::locationRight(MastermindDigits& my)const
    {
    	cout<<"locationRight"<<endl;
    	status=0;
    	for (int i=0; i<=3; i++)
    	{
    		if(digits[i]==my.digits[i])
    			status++;
    
    	}
    	cout<<"Computerantwort: "<<status<<" an der richtigen Stelle;"<<endl;
    	return status;
    }
    
    int MastermindDigits::locationWrong(MastermindDigits& my)const
    {
    	cout<<"locationWrong"<<endl;
    	int numberright=0; 
    	int temp=0;
    	for (int i=0; i<=3; i++)
    	{
    		for (int y=0; y<=3; y++)
    		{
    		if((digits[i]==my.digits[y])&&(digits[i]!=temp) )
    			{	
    				temp=my.digits[y];
    				numberright++; 
    			}
    		}	
    	}
    	cout<<"sonst richtig sind: "<<numberright-status<<endl;;
    return numberright;
    }
    

    zur besseren erläuterung noch die main

    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout<<"****Mastermind****"<<endl;	
    
    	MastermindDigits ComputerDigits;
    	 int status=0;
    
    	do{
    		cout<<"Bitte 4stellige Zahl zwischen 1-6 eingeben:";
    		int computerNumber;
    		cin>>computerNumber;
    		MastermindDigits MyDigits = computerNumber;
    		cout<<"Ihre Eingabe ist:"<<MyDigits<<endl;
    		status= (ComputerDigits.locationRight(MyDigits));	
    
    		if (status<4)
    			ComputerDigits.locationWrong(MyDigits);
    
    	}while(status!=4);
    
    	cout<<"\nalles richtig!";
    	return 0;	
    }
    


  • sten schrieb:

    nein sortieren darf ich den array nicht da sonst der sinn des Mastermindspiels verloren geht:

    Dann sortierst du halt nicht das Original-Array, sondern eine Kopie 😉



  • CStoll schrieb:

    sten schrieb:

    nein sortieren darf ich den array nicht da sonst der sinn des Mastermindspiels verloren geht:

    Dann sortierst du halt nicht das Original-Array, sondern eine Kopie 😉

    hehe... 😉 , stimmt... 😃
    das is schonmal ne idee, werds probieren

    achja falls einer mal den quellcode anschauen will.. und noch nee idee hat.. gerne hier posten. 😉
    http://www.icefighters.eu/PG2LAB1.rar


Log in to reply