Volevo provare a creare una macchina di apprendimento per il gioco TicTacToe (Tris)
Il passo e' stato quello di creare il gioco per umani...la cosa che mi ha dato piu' soddisfazione e' stata la funzione per determinare la condizione di vittoria dei giocatori
In pratica ogni casella del gioco e' associata ad una potenza di 2...si sommano i valori delle caselle e si fa un AND con la maschera di bit delle condizioni di vittoria
il prossimo passo e' salvare le varie partite con una Trie
---------------------------
Il nome delle caselle e' cosi' ordinato
0 | 1 | 2
______
3 | 4 | 5
______
6 | 7 | 8
______
3 | 4 | 5
______
6 | 7 | 8
package main
import (
"fmt"
"math"
"os"
"strconv"
)
var display [9]int // array per mostrare il gioco
var step int // numero di mossa
var giocatore int
var mossa_valida bool
func reset() {
for k := 0; k < 9; k++ {
display[k] = 0
}
step = 1
giocatore = 3
mossa_valida = false
}
func controlla_vittoria() int {
totale_1 := 0
totale_2 := 0
// per il calcolo della scacchiera ad ogni casella corrispondente un valore di potenza di 2
// si sommano tutti le caselle occupate da un giocatore
// poi si effettua un AND logic con le 8 posizioni vincenti
// giocatore 1
for k := 0; k < 9; k++ {
if display[k] == 3 {
totale_1 = totale_1 + int(math.Pow(float64(2), float64(k)))
}
}
if (totale_1 & 448) == 448 {
return 1
}
if (totale_1 & 56) == 56 {
return 1
}
if (totale_1 & 7) == 7 {
return 1
}
if (totale_1 & 292) == 292 {
return 1
}
if (totale_1 & 146) == 146 {
return 1
}
if (totale_1 & 73) == 73 {
return 1
}
if (totale_1 & 273) == 273 {
return 1
}
if (totale_1 & 84) == 84 {
return 1
}
// giocatore 2
for k := 0; k < 9; k++ {
if display[k] == 2 {
totale_2 = totale_2 + int(math.Pow(float64(2), float64(k)))
}
}
if (totale_2 & 448) == 448 {
return 2
}
if (totale_2 & 56) == 56 {
return 2
}
if (totale_2 & 7) == 7 {
return 2
}
if (totale_2 & 292) == 292 {
return 2
}
if (totale_2 & 146) == 146 {
return 2
}
if (totale_2 & 73) == 73 {
return 2
}
if (totale_2 & 273) == 273 {
return 2
}
if (totale_2 & 84) == 84 {
return 2
}
return 0 // se ritorna 0 nessuno ha vinto
}
func casella(c int) string {
switch c {
case 0:
return (" ")
case 3:
return ("X")
case 2:
return ("O")
}
return " "
}
func mostra_gioco() {
fmt.Print(casella(display[0]))
fmt.Print("|")
fmt.Print(casella(display[1]))
fmt.Print("|")
fmt.Println(casella(display[2]))
fmt.Println("-----")
fmt.Print(casella(display[3]))
fmt.Print("|")
fmt.Print(casella(display[4]))
fmt.Print("|")
fmt.Println(casella(display[5]))
fmt.Println("-----")
fmt.Print(casella(display[6]))
fmt.Print("|")
fmt.Print(casella(display[7]))
fmt.Print("|")
fmt.Println(casella(display[8]))
}
func main() {
var tasto int
step = 1
giocatore = 3
mossa_valida = false
mostra_gioco()
fmt.Println("Turno al Giocatore " + strconv.Itoa(giocatore-2))
for {
for { // controlla se e' una mossa valida
if !mossa_valida {
fmt.Print("Enter move: ")
fmt.Scanln(&tasto)
// controlla se e' un tasto valido
if display[tasto] == 0 { // controlla se la casella e' valida
mossa_valida = true
display[tasto] = giocatore
giocatore = ((giocatore + 1) % 2) + 2
fmt.Println("Turno al Giocatore " + string(giocatore+2))
break
} else {
fmt.Println("Mossa non valida")
}
}
}
step++ // aumenta il numero della mossa
mossa_valida = false
mostra_gioco()
v := controlla_vittoria()
switch v {
case 1:
fmt.Println("****************************")
fmt.Println("*** Vittoria Giocatore 1 ***")
fmt.Println("****************************")
reset()
mostra_gioco()
break
case 2:
fmt.Println("****************************")
fmt.Println("*** Vittoria Giocatore 2 ***")
fmt.Println("****************************")
reset()
mostra_gioco()
break
}
if step == 9 {
fmt.Println("***************************")
fmt.Println("******** Pareggio *********")
fmt.Println("***************************")
reset()
mostra_gioco()
break
}
}
os.Exit(0)
}
Nessun commento:
Posta un commento