Dezvoltarea unui AI pentru un joc de cărți tradițional, cum este Crucea, aduce provocări fascinante. Spre deosebire de șah, unde tabla este complet vizibilă, Crucea implică informație incompletă și un element de incertitudine majoră. În cadrul proiectului Cruce, am reușit să implementăm un motor de decizie bazat pe simulări Monte-Carlo (MCTS) care „simte” jocul aproape ca un jucător experimentat.
Arhitectura deciziei: Scorul per carte
Nucleul botului nostru nu se bazează pe reguli rigide, ci pe o evaluare dinamică a fiecărei cărți din mână. Funcția de scor (scoreTrick) analizează nu doar valoarea intrinsecă a cărții, ci și probabilitatea de a câștiga trucul curent, combinată cu euristici privind retenția cărților mari pentru finalul jocului.
function scoreCard(card: Card, gameState: GameState): number {
const baseValue = card.rankValue;
const trickWinProbability = simulateTrickWin(card, gameState);
const retentionBonus = calculateRetentionValue(card, gameState.remainingCards);
// Aplicăm euristicile de risc
return (baseValue * 0.4) + (trickWinProbability * 0.4) + (retentionBonus * 0.2);
}
Strategii pe niveluri de dificultate
Pentru a oferi o experiență variată, am definit 9 adversari structurați pe 3 niveluri de dificultate. Fiecare nivel schimbă modul în care botul „vede” viitorul:
- Nivel Ușor (Ion, Maria, Vasile): Folosesc un rollout simplificat, bazat pe probabilități brute.
- Nivel Mediu (Elena, Dan, Andrei): Introduc eșantionarea ponderată, ținând cont de forța mâinii adverse estimate.
- Nivel Greu (Mihai, Ana, Radu): Aici intervine artileria grea: căutarea Minimax cu tăiere Alfa-Beta peste simulări Monte-Carlo.
const difficultyStrategy: Record<Difficulty, Strategy> = {
EASY: { rolloutDepth: 5, usePruning: false },
MEDIUM: { rolloutDepth: 15, usePruning: true },
HARD: { rolloutDepth: 50, usePruning: true, alphaBeta: true }
};
Eșantionare ponderată și riscul cognitiv
Cea mai mare provocare a fost modelarea „greșelilor cognitive”. Un bot care joacă perfect devine plictisitor și frustrant. Am introdus un coeficient de risc care permite AI-ului să facă erori deliberate, în funcție de personalitatea adversarului. De exemplu, un bot „agresiv” va supraevalua șansele de a tăia cu un atu, chiar dacă simulările arată un risc ridicat de pierdere a controlului.
Eșantionarea ponderată ne ajută să nu simulăm toate scenariile posibile, ci doar pe cele care sunt plauzibile având în vedere cărțile deja jucate. Dacă adversarul a arătat slăbiciune într-o culoare, botul va aloca mai multă „putere de calcul” simulărilor în care acel adversar nu mai are atuurile mari.
Concluzii tehnice
Implementarea acestui sistem a demonstrat că, în jocurile cu informație imperfectă, intuiția algoritmică (prin simulări Monte-Carlo) bate adesea forța brută. Trecerea de la un simplu bot bazat pe reguli la unul care „simulează viitorul” a transformat complet dinamica jocului. Indiferent dacă joci împotriva lui Ion sau a Anei, simți că ai în față un adversar care înțelege valoarea fiecărei cărți din pachet.
Ce urmează? Încercăm să implementăm un strat de Reinforcement Learning care să învețe din greșelile jucătorilor umani, pentru ca AI-ul să devină și mai imprevizibil.

