82 lines
1.5 KiB
Go
82 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
|
||
|
|
}
|