diff options
Diffstat (limited to 'go/game/deck.go')
| -rw-r--r-- | go/game/deck.go | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/go/game/deck.go b/go/game/deck.go index 33126ae8..f4290322 100644 --- a/go/game/deck.go +++ b/go/game/deck.go @@ -1,5 +1,71 @@ package game +import ( + "log" + "math/rand" + "strconv" + "strings" + "time" +) + type Deck struct { - Cards []Card + Cards []*Card +} + +func NewDeck() *Deck { + d := Deck{[]*Card{}} + return &d +} + +func (d *Deck) AddCards(cards []*Card) { + d.Cards = append(d.Cards, cards...) +} + +func (d *Deck) AddCard(card *Card) { + d.Cards = append(d.Cards, card) +} + +func (d *Deck) Size() int { + return len(d.Cards) +} + +func (d *Deck) Shuffle() { + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(d.Size(), func(i, j int) { + d.Cards[i], d.Cards[j] = d.Cards[j], d.Cards[i] + }) +} + +func (d *Deck) Draw(amount int) []*Card { + drawn := d.Cards[-amount:] + d.Cards = d.Cards[:amount] + return drawn +} + +func NewDeckFromCardPaths(cardPaths []string) *Deck { + d := NewDeck() + for _, cardPath := range cardPaths { + card := NewCard(cardPath) + d.AddCard(card) + } + return d +} + +func NewDeckFromDeckList(deckList string) *Deck { + cardPaths := []string{} + lines := strings.Split(deckList, "\n") + for _, line := range lines { + tokens := strings.SplitN(line, " ", 2) + cardPath := tokens[1] + amount, err := strconv.Atoi(tokens[0]) + if err != nil { + log.Fatal(err) + } + + for i := 0; i < amount; i++ { + cardPaths = append(cardPaths, cardPath) + } + } + + return NewDeckFromCardPaths(cardPaths) } |
