[ Nikolavlasotince @ 23.03.2008. 00:23 ] @
Poceo sam da pravim igru MasterMind ali sam naisao na problem kako naterati kompjutera da misli. Kompjuter uvek zna koja je dobitna kombinacija a bilo bi glupo da kompjuter u prvom potezu napise resenje. Da li neko moze da mi pomogne kako to da napravim? Treba da u 6 pokusaja, od 6 ponudjenih znakova (neka budu 1, 2, 3, 4, 5 i 6) dodjem do resenja koje se sastoji od 4 znakova. Nadam se da me razumete. Potrebna mi je pomoc pls.

Pozz
[ vlaiv @ 25.03.2008. 14:42 ] @
Probaj nekim "tezinskim" sistemom, odnosno sistemom verovatnoce.

recimo da si izbacio kombinaciju

1,2,3,4

i dobio 2T i 1P (dva tacna i jedan prisutan)

svakom od brojeva 1,2,3,4 dodeljujes odgovarajuce verovatnoce (verovatnocu da je prisutan i verovatnocu da je na tacnoj poziciji)

Sledece sto trebash da uradish jeste da smislis nacin provere da li si bio u pravu odnosno korekcije verovatnoca (dok ih ne doterash do jedan)
tako sto ces u sledecem potezu neke ostaviti a neke druge brojeve ubaciti.

Nivo tezine mozes da organizujes tako sto ces ubaciti randomnes u procesu dodeljivanja verovatnoce (recimo 80% ce tacno dodeliti verovatnocu
a 20% slucajeva ce nesto prevideti)

Naravno sve na kraju ide na empirijsku proveru.

Nadam se da sam ti dao bar neke kvalitetne smernice.
[ Nikolavlasotince @ 28.03.2008. 11:26 ] @
OK. Thanks. Pomoglo mi je dosta. Sad cu pokusati da napravim nesto.
[ Fitopatolog @ 22.06.2008. 12:03 ] @
Proveren algoritam je sledeći:
1. korak: nasumice generišeš četvorocifren broj (umesto cifara možeš koristiti i boje, ali da se zadržimo na ciframa), npr 4223. Ovaj broj ćemo zvati "tekući".
2. korak: igrač unosi ocenu (broj belih i broj crnih poena). Ako je broj crnih poena 4 - pogodio si, kraj programa.
3. korak: povećaš tekući broj za jedan.
4. korak: proveriš da li novi tekući broj može da dobije svaku od ocena koje je do sada dobio (crne i bele poene). Ako može, izbaciš ga na ekran kao predlog za sledeće rešenje i ideš na korak 2. Ako si došao do broja 4222 (jedan manje od broja generisanog u koraku 1), igrač je negde uneo pogrešnu ocenu (rešenje nije nađeno) i zbog toga izlaziš iz programa. Ako tekući broj ne može da dobije sve do sada dobijene ocene, ideš na korak 3.

Za početak možeš da u prvom koraku kreneš od 0000, ali je interesantnije ako se ovaj broj generiše na slučaj. Mislim da je srednji broj pokušaja (do tačnog rešenja) (za četvorocifrene brojeve) u tom slučaju oko 5.
[ Fitopatolog @ 26.10.2008. 13:33 ] @
Evo i demo-verzije programa. Ne zaboravite da između ocene za bele i ocene za crne poene ubacite bar jedan blank!
[ Fitopatolog @ 05.09.2009. 18:30 ] @
Nikola, kako napreduje igrica?
[ Fitopatolog @ 10.01.2010. 00:16 ] @
Poboljšana verzija...
[ Fitopatolog @ 13.11.2023. 19:57 ] @
// prilagodjeno za gcc

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>

const char *kraj="9999";

class komb {
char broj[5];
int crno;
int belo;
komb *sled;
public:
komb () { strcpy ( broj, "0000"); belo=0; crno=0; sled=NULL;};
komb ( char *a, komb *k) { strcpy (broj, a); belo=0; crno=0; sled=k;}
void ubaci_ocenu ( int icr, int ibe ) { crno=icr; belo=ibe;};
komb *uzmi_sled () { return sled; };
int oceni ( char [5] );
};

int komb::oceni ( char aa[5]) {
int cr=0;
int be=0;
int i;
int j;
char b[5];
char a[5];

strcpy ( b, broj);
strcpy ( a, aa);
for ( i=0; i<4; i++) { if (a==b) { cr++; a=' '; b=' ';};};
for ( i=0; i<4; i++) {
if ( a==' ' ) continue;
for ( j=0; j<4; j++) {
if (b[j]==' ') continue;
if (i==j) continue;
if (a==b[j]) { be++; a=' '; b[j]=' '; break;};
};
};
// cout << "KKKK" << broj << '$' << aa << '$' << cr << crno << be << belo << "***\n";
if ( (be==belo) && ( cr==crno)) return 0; else return 1;

};

int povecaj ( char *a )
{
char aa[5];

if (strcmp (a,kraj)==0) {
std::cout << " **** Negde je pogreseno kod ocenjivanja! ***\n";
exit (0);
};
strcpy (aa,a);
int prenos=0;
for ( int i=3; i>-1; i--) {
aa++;
if(aa>'9') {prenos=1; aa-=10;} else prenos=0;
if (prenos==0) break;
};

strcpy ( a,aa);
return prenos;
};

int main ( )
{
komb *tek=new komb;
komb *prvi=tek;
char a[5]="0000";
int icr;
int ibe;
int ok;

std::cout << "------- Wellcome to DULE's MASTER MIND -------\n\n\n";

std::cout << a << "<---PREDLOG (ocenite prvo crne pa bele!) ";
std::cin >> icr >> ibe;
tek->ubaci_ocenu ( icr, ibe);
if (icr==4) exit(0);

do {
while ( tek->oceni(a)!=0) povecaj(&a[0]);
do {
if (tek=tek->uzmi_sled()) {
ok=tek->oceni(a);
if ( ok!=0) break;} else ok=0;
} while (tek);
if (ok!=0) { tek=prvi; povecaj(&a[0]); continue;};
prvi=tek=new komb(&a[0], prvi);
std::cout << a << "<---PREDLOG (ocenite prvo crne pa bele!) ";
std::cin >> icr >> ibe;
tek->ubaci_ocenu ( icr, ibe );
} while (icr<4);

return 0;

}