aboutsummaryrefslogtreecommitdiff
path: root/go/game/deck.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/game/deck.go')
-rw-r--r--go/game/deck.go68
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)
}