Advertisement
Guest User

Untitled

a guest
Jan 30th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.71 KB | None | 0 0
  1. package hearths
  2.  
  3. import (
  4.     "fmt"
  5.     "deck/deck"
  6. )
  7.  
  8. type CardStack struct {
  9.     cards []deck.Card
  10. }
  11.  
  12. func (c *CardStack) DrawCardByString(str string) (deck.Card, error) {
  13.     return c.cardByString(str, true)
  14. }
  15.  
  16. func (c *CardStack) RevealCardByString(str string) (deck.Card, error) {
  17.     return c.cardByString(str, false)
  18. }
  19.  
  20. // Expects string like "Ts" or "2h" (1. face 2. suit)
  21. func (c *CardStack) cardByString(str string, rm bool) (deck.Card, error) {
  22.     if len(str) < 2 {
  23.         return deck.Card{}, fmt.Errorf("Card string too short")
  24.     }
  25.     face := string(str[0])
  26.     suit := string(str[1])
  27.  
  28.     for i, card := range c.cards {
  29.         if card.FaceName() == face && card.SuitName() == suit {
  30.             return c.cardByIndex(i, rm)
  31.         }
  32.     }
  33.     return deck.Card{}, fmt.Errorf("Card not found")
  34. }
  35.  
  36. func (c *CardStack) DrawCard(card deck.Card) (deck.Card, error) {
  37.     return c.findCard(card, true)
  38. }
  39.  
  40. func (c *CardStack) RevealCard(card deck.Card) (deck.Card, error) {
  41.     return c.findCard(card, false)
  42. }
  43.  
  44. // Expects string like "Ts" or "2h" (1. face 2. suit)
  45. func (c *CardStack) findCard(cc deck.Card, rm bool) (deck.Card, error) {
  46.     for i, card := range c.GetCards() {
  47.         if cc == card {
  48.             return c.cardByIndex(i, rm)
  49.         }
  50.     }
  51.     return deck.Card{}, fmt.Errorf("Card not found")
  52. }
  53.  
  54. func (c *CardStack) cardByIndex(n int, rm bool) (deck.Card, error) {
  55.     if n > len(c.GetCards()) {
  56.         return deck.Card{}, fmt.Errorf("Index out of bounds")
  57.     }
  58.  
  59.     card := c.GetCards()[n]
  60.     if rm {
  61.         c.SetCards(append(c.GetCards()[:n], c.GetCards()[n+1:]...))
  62.     }
  63.     return card, nil
  64. }
  65.  
  66. func (c *CardStack) HasCards(cards []deck.Card) ([]deck.Card, error) {
  67.     return c.getCardsSlice(cards, false)
  68. }
  69.  
  70. func (c *CardStack) DrawCards(cards []deck.Card) ([]deck.Card, error) {
  71.     return c.getCardsSlice(cards, true)
  72. }
  73.  
  74. // Returns cards that are missing
  75. func (c *CardStack) getCardsSlice(cards []deck.Card, rm bool) ([]deck.Card, error) {
  76.     var err error
  77.     var returnc = []deck.Card{}
  78.     for _, card := range cards {
  79.         fmt.Println("BEFORE c.findCard(cards): ")
  80.         deck.PrintCards(cards)
  81.         _, err = c.findCard(card, rm)
  82.         fmt.Println("AFTER c.findCard(cards): ")
  83.         deck.PrintCards(cards)
  84.         if err != nil {
  85.             return returnc, err
  86.         }
  87.     }
  88.     return returnc, nil
  89. }
  90.  
  91. func (c *CardStack) AppendCard(card deck.Card) error {
  92.     _, err := c.RevealCardByString(card.Name())
  93.     if err == nil {
  94.         return fmt.Errorf("Card already in the stack. Appending not possible")
  95.     }
  96.  
  97.     c.SetCards(append(c.GetCards(), card))
  98.     return nil
  99. }
  100.  
  101. func (c *CardStack) AppendCards(cards []deck.Card) error {
  102.     var err error
  103.     var appended []deck.Card
  104.  
  105.     for _, card := range cards {
  106.         err = c.AppendCard(card)
  107.         if err != nil {
  108.             // Reset to initial state
  109.             for _, toRm := range appended {
  110.                 c.DrawCard(toRm)
  111.             }
  112.             return err
  113.         } else {
  114.             appended = append(appended, card)
  115.         }
  116.     }
  117.     return nil
  118. }
  119.  
  120. func (c CardStack) SubStack(from int, to int) (CardStack, error) {
  121.     counted := c.Count()
  122.     if from < 0 || from > counted {
  123.         return CardStack{}, fmt.Errorf("From value is malformed")
  124.     }
  125.     if to < 0 || to > counted {
  126.         return CardStack{}, fmt.Errorf("To value is malformed")
  127.     }
  128.     newCs := CardStack{}
  129.     newCs.SetCards(c.cards[from:to])
  130.     return newCs, nil
  131. }
  132.  
  133. func (c *CardStack) SetCards(cards []deck.Card) {
  134.     c.cards = cards
  135. }
  136.  
  137. func (c *CardStack) GetCards() []deck.Card {
  138.     return c.cards
  139. }
  140.  
  141. func (c *CardStack) Count() int {
  142.     return len(c.cards)
  143. }
  144.  
  145. func (c *CardStack) Print() {
  146.     deck.PrintCards(c.GetCards())
  147. }
  148.  
  149. // Middle pile
  150. type Pile struct {
  151.     cards CardStack
  152. }
  153.  
  154. func (p *Pile) Count() int {
  155.     return p.cards.Count()
  156. }
  157.  
  158. func (p *Pile) Next() int {
  159.     return p.Count()
  160. }
  161.  
  162. func (p *Pile) NeedsMore() bool {
  163.     return p.Count() < 4
  164. }
  165.  
  166. func (p *Pile) Print() {
  167.     p.cards.Print()
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement