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.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/go/game/deck.go b/go/game/deck.go
new file mode 100644
index 00000000..569a952d
--- /dev/null
+++ b/go/game/deck.go
@@ -0,0 +1,77 @@
+package game
+
+import (
+ "log"
+ "math/rand"
+ "strconv"
+ "strings"
+)
+
+type Deck struct {
+ PileOfCardsBase
+}
+
+func NewDeck() *Deck {
+ d := Deck{PileOfCardsBase{[]*Card{}}}
+ return &d
+}
+
+func (d *Deck) Shuffle(r *rand.Rand) {
+ r.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 {
+ if d.Size() < amount {
+ drawn := d.cards
+ d.cards = []*Card{}
+ return drawn
+ }
+
+ drawn := d.cards[0:amount]
+ d.cards = d.cards[amount:]
+ return drawn
+}
+
+func (d *Deck) DrawOne() *Card {
+ drawn := d.Draw(1)
+ if len(drawn) == 0 {
+ return nil
+ }
+ return drawn[0]
+}
+
+func NewDeckFrom(cards PileOfCards) *Deck {
+ d := NewDeck()
+ cards.MoveInto(d)
+ return d
+}
+
+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)
+}