-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
91 lines (85 loc) · 1.69 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package logic
import (
"fmt"
"github.com/0xk2/cosmos-learning/tictoctoe/conversion"
. "github.com/0xk2/cosmos-learning/tictoctoe/datatype"
)
// declare the board
func InitGame(gameId int, dx Position, dy Position) {
// clear the default game data
g := Game{}
g.Id = gameId
g.Dx = dx
g.Dy = dy
g.Data = make([][]State, dx, dy)
var i, j Position
for i = 0; i < dx; i++ {
g.Data[i] = make([]State, dy)
for j = 0; j < dy; j++ {
g.Data[i][j] = EMPTY
}
}
g.Next = O_User
g.Winner = NO_USER
storeGameData(g, gameId)
}
func Move(u User, px Position, py Position, g Game) {
isValid := validate(u, px, py, g)
if !isValid {
return
}
g.Data[py][px] = conversion.ChooseMove(u)
switch u {
case O_User:
g.Next = X_User
break
case X_User:
g.Next = O_User
break
}
if checkEndGame(u, g, px, py) == true {
g.Winner = u
fmt.Println("Winner is ", u)
}
storeGameData(g, g.Id)
}
func validate(u User, px Position, py Position, g Game) bool {
result := true
if g.Winner != NO_USER {
fmt.Println("Game is already finished")
result = false
}
if g.Data[py][px] != EMPTY {
fmt.Printf("There is %s at [%d,%d]\n", g.Data[py][px], px, py)
result = false
}
if g.Next != u {
fmt.Println("Invalid user make the move")
result = false
}
return result
}
func Display(gameId int) {
g, err := LoadGameData(gameId)
if err != nil {
return
}
if g.Winner != NO_USER {
fmt.Printf("Winner is %s\n", g.Winner)
}
fmt.Printf("Next move is %s\n", g.Next)
for i := 0; i < int(g.Dx); i++ {
for j := 0; j < int(g.Dy); j++ {
switch g.Data[i][j] {
case EMPTY:
fmt.Print(" - ")
break
case O:
fmt.Print(" o ")
case X:
fmt.Print(" x ")
}
}
fmt.Println("")
}
}