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