Una valutazione euristica delle mosse possibili può essere fatta assegnando un punteggio ad
ogni casella vuota, in base alla situazione
delle pedine sulle due linee adiacenti (ogni casella appartiene a due
possibili sequenze).
Ogni linea è composta da tre caselle; indichiamo
ogni casella con un numero (ai fini della valutazione non ha alcuna importanza la
disposizione delle tre caselle):
- a sinistra la mossa da valutare: vale 1 o 2
secondo chi deve muovere (Who)
- al centro la casella adiacente: vale 0 se
vuota, 1 o 2 se occupata da una pedina.
- a destra l'altra casella: vale 0 se vuota, 1 o
2 se occupata da una pedina.
Indicando in binario i tre numeri (due bit
ciascuno) e concatenando i bit, avremo che ogni configurazione è rappresentata
da un numero a 6 bit, che può essere usato come indice per l'accesso alla
tabella dei punteggi relativi.
Sia, ad esempio, 1=01 la pedina gialla e 2=10 la pedina blu:
Configurazione
|
Who |
|
Punti |
|
16 = 01 00 00
|
 |
 |
1 |
apre il gioco
|
17 = 01 00 01
|
 |
 |
7 |
tenta il tris
|
18 = 01 00 10
|
 |
 |
3 |
ostacola il tris
|
20 = 01 01 00
|
 |
 |
7 |
tenta il tris
|
21 = 01 01 01
|
 |
 |
31 |
vince !
|
22 = 01 01 10
|
 |
 |
0 |
mossa inutile
|
24 = 01 10 00
|
 |
 |
3 |
ostacola il tris
|
25 = 01 10 01
|
 |
 |
0 |
mossa inutile
|
26 = 01 10 10
|
 |
 |
15 |
blocca un tris
|
32 = 10 00 00
|
 |
 |
1 |
apre il gioco
|
33 = 10 00 01
|
 |
 |
3 |
ostacola il tris
|
34 = 10 00 10
|
 |
 |
7 |
tenta il tris
|
36 = 10 01 00
|
 |
 |
3 |
ostacola il tris
|
37 = 10 01 01
|
 |
 |
15 |
blocca un tris
|
38 = 10 01 10
|
 |
 |
0 |
mossa inutile
|
40 = 10 10 00
|
 |
 |
7 |
tenta il tris
|
41 = 10 10 01
|
 |
 |
0 |
mossa inutile
|
42 = 10 10 10
|
 |
 |
31 |
vince !
|
I punteggi sono scelti in modo che due configurazioni di una
categoria valgano meno di una di categoria superiore. Costruiamo ora un array di
interi con l'elenco dei punteggi corrispondenti a ciascuna configurazione: int
PuntiMossa[ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 7, 3, 0, 7, 31, 0, 0, 3, 0, 15, 0, 0, 0, 0, 0,
1, 3, 7, 0, 3, 15, 0, 0, 7, 0, 31, 0, 0, 0, 0, 0 }; Ad
esempio, per valutare la bontà di una mossa per Who nella casella 0, si usano
le configurazioni delle coppie di caselle 1-2 e 9-21
Punteggio = PuntiMossa [(Who<<4)+(Tavola[ 1]<<2)+Tavola[ 2] ] +
PuntiMossa [(Who<<4)+(Tavola[ 9]<<2)+Tavola[21] ] ; Nel
programma, scritto in C, costruiamo 24 funzioni, una
per ciascuna casella, e inseriamo gli indirizzi in un array di puntatori a
funzione: int (*ValoreCasa[ ])( int ) = { Casa00, Casa01,
. . . ., Casa23};
|