Master Mind

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Master Mind

    Che errori hai? di compilazione o di logica?
    Il programma di test in C++ definitivo è questo:
    
    #include <iostream>
    
    using namespace std;
    string solution = "FAAD";
    
    string cerca (string attempt){
        string strike="";
        string bal="";
        string tempsolution=solution;
        for (int i=0 ; i<4; i++)
            if (attempt[i] == tempsolution[i]){
                strike+="X"; // è uno strike aggiungo una X
                attempt[i]='0'; // evita conteggio come bal
                tempsolution[i]='1'; // evita il riuso del carattere
            }
    
        for (int in=0 ; in<4; in++){
            for (int ou=0 ; ou<4; ou++)
                if (attempt[in] == tempsolution[ou]){
                    bal+="O"; // è un bal aggiungo una O
                    attempt[in]='0'; // evita doppio conteggio
                    tempsolution[ou]='1'; // evita il riuso del carattere
                }
        }
        return strike+bal;
    }
    
    int main()
    {
        string ss;
        string ris;
        cout << "Soluzione " << solution << endl;
    
        do{
            do{
                cout << endl << "Tua sequenza: ";
                cin >> ss;
            }while (size(ss)!= 4);
            ris = cerca(ss);
            cout << ss << " = " << ris;
        }while (ris != "XXXX");
        cout << endl << "Sequenza trovata " << endl;
        return 0;
    }
    
    Comunque il C++ deve compilare il codice C, dacci più info.
  • Re: Master Mind

    Salve a tutti, ho terminato il programma " Mastermind" ma sto riscontrando un ultimo problema dal quale non ne esco fuori.
    Mi spiego: se provate a giocare, una volta premuto ESC, insieme alla tabella dei punteggi viene stampato " un bol " alla riga sotto l'ultimo tentativo provato.
    Vi lascio il frammento di codice dove ho gestito il controllo dei bal e degli strike (scritto prendendo spunto da @rubik) perchè penso che il problema nasca da qui.
    
    	do{
    		for(x=0;x<4;x++){ 
    			temporary[x]=solution[x];}
    		do{
    			car=getch();
    			fin=time(NULL); sec=difftime(fin,ini);
    			if(car>=65 and car<=70 and c!=4 ){ putch(car);attempt[c]=car;c=c+1;}	
    			if(car>=97 and car<=102 and c!=4 ){car=car-32;putch(car); attempt[c]=car; c=c+1;}//If the users hasn't activeted the block maiusc 
    			if (car==8 and c>0 ) {putch(8);putch(32);putch(8);c=c-1;}
    		}while((car!=13 or c!=4)and(car!=27)); 
    		strike=0;n_attempts=n_attempts+1;  
    		cout<<"    "; 
    		for (int i=0 ; i<4; i++){
            	if (attempt[i] == temporary[i]){
                	putch('X'); 
                	attempt[i]='0'; // evita conteggio come bal
                	temporary[i]='1';// evita il riuso del carattere
    				strike++;} // è uno strike aggiungo una X
            }	
        	for (int in=0 ; in<4; in++){
            	for (int ou=0 ; ou<4; ou++){
    		
                	if (attempt[in] == temporary[ou]){
                    putch('O');
                    attempt[in]='0'; // evita doppio conteggio
                    temporary[ou]='1';} // evita il riuso del carattere
        		}
        	}n=n+1;gotoxy(15,n); c=0;
    	}while(car!=27 and strike!=4 and n_attempts<n_max_attempts  );
    	
    	
    
  • Re: Master Mind

    Mi piacerebbe provare a giocare

    Ma magari mi sarebbe più facile avendo tutto il programma
  • Re: Master Mind

    @StandardOil ecco a te!
    
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <time.h>
    #include <iostream>
    using namespace std;
    char car; 
    int g,game;		//counter of games and the arguments for called function check input (number)
    float t_dif;		//global variables for time 
    time_t ini,fin; 
    /*P R O T O T Y P E  */ 
    // H E A D E R    O F     G O T O X Y    F U N C T I O N 
    void gotoxy( short column, short line );
    
    void reset_game(); //reset game at the end of one play
    
    int esc_function(); //function to manage the esc botton    
    
    void read_input(string outstr, char& car);//input check
    
    void continuous(); //function to continue with the game
    	
    void about();// information about the program and its creators
    	
    	
     /*******M A I N   F U N C T I O N *******/	
     							
    int main(){
    	int i,j,c,n,x; //counters 
    	int n_attempts,sec,strike,score;
    	const int n_max_attempts=10,score_max=1000,attempt_max=60;
    	char solution[4],attempt[4],random,temporary[4];
    	game=1,i=0,c=0,j=0;
    
    	gotoxy(40,2);
    	cout<<"---MASTER MIND---"<<endl;
    	read_input(" Insert 1 to 9 for number of games (0==10), ",car);
    	
    
    do{
    	n_attempts=0; //set  number of attempts
    	
    	system("cls");
    	gotoxy(40,2);
    	cout<<" MISTER MIND by anonymous  ";
    
    	
    	
    	/***T H I N K    T H E   S O L U T I O N***/
    	srand(time(0));
    	for(i=0;i<4;i++){
    		random=rand()%6+65;
    		solution[i]=random;}
    	
    	//S T A R T    P L A Y
    	gotoxy(10,4);
    	cout<<" Game number "<<game<<" of "<<g;
    
    	
    	n=6;gotoxy(15,n);//set the position to put the attempt
    
    	ini=time(NULL); //Set time NULL
    	/// Loading the attempt array  
    	do{
    		for(i=0;i<4;i++){ 
    			temporary[i]=solution[i];}
    		do{
    			car=getch();
    			fin=time(NULL); sec=difftime(fin,ini);
    			if(car>=65 and car<=70 and c!=4 ){ putch(car);attempt[c]=car;c=c+1;}	
    			if(car>=97 and car<=102 and c!=4 ){car=car-32;putch(car); attempt[c]=car; c=c+1;}//If the user hasn't activeted the block maiusc 
    			if (car==8 and c>0 ) {putch(8);putch(32);putch(8);c=c-1;}
    		}while((car!=13 or c!=4)and(car!=27)); 
    		strike=0;n_attempts=n_attempts+1;  
    		cout<<"    "; 
    		for (int i=0 ; i<4; i++){
            	if (attempt[i] == temporary[i]){
                	putch('X'); 
                	attempt[i]='0'; // avoiding count like a bal
                	temporary[i]='1';///avoiding reuse the char
    				strike=strike+1;} 
            }	
    		for (int x=0 ; x<4; x++){
            	for (int j=0 ; j<4; j++){
                	if (attempt[x] == temporary[j]){
                    	putch('O'); 
                    	attempt[x]='0'; //avoiding double count
                    	temporary[j]='1';} ///avoiding reuse the char 
                }
        	}n=n+1;gotoxy(15,n); c=0;
    	}while(car!=27 and strike!=4 and n_attempts<n_max_attempts  );
    	score=score_max-sec;
    	score=score-n_attempts*attempt_max;
    	if(n_attempts==n_max_attempts) score=0;
    	if(score<0) score=0; 
    	if(car==27) score=0;
    	gotoxy(50,8);
    	cout<<"   ---SCORE TABLE---  ";
    	gotoxy(48,10);
    	cout<<" game  tries  sec  score ";
    	gotoxy(48,12);
    	cout<<"   "<<game<<"     "<<n_attempts<<"     "<<sec<<"     "<<score;
    	if(strike==4){cout<<"\n\n  ***YOU WIN*** ";putch(7);}
    	cout<<"\n *** ";
    	for(j=0;j<4;j++){
    		printf("%c",solution[j]);} cout<<" *** ";
    	reset_game();
    	
    }while(car!=27 and car==13 );
    return 0;
    }
    	/*F U N C T I O N S*/
    void gotoxy( short column, short line ){ //position of the text on screen 25 lines and 80 columns
      COORD pos={column,line};
      SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE ),pos);}
    
    void reset_game(){
    	gotoxy(28,26);
    	printf("Click the key to continue-->");
    	do{
    		car=getch();
    	}while(car==0 and car!=27);//loops car!=0 and car== esc
    	esc_function();game=game+1;
    	if(game>g){system("cls");read_input(" Insert 1 to 9 for number of games, ",car);game=1;}
    }
      
    int esc_function(){if(car==27){{system("cls");gotoxy(40,15);cout<<"----Thanks to played! bye!---- ";ini=time(NULL);do{ fin=time(NULL); t_dif=difftime(fin,ini);} while(t_dif<3);exit(true);return (0);}}} //function to manage the esc botton
    
    void read_input(string outstr, char& car){
    	int numCifre=0; 
    	gotoxy(40,2);
    	cout<<"---MASTER MIND---"<<endl;
    	gotoxy(10,5);
    	cout<<outstr;
    	gotoxy(10,6);
    	cout<<" Insert h for more information about the program";
    	gotoxy(10,7);
    	cout<<" ===> ";
    	do{
    		car=getch(); 
    		if(car==48 and numCifre!=1){numCifre++;putch(car);g=(int)car-48; g=g+10;}// 0==10 games
    		if (car>=49 and car<=57  and numCifre!=1)  {numCifre++;putch(car);g=(int)car-48;} //numCifre allows one caracters 
    		if (car==8 and numCifre>0) {numCifre--;putch(8);putch(32);putch(8);}	//8==back space, 32==spazio	
    	}while (car!=13 and car!=27 and car!='h' and car!='H' ); // 13==invio 27==esc 
    	if(car=='h' or car=='H') about(); 
    	esc_function();
    } 
    void continuous(){
    	gotoxy(28,26);
    	printf("Click the key to continue-->");
    	do{
    		car=getch();
    	}while(car==0 and car!=27);//loops car!=0 and car== esc
    	esc_function(); 
    	system("cls");read_input(" Insert 1 to 9 for number of games, ",car);}
    	
    void about(){ // information about the program and their creators
    	system("cls");
    	gotoxy(40,1);
    	cout<<" RULES OF THE GAME ";
    	cout<<"\n The Master Mind game consists of deciphering a secret code consisting of four letters, ";
    	cout<<"\n arranged in a random way by the computer";
    	cout<<"\n At each attempt the computer responds:";
    	cout<<"\n with strike (X) if one or more letters have been guessed and are in the correct position,";
    	cout<<"\n with bool (O) if one or more letters have been guessed but are in the wrong position.";
    	cout<<"\n If it does not answer with any of the above options,";
    	cout<<"\n it means that the letters of the created combination are not part of the solution combination.";
    	cout<<"\n Thinking about these answers to the combinations hypothesized in the various attempts,";
    	cout<<"\n  you should be able to decipher the code in less than ten attempts: otherwise the game is lost.";
    	gotoxy(40,11);
    	cout<<"\n ***EXAMPLE OF ONE GAME*** ";
    	cout<<"\n You can use 6 different letters: A,B,C,D,E,F. The max lenght is 4 characters ";
    	cout<<"\n Click Esc for exit from the game, and single play ";
    	cout<<"\n The score is calculated taking into account the number of attempts and the time taken";
    	cout<<"\n              EXAMPLE                        SOLUTION:  FAAD      ";
    	cout<<"\n 1296 possible configurations in the attempt N.1-->     BCFD    XO   (1 strikes and 1 bal)";
    	cout<<"\n 252  possible configurations in the attempt N.2-->     FFDD    XX   (2 strikes and 0 bal)";
    	cout<<"\n 16   possible configurations in the attempt N.3-->     BDBB    X    (1 strikes and 0 bal)";
    	cout<<"\n 8    possible configurations in the attempt N.4-->     BCFD    XOO  (1 strikes and 2 bals)";
    	cout<<"\n 1    possible configurations in the attempt N.5-->     FAAD    XXXX ***SOLUTION!***  (4 strikes and 0 bal)"<<endl;
    	cout<<"\n               ***The game was  created by anonymous ***               ";
    	continuous();}
    
  • Re: Master Mind

    Guarda, io per fortuna o purtroppo non ho windows, quindi non ho potuto provare il tuo propgramma
    ho cercato di guardarci dentro, ma non sono riuscito a seguirlo, e allora mi sono riscritto le due funzioni per confrontare le stringhe, quella per avere i bal e quella per avere gli strike

    mi sono venute così:
    
    /*
     * mastermind.c
     *
     * 06-02-2021 Nelson "Standardoil"
     * Sentitevi liberi di trarre ispirazione
     * L'ammiraglio non si offende
     *
     *
     */
    
    
    #include <stdio.h>
    
    int strike(char * s, char * t)
    {
       int r = 0;
    
       while(*s)
       {
          r = r + (* s++ == * t++);
          // confronto le stringhe pari a pari
       }
    
       return r;
    }
    int bal(char * s, char * t)
    {
       int r = -strike(s, t);
       // tolgo preventivamente dai bal gli strike che provocherebbeo dei falsi conteggi
       char * tt;
       // per ripercorrere la stringa tentativo tante volte quante serve
       while(*s)
       {
          tt = t;
    
          while(*tt)
          {
             if(*s == *tt++)
             {
                r++;
                break;
                // il bal si conta una volta sola
             }
          }
    
          s++;
       }
    
       return r;
    }
    
    
    int main(int argc, char **argv)
    {
       char risposta[] = "abcd";
       printf("programma per il mastermind\n");
       char * tentativi[] = {"aaaa", "bbbb", "abcd", "cccc", "dddd", "dcba"};
       int taglia = sizeof tentativi / sizeof tentativi[0];
    
       for(int i = 0 ; i < taglia; i++)
       {
          printf("Tentativo: %s, strike: %d, bal: %d\n", tentativi[i], strike(risposta, tentativi[i]), bal(risposta, tentativi[i]));
       }
    
       return 0;
    }
    
    
    ci ho scritto anche una main minimale per provarle
    mi sembrano più lineari così...
  • Re: Master Mind

    Dany30 ha scritto:


    Salve a tutti, ho terminato il programma " Mastermind" ma sto riscontrando un ultimo problema dal quale non ne esco fuori.
    Mi spiego: se provate a giocare, una volta premuto ESC, insieme alla tabella dei punteggi viene stampato " un bol " alla riga sotto l'ultimo tentativo provato.
    Vi lascio il frammento di codice dove ho gestito il controllo dei bal e degli strike (scritto prendendo spunto da @rubik) perchè penso che il problema nasca da qui.
    
    	do{
    		for(x=0;x<4;x++){ 
    			temporary[x]=solution[x];}
    		do{
    			car=getch();
    			fin=time(NULL); sec=difftime(fin,ini);
    			if(car>=65 and car<=70 and c!=4 ){ putch(car);attempt[c]=car;c=c+1;}	
    			if(car>=97 and car<=102 and c!=4 ){car=car-32;putch(car); attempt[c]=car; c=c+1;}//If the users hasn't activeted the block maiusc 
    			if (car==8 and c>0 ) {putch(8);putch(32);putch(8);c=c-1;}
    		}while((car!=13 or c!=4)and(car!=27)); 
    		strike=0;n_attempts=n_attempts+1;  
    		cout<<"    "; 
    		for (int i=0 ; i<4; i++){
            	if (attempt[i] == temporary[i]){
                	putch('X'); 
                	attempt[i]='0'; // evita conteggio come bal
                	temporary[i]='1';// evita il riuso del carattere
    				strike++;} // è uno strike aggiungo una X
            }	
        	for (int in=0 ; in<4; in++){
            	for (int ou=0 ; ou<4; ou++){
    		
                	if (attempt[in] == temporary[ou]){
                    putch('O');
                    attempt[in]='0'; // evita doppio conteggio
                    temporary[ou]='1';} // evita il riuso del carattere
        		}
        	}n=n+1;gotoxy(15,n); c=0;
    	}while(car!=27 and strike!=4 and n_attempts<n_max_attempts  );
    	
    	
    
    Il tuo codice non entra nel gioco se compilato con gcc in MinGW, che compilatore usi?
    Perché non ci dici quale sequenza e con quali input hai degli output sbagliati?
    Così verifico se il problema è dato dal codice che ti ho consigliato.
  • Re: Master Mind

    Ciao @Rubik,io uso il compilatore di default, cioè quello che viene messo a disposizione appena installi Dev-C++.
    Per quanto riguarda il codice ho risolto facendo un if e valutando se il carattere fosse diverso da 27( esc in ASCII ).
    Questo perchè nel momento in cui il giocatore preme ESC durante un tentavivo, il programma esce dal do-while, e senza alcun vincolo esegue il resto, ovvero la soluzione da te proposta, facendo per l'appunto parecchio casino.
    Ciao!
  • Re: Master Mind

    Dany30 ha scritto:


    Ciao @Rubik,io uso il compilatore di default, cioè quello che viene messo a disposizione appena installi Dev-C++.
    Per quanto riguarda il codice ho risolto facendo un if e valutando se il carattere fosse diverso da 27( esc in ASCII ).
    Questo perchè nel momento in cui il giocatore preme ESC durante un tentavivo, il programma esce dal do-while, e senza alcun vincolo esegue il resto, ovvero la soluzione da te proposta, facendo per l'appunto parecchio casino.
    Ciao!
    Sono contento che hai risolto e che il mio codice non ha bug.
    Nelle spiegazioni ci sono degli errori:
    
    cout<<"\n              EXAMPLE                        SOLUTION:  FAAD      ";
    	cout<<"\n 1296 possible configurations in the attempt N.1-->     BCFD    XO   (1 strikes and 1 bal)";
    	cout<<"\n 252  possible configurations in the attempt N.2-->     FFDD    XX   (2 strikes and 0 bal)";
    	cout<<"\n 16   possible configurations in the attempt N.3-->     BDBB    X    (1 strikes and 0 bal)";
    	cout<<"\n 8    possible configurations in the attempt N.4-->     BCFD    XOO  (1 strikes and 2 bals)";
    	cout<<"\n 1    possible configurations in the attempt N.5-->     FAAD    XXXX ***SOLUTION!***  (4 strikes and 0 bal)"<<endl;
    
    Dovrebbe essere:
    
    cout<<"\n              EXAMPLE                        SOLUTION:  FAAD      ";
    	cout<<"\n 1296 possible configurations in the attempt N.1-->     BCFD    XO   (1 strike and 1 bal)";
    	cout<<"\n 252  possible configurations in the attempt N.2-->     FFDD    XX   (2 strikes and 0 bal)";
    	cout<<"\n 16   possible configurations in the attempt N.3-->     BDBB    O    (0 strike and 1 bal)";
    	cout<<"\n 8    possible configurations in the attempt N.4-->     BCFD    XO   (1 strike and 1 bal)";
    	cout<<"\n 1    possible configurations in the attempt N.5-->     FAAD    XXXX ***SOLUTION!***  (4 strikes and 0 bal)"<<endl;
    
  • Re: Master Mind

    @Rubik hai ragione ora ricontrollerò meglio!
    Grazie!
Devi accedere o registrarti per scrivere nel forum
23 risposte