Ciao a tutti!
Un po’ di tempo fa ho proposto un forum riguardante il gioco del Mister Mind.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Riassumo in breve per chi non sa di cosa stia parlando:
Master mind è un gioco di logica, nel quale il giocatore deve essere in grado di capire la combinazione segreta. Per farlo il programma, a partire da una sequenza che il giocatore ritiene che possa essere la combinazione segreta, risponde con uno strike 'X' se LA LETTERA E' GIUSTA E STA AL POSTO GIUSTO, mentre con un bal 'O' SE C'E' LA LETTERA GIUSTA MA E' AL POSTO SBAGLIATO. Si possono utilizzare lettere dalla A alla F, con una lunghezza massima di 4 caratteri.
****ESEMPIO****: SOLUZIONE: FAAD
***tentativi del giocatore****
1° BCFD XO (1 strikes and 1 bal)
2° FFDD XX (2 strikes and 0 bal)
3° BDBB X (1 strikes and 0 bal)
4° BCFD XOO (1 strikes and 2 bals)
5° FAAD XXXX ***SOLUTION!***
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ora voglio fare il contrario, ovvero il player diventa il computer e l’utente conosce la combinazione secreta dando le due indicazioni X,O ad ogni tentativo del computer.
Il pc, dunque, dovrà essere in grado di arrivare alla soluzione pensata dall’ utente.
Io ho agito in questo modo: il primo tentativo viene generato totalmente random, mentre per i successivi tentativi ho voluto farli in funzione del tentativo precedente e delle indicazioni che ha dato l’utente e generare alcune lettere in modo random.
ESEMPIO:
soluzione: DABF
tent 1 CBCD OO
ten2 FCEC O --> questo tentativo è stato generato per metà random, tenendo presente delle indicazioni (OO) del tentativo precedente.
ten3 DEBA XXO
tent4 DDBE XX
E così via.. Finché non arriva alla soluzione, dopo molti tentativi, questo si traduce in poca efficienza.
Perché ho fatto in questo modo?
Sarebbe stata una grossa perdita di tempo andare a scambiare le posizioni oppure cercare di capire quali scambiare e quali lasciare ferme.
Cosa non funziona?
Il codice che ho scritto arriva fino al secondo tentativo, fa inserire le indicazioni dell’ utente, ma poi nel momento in cui deve generare il terzo tentativo è come se entrasse in un loop infinito.
Inoltre, mi rendo conto che non è molto efficiente questo algoritmo, perché genera delle lettere random che in realtà non dovrebbero esserci, e questo lo si evince in base agli altri tentativi, quindi bisognerebbe ragionare sull’ insiemistica per poter togliere le lettere che molto probabilmente non sono nella soluzione.
Io ho scritto il seguente codice, ammetto di aver messo molta carne al fuoco, ma proposte e suggerimenti sono ben accetti:
#include <iostream>
#include <time.h>
#include <windows.h>
#include <conio.h>
#include <string>
using namespace std;
char car;
int main(){
int n_tentativi,i,j,c,x;
string tentativo1,tentativo2,indicazioni1,strike,bal,temporaneo,concatena,temporaneo1;
bool valido;
char lettere[6];
n_tentativi=1,c=0,valido=false;
do{
for( i=0;i<6;i++) lettere[i]=65+i; //riempe l'array lettere dalla A alla F
if(n_tentativi==1){
srand(time(NULL));
for(j=0;j<4;j++) tentativo1+=rand()%6+65; //generazione del primo tentativo completamente random
n_tentativi=n_tentativi+1;
cout<<tentativo1; cout<<" ";
}else{
do{
for(j=0;j<4;j++) tentativo2+=rand()%6+65;//generazione randomica del secondo tentativo in poi.
for(i=0;i<4;i++) temporaneo+=tentativo2[i]; temporaneo1+=tentativo1[i];
//controllo della validità del tentativo successivo, in funzione di quello precedente
for ( i=0 ; i<4; i++){
if (temporaneo1[i] == temporaneo[i]){
strike +='X';
temporaneo1[i]='0'; // avoiding count like a bal
temporaneo[i]='1';///avoiding reuse the char
}
}
for ( x=0 ; x<4; x++){
for ( j=0 ; j<4; j++){
if (temporaneo1[x] == temporaneo[j]){
bal+='O';
temporaneo1[x]='0'; //avoiding double count
temporaneo[j]='1';} ///avoiding reuse the char
}
}
concatena=strike+bal;
if(indicazioni1==concatena) { cout<<endl; cout<<tentativo2; valido=true;}
}while(!valido);
for(x=0;x<4;x++) tentativo1[x]=tentativo2[x]; //tentativo2 diventa il vecchio tentativo, cioè tentqativo1
valido=false;}
do{
car=getch();
if((car==88 or car==79) and c!=4 ){ putch(car);indicazioni1[c]=car;c=c+1;}
if((car==120 or car==111) and c!=4 ){car=car-32;putch(car); indicazioni1[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 and c!=4)and(car!=27));c=0;
}while(car!=27 and car==13); //27==ESC 13==INVIO
return 0;
}
Vi ringrazio!