aboutsummaryrefslogtreecommitdiff
path: root/go/game/deck.go
blob: f4290322fa45244a4fc7613474178d182c0f6811 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package game

import (
	"log"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

type Deck struct {
	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)
}