package pokercore import "encoding/binary" import "fmt" import crand "crypto/rand" import . "github.com/logrusorgru/aurora" import log "github.com/sirupsen/logrus" import rand "math/rand" import "strings" /* const CLUB = "\u2663" const SPADE = "\u2660" const DIAMOND = "\u2666" const HEART = "\u2665" */ const CLUB = "C" const SPADE = "S" const DIAMOND = "D" const HEART = "H" type TestGenerationIteration struct { Deck *Deck Seed int64 } type Card struct { Rank string Suit string } type Cards []*Card type Deck struct { Cards Cards Dealt int ShuffleSeedVal int64 } func cryptoUint64() (v uint64) { err := binary.Read(crand.Reader, binary.BigEndian, &v) if err != nil { log.Fatal(err) } log.Debugf("crand cryptosource is returning Uint64: %d", v) return v } func NewRandom() *rand.Rand { trueRandom := true var rnd *rand.Rand return rnd } func (self *Card) String() string { var rank string var suit string color := Red switch self.Suit { case DIAMOND: color = Blue case HEART: color = Red case CLUB: color = Green case SPADE: color = Black } rank = fmt.Sprintf("%s", BgGray(Bold(color(self.Rank)))) suit = fmt.Sprintf("%s", BgGray(Bold(color(self.Suit)))) return fmt.Sprintf("%s%s", rank, suit) } func NewDeck() *Deck { self := new(Deck) ranks := []string{"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"} suits := []string{HEART, DIAMOND, CLUB, SPADE} self.Cards = make([]*Card, 52) tot := 0 for i := 0; i < len(ranks); i++ { for n := 0; n < len(suits); n++ { self.Cards[tot] = &Card{ Rank: ranks[i], Suit: suits[n], } tot++ } } self.Dealt = 0 return self } func (self *Deck) ShuffleRandomly() { rnd := rand.New(rand.NewSource(int64(cryptoUint64()))) //FIXME(sneak) not sure if this is constant time or not rnd.Shuffle(len(self.Cards), func(i, j int) { self.Cards[i], self.Cards[j] = self.Cards[j], self.Cards[i] }) } func (self *Deck) ShuffleDeterministic(int64 seed) { r := rand.New(rand.NewSource(seed)) //FIXME(sneak) not sure if this is constant time or not r.Shuffle(len(self.Cards), func(i, j int) { self.Cards[i], self.Cards[j] = self.Cards[j], self.Cards[i] }) } func (self *Deck) Deal(n int) (output Cards) { if (self.Dealt + n) > len(self.Cards) { return output } for i := 0; i < n; i++ { card := self.Cards[self.Dealt+1] output = append(output, card) self.Dealt++ } return output } func (s Cards) String() (output string) { var cardstrings []string for i := 0; i < len(s); i++ { cardstrings = append(cardstrings, s[i].String()) } output = strings.Join(cardstrings, ",") return output } func generate() { log.SetLevel(log.DebugLevel) } func proto() { myDeck := NewDeck() myDeck.Shuffle() myHand := myDeck.Deal(2) //spew.Dump(myHand) fmt.Printf("my hand: %s\n", myHand) cmty := myDeck.Deal(5) fmt.Printf("community: %s\n", cmty) }