

		Spacca 0.1 1998
		ACME inc.
        	Copyleft Tanatos Fobos


*Cosa:
\-----------------------------------------------------------------------
Gioco dello spaccafiletto, forza quattro in una scacchiera 7x7 si puo
mettere il pallino dove si vuole, bisogna fare una sequenza di pallini
contigui dello stesso colore (serie) lunga 4.

Metodo generale:
\-----------------------------------------------------------------------
Ricerca depth first [con alfa-beta cut] e euristica ad hoc che restituisce
un float (120 se vincente -120 se perdente o qualcosa del genere)
Il valore viene dato dal punto di vista del giocatore 1 (palle) quindi
una situazione di vantaggio di 2 (croci) verra segnalata con un numero
negativo (-120 in particolare significa vittoria delle croci)

Descrizione Euristica:
\-----------------------------------------------------------------------
Conta numero di serie fattibili gia iniziate pesate con il numero di
pallini che contengono.
La pura somma dei valori dei loci non basta perche non tiene conto delle
notazioni pragmatiche qui di seguito.
In particolare sono vincenti le situazioni:

1) Occhiello
-xxx-  0xxx- 0xxxx     anche lungo una verticale o diagonale

2) Angoletto
  -       -      -
  -       -      x
-xx--   -xx0-  -xx0-   ricadendo nella precedente
  x       x      x
  -       -      -
2bis) Ics (con diagonali)
-      -
 -   -     vedi sopra (ruotando il tutto)
   x
  x x
 -   -

-Due loci che si sovrappongono sono meglio di due loci lontani
-Due loci che si sovrappongono lungo la stessa direzione di valore 3 (-3)
sono vincenti (perdenti) (_xxx_)
-fare una serie da tre e inutile a meno che non se ne creino due
 contemporanemente
-creare due (2) serie da tre (3) e una situazione vincente
-non bloccare una serie da tre dell'avversario e perdente
-una serie da due va bloccata a meno che non sia contro il muro

Rappresentazione dello stato:
\-----------------------------------------------------------------------
ci sono quattro (4) possibili serie per riga e colonna
4 per la diagonale centrale (NO,SE)
3 per le due sopra (quindi 2 1) e sotto
altrettante per le diagonali (NE,SO)
totale 4*7*2 + 4*2 + 2*2*(3 + 2 + 1) = 88 (ottantotto)
(56 solo orizzontali e verticale)

L'euristica deve calcolare lo stato di ognuna di queste 88 potenziali
serie, la funzione prossimo stato deve sapere quali posizioni, in
termini di (x,y), sono ancora giocabili ed eventualmente eliminarne
alcune.

Si ordinano le posizioni della scacchiera da 1 a 49: quindi la posizione
e un numero. Si ordinano da 1 a 88 anche le serie fattibili quindi una
serie fattibile e' un numero, chiamo l'insieme delle serie fattibili loci.
Valore di un locus (singolare di loci) e' funzione del numero di piroli
dei due tipi che contiene. Pirolo e il segno che distingue i due giocatori.

Valore
0		: locus vuoto
1,2,3,4		: numero di piroli di tipo 0 (pallino)
-1,-2,-3,-4	: numero piroli tipo x (croce)
9		: piroli dei due tipi
NB: 9    -> locus bruciato
    4,-4 -> vittoria o perdita (dipende dal punto di vista)
    0    -> locus non interessante (o no??)

Lo stato e' formato da:
-lista posizioni ancora libere
-lista delle serie fattibili e loro valore

Esiste un array costante mappa che per ogni serie fattibile elenca
le sue posizioni.
ESEMPI
 mappa[1] <riga in alto a sinistra> = [1,2,3,4]
 mappa[..] <diagonale NE,SO in alto a sinistra> = [1,9,17,25]

Esempio  valore struttura dati
 ---- ..
|xx__

 libere: non conterra i valori 1 e 2
 loci:   contiene il locus 1
 vloci:	 in posizione 1 (prima orizzontale) contiene il valore -2
 		 2 croci nel locus.
 scac:   in posizione 1 e 2 c'e il valore 2, in posizione 3 ,4 il valore 0

L'euristica
-somma tutti i valori
-malus al doppio 3 avversario (bonus al mio doppio 3)
 [da correggere distinguendo i loci contro al muro]

Array CONTIGUI
\-----------------------------------------------------------------------
Un array contiguo e tale se le estrazioni possono essere fatte in
qualsiasi punto mentre le inserzioni si possono fare solo in fondo
e la posizione 0 (zero) non viene usata e tutte le posizioni da 1
a n sono piene e da n+1 in poi sono vuote.

Legenda
\-----------------------------------------------------------------------
PIROLO: valore 0,1,2 quale pedina e stata messa in un certo punto della
		scacchiera (0 significa nessuna pedina)
SERIE:  insieme di 4 posizioni contigue sulla scacchiera
FILETTO:serie (e locus) riempita da 4 pedine dello stesso colore
LOCUS:	serie in cui uno dei due giocatori possa fare filetto(contiene
		unnumero variabile di piroli di un solo tipo)
