diff options
Diffstat (limited to 'go/game/deck.go')
| -rw-r--r-- | go/game/deck.go | 77 |
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) +} |
