go-fish/internal/game/game.go
2026-10-07 15:16:00 +02:00

81 lines
1.5 KiB
Go

package game
type GameState int
const (
StateWaiting GameState = iota
StatePlaying
)
type Game struct {
ID string
Player1 *Player
Player2 *Player
Current int // 1 or 2, whose turn it is
State GameState
Deck []Card
BookPile [][]Card
}
func NewGame(p1, p2 *Player) *Game {
deck := Shuffle(NewDeck())
return &Game{
ID: "",
Player1: p1,
Player2: p2,
Current: 1,
State: StatePlaying,
Deck: deck,
BookPile: [][]Card{},
}
}
func (g *Game) DrawCard() Card {
if len(g.Deck) == 0 {
// Reshuffle book pile
var all []Card
for _, book := range g.BookPile {
all = append(all, book...)
}
if len(all) > 0 {
g.Deck = Shuffle(all)
g.BookPile = [][]Card{}
}
}
card := g.Deck[0]
g.Deck = g.Deck[1:]
return card
}
func (g *Game) Ask(target *Player, rank Rank) bool {
if !target.HasCard(rank) {
// Player draws from deck
card := g.DrawCard()
target.Draw(card)
return false // turn passes
}
// Target gives the card
removed := target.RemoveCard(rank)
if len(removed) > 0 {
// Add to asker's hand
g.Player1.Hand = append(g.Player1.Hand, removed...)
// Check for book
if g.Player1.HasBook(rank) {
// Find and remove the 4 cards from hand
var book []Card
var remaining []Card
count := 0
for _, c := range g.Player1.Hand {
if c.Rank == rank && count < 4 {
book = append(book, c)
count++
} else {
remaining = append(remaining, c)
}
}
g.Player1.Hand = remaining
g.BookPile = append(g.BookPile, book)
}
}
return true // same player continues
}