117 lines
3.5 KiB
Go
117 lines
3.5 KiB
Go
/*
|
|
* Mini max algorythm for Tictactoe Bot (https://botsArena.tinad.fr or bollosseum)
|
|
* By Gnieark https://blog-du-grouik.tinad.fr 2018-06
|
|
* I am learning golang it's my first script, don't take it seriously
|
|
*/
|
|
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"fmt"
|
|
"net/http"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"git.ventresmous.fr/gnieark/goTicTactoeBot/tictactoe"
|
|
)
|
|
|
|
//Plate somewhere to put the json encoded map
|
|
type Plate struct{
|
|
Cell00 string `json:"0-0,omitempty"`
|
|
Cell01 string `json:"0-1,omitempty"`
|
|
Cell02 string `json:"0-2,omitempty"`
|
|
Cell10 string `json:"1-0,omitempty"`
|
|
Cell11 string `json:"1-1,omitempty"`
|
|
Cell12 string `json:"1-2,omitempty"`
|
|
Cell20 string `json:"2-0,omitempty"`
|
|
Cell21 string `json:"2-1,omitempty"`
|
|
Cell22 string `json:"2-2,omitempty"`
|
|
}
|
|
|
|
//QuestionMessage Somewhere to put the whole JSON message from botsarena
|
|
type QuestionMessage struct {
|
|
GameID string `json:"game-id,omitempty"`
|
|
Action string `json:"action,omitempty"`
|
|
Game string `json:"game,omitempty"`
|
|
Players int `json:"players,omitempty"`
|
|
Board Plate `json:"board"`
|
|
You string `json:"you,omitempty"`
|
|
PlayerIndex int `json:"player-index,omitempty"`
|
|
}
|
|
|
|
|
|
func parseQuery(w http.ResponseWriter, r *http.Request){
|
|
|
|
allowedHeaders := "Accept, Content-Type, Content-Length, Accept-Encoding, Authorization,X-CSRF-Token"
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
|
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
|
|
w.Header().Set("Access-Control-Allow-Headers", allowedHeaders)
|
|
|
|
decoder := json.NewDecoder(r.Body)
|
|
var questionMessage QuestionMessage
|
|
err := decoder.Decode(&questionMessage)
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
switch questionMessage.Action{
|
|
case "init":
|
|
w.Write([]byte("{\"name\":\"GniearkGolangTictactoe\"}"))
|
|
case "play-turn":
|
|
|
|
//Convert the map to an exploitable array
|
|
var tmap [3][3]int
|
|
tmap[0][0] = tictactoeSymbolsToInt(questionMessage.Board.Cell00,questionMessage.You)
|
|
tmap[0][1] = tictactoeSymbolsToInt(questionMessage.Board.Cell01,questionMessage.You)
|
|
tmap[0][2] = tictactoeSymbolsToInt(questionMessage.Board.Cell02,questionMessage.You)
|
|
tmap[1][0] = tictactoeSymbolsToInt(questionMessage.Board.Cell10,questionMessage.You)
|
|
tmap[1][1] = tictactoeSymbolsToInt(questionMessage.Board.Cell11,questionMessage.You)
|
|
tmap[1][2] = tictactoeSymbolsToInt(questionMessage.Board.Cell12,questionMessage.You)
|
|
tmap[2][0] = tictactoeSymbolsToInt(questionMessage.Board.Cell20,questionMessage.You)
|
|
tmap[2][1] = tictactoeSymbolsToInt(questionMessage.Board.Cell21,questionMessage.You)
|
|
tmap[2][2] = tictactoeSymbolsToInt(questionMessage.Board.Cell22,questionMessage.You)
|
|
|
|
target, score := tictactoe.PlayOn(tmap, 1)
|
|
fmt.Fprintf(w, "{\"play\":\"%d-%d\",\"Comment\":\"score %d\"}", target.X, target.Y,score)
|
|
|
|
default:
|
|
w.Write([]byte("Error " + questionMessage.Action ))
|
|
|
|
}
|
|
|
|
}
|
|
func tictactoeSymbolsToInt (symbolToTest string,mySymbol string) int{
|
|
switch symbolToTest {
|
|
case mySymbol:
|
|
return 1
|
|
case "":
|
|
return 0
|
|
case " ":
|
|
return 0
|
|
default:
|
|
return 2
|
|
}
|
|
}
|
|
func arena(w http.ResponseWriter, r *http.Request){
|
|
data, err := ioutil.ReadFile("./arena.html")
|
|
if err == nil {
|
|
w.Write(data)
|
|
} else {
|
|
w.WriteHeader(404)
|
|
w.Write([]byte("404 Something went wrong - " + http.StatusText(404)))
|
|
}
|
|
|
|
}
|
|
func main() {
|
|
var listenAddr string
|
|
flag.StringVar(&listenAddr, "listen-addr", ":5000", "server listen address")
|
|
flag.Parse()
|
|
|
|
http.HandleFunc("/arena", arena)
|
|
http.HandleFunc("/", parseQuery)
|
|
log.Fatal(http.ListenAndServe(listenAddr, nil))
|
|
}
|
|
|