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)
}
|