Files
games/connect4/types.go
Ryan Hamamura 718e0c55c9
All checks were successful
CI / Deploy / test (pull_request) Successful in 14s
CI / Deploy / lint (pull_request) Successful in 25s
CI / Deploy / deploy (pull_request) Has been skipped
fix: satisfy staticcheck comment style for exported consts
2026-03-02 22:48:16 -10:00

81 lines
1.9 KiB
Go

package connect4
import (
"encoding/json"
"github.com/ryanhamamura/games/player"
)
// SubjectPrefix is the NATS subject namespace for connect4 games.
const SubjectPrefix = "connect4"
// GameSubject returns the NATS subject for game state updates.
func GameSubject(gameID string) string { return SubjectPrefix + "." + gameID }
// ChatSubject returns the NATS subject for chat messages.
func ChatSubject(gameID string) string { return SubjectPrefix + ".chat." + gameID }
type Player struct {
ID player.ID
UserID *string // UUID for authenticated users, nil for guests
Nickname string
Color int // 1 = Red, 2 = Yellow
}
type Status int
const (
StatusWaitingForPlayer Status = iota
StatusInProgress
StatusWon
StatusDraw
)
type Game struct {
ID string
Board [6][7]int // 6 rows, 7 columns; 0=empty, 1=red, 2=yellow
Players [2]*Player // Index 0 = creator (Red), Index 1 = joiner (Yellow)
CurrentTurn int // 1 or 2 (matches player color)
Status Status
Winner *Player
WinningCells [][2]int // Coordinates of winning 4 cells for highlighting
RematchGameID *string // ID of the rematch game, if one was created
}
func NewGame(id string) *Game {
return &Game{
ID: id,
Board: [6][7]int{},
CurrentTurn: 1, // Red goes first
Status: StatusWaitingForPlayer,
}
}
func (g *Game) IsFinished() bool {
return g.Status == StatusWon || g.Status == StatusDraw
}
func (g *Game) BoardToJSON() string {
data, _ := json.Marshal(g.Board)
return string(data)
}
func (g *Game) BoardFromJSON(data string) error {
return json.Unmarshal([]byte(data), &g.Board)
}
func (g *Game) WinningCellsToJSON() string {
if g.WinningCells == nil {
return ""
}
data, _ := json.Marshal(g.WinningCells)
return string(data)
}
func (g *Game) WinningCellsFromJSON(data string) error {
if data == "" {
return nil
}
return json.Unmarshal([]byte(data), &g.WinningCells)
}