cleaning up now that i actually know this language

This commit is contained in:
Jeffrey Paul 2019-12-22 19:14:12 -08:00
parent 5289841027
commit c2dfd09e9f
9 changed files with 197 additions and 218 deletions

View File

@ -1,4 +1,8 @@
default: test
test:
cd pokercore && make test
test: *.go
go get -t -v
go test -v
run:
cd cmd/* && go get -v && go build .

94
card.go Normal file
View File

@ -0,0 +1,94 @@
package poker
import "encoding/binary"
import "fmt"
import crand "crypto/rand"
import . "github.com/logrusorgru/aurora"
import log "github.com/sirupsen/logrus"
import "strings"
type Suit rune
type Rank rune
const (
CLUB Suit = '\u2663'
SPADE Suit = '\u2660'
DIAMOND Suit = '\u2666'
HEART Suit = '\u2665'
)
const (
ACE Rank = 'A'
DEUCE Rank = '2'
THREE Rank = '3'
FOUR Rank = '4'
FIVE Rank = '5'
SIX Rank = '6'
SEVEN Rank = '7'
EIGHT Rank = '8'
NINE Rank = '9'
TEN Rank = 'T'
JACK Rank = 'J'
QUEEN Rank = 'Q'
KING Rank = 'K'
)
type Card struct {
Rank Rank
Suit Suit
}
type Cards []*Card
func (c *Cards) formatForTerminal() (output string) {
var cardstrings []string
for _, card := range *c {
cardstrings = append(cardstrings, card.formatForTerminal())
}
output = strings.Join(cardstrings, ",")
return output
}
func (c *Card) formatForTerminal() (output string) {
var rank string
var suit string
color := Red
switch c.Suit {
case Suit(DIAMOND):
color = Blue
case Suit(HEART):
color = Red
case Suit(CLUB):
color = Green
case Suit(SPADE):
color = Black
}
rank = fmt.Sprintf("%s", BgGray(Bold(color(*c.Rank))))
suit = fmt.Sprintf("%s", BgGray(Bold(color(*c.Suit))))
output = fmt.Sprintf("%s%s", rank, suit)
return output
}
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 (self *Card) String() string {
return fmt.Sprintf("%s%s", string(self.Rank), string(self.Suit))
}
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
}

View File

@ -4,7 +4,7 @@ import (
"errors"
"fmt"
log "github.com/sirupsen/logrus"
"github.com/sneak/gopoker/pokercore"
"github.com/sneak/poker"
"io"
"net/http"
"net/rpc"

92
deck.go Normal file
View File

@ -0,0 +1,92 @@
package poker
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"
type Deck struct {
Cards Cards
DealIndex 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 NewShuffledDeck() *Deck {
d := newDeck()
d.ShuffleSeedVal = int64(cryptoUint64())
d.Shuffle()
}
func NewDeckFromSeed(seed int64) *Deck {
d := newDeck()
d.ShuffleSeedVal = seed
d.Shuffle()
}
func newDeck() *Deck {
self := new(Deck)
ranks := []Rank{
ACE, DEUCE, THREE, FOUR, FIVE,
SIX, SEVEN, EIGHT, NINE, TEN, JACK,
QUEEN, KING}
suits := []Suit{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.DealIndex = 0
return self
}
func (self *Deck) Shuffle() {
//FIXME(sneak) not sure if this is constant time or not
rnd := rand.New(rand.NewSource(self.ShuffleSeedVal)))
rnd.Shuffle(len(self.Cards), func(i, j int) { self.Cards[i], self.Cards[j] = self.Cards[j], self.Cards[i] })
self.DealIndex = 0
}
func (self *Deck) Deal(n int) (output Cards) {
if (self.DealIndex + n) > len(self.Cards) {
return output
}
for i := 0; i < n; i++ {
output = append(output, self.Cards[self.DealIndex+1])
self.DealIndex++
}
return output
}
func (self *Deck) Dealt() int {
return self.DealIndex
}
func (self *Deck) Remaining() int {
return (len(self.Cards) - self.DealIndex)
}

View File

@ -1,4 +1,4 @@
package pokercore
package poker
import "github.com/stretchr/testify/assert"
import "testing"

View File

@ -1,4 +1,4 @@
package pokercore
package poker
type HEPokerHand struct {
Cards Cards
@ -28,7 +28,7 @@ const (
)
func (self *HandScore) BeatsHand(v *HandScore) bool {
panic("not implemented")
}
func (self *HEPokerHand) IsReducedYet() bool {
@ -53,7 +53,7 @@ func (self *HEPokerHand) IsStraight() bool {
func (self *HEPokerHand) IsFlush() bool {
}
func (self *HEPokerHand) IsBoat() bool {
func (self *HEPokerHand) IsFullHouse() bool {
}
func (self *HEPokerHand) ScoreHand() *HandScore {

View File

@ -1,10 +0,0 @@
package main
import "fmt"
import "github.com/sneak/gopoker/pokercore"
func main() {
myDeck := pokercore.NewDeck()
myDeck.ShuffleRandomly()
fmt.Println("%s", myDeck.Cards)
}

View File

@ -1,10 +0,0 @@
default: test
.PHONY: pkgs test
fetch:
go get -t
test: *.go
go test -v

View File

@ -1,191 +0,0 @@
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"
type Suit rune
type Rank rune
const (
CLUB Suit = '\u2663'
SPADE Suit = '\u2660'
DIAMOND Suit = '\u2666'
HEART Suit = '\u2665'
)
/*
// emoji are cooler anyway
const CLUB = "C"
const SPADE = "S"
const DIAMOND = "D"
const HEART = "H"
*/
const (
ACE Rank = 'A'
DEUCE Rank = '2'
THREE Rank = '3'
FOUR Rank = '4'
FIVE Rank = '5'
SIX Rank = '6'
SEVEN Rank = '7'
EIGHT Rank = '8'
NINE Rank = '9'
TEN Rank = 'T'
JACK Rank = 'J'
QUEEN Rank = 'Q'
KING Rank = 'K'
)
type TestGenerationIteration struct {
Deck *Deck
Seed int64
}
type Card struct {
Rank Rank
Suit Suit
}
type Cards []*Card
type Deck struct {
Cards Cards
DealIndex int
ShuffleSeedVal int64
}
func formatCardsForTerminal(c Cards) (output string) {
var cardstrings []string
for i := 0; i < len(c); i++ {
cardstrings = append(cardstrings, formatCardForTerminal(*c[i]))
}
output = strings.Join(cardstrings, ",")
return output
}
func formatCardForTerminal(c Card) (output string) {
var rank string
var suit string
color := Red
switch c.Suit {
case Suit(DIAMOND):
color = Blue
case Suit(HEART):
color = Red
case Suit(CLUB):
color = Green
case Suit(SPADE):
color = Black
}
rank = fmt.Sprintf("%s", BgGray(Bold(color(c.Rank))))
suit = fmt.Sprintf("%s", BgGray(Bold(color(c.Suit))))
output = fmt.Sprintf("%s%s", rank, suit)
return output
}
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 (self *Card) String() string {
return fmt.Sprintf("%s%s", string(self.Rank), string(self.Suit))
}
func NewDeck() *Deck {
self := new(Deck)
ranks := []Rank{
ACE, DEUCE, THREE, FOUR, FIVE,
SIX, SEVEN, EIGHT, NINE, TEN, JACK,
QUEEN, KING}
suits := []Suit{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.DealIndex = 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] })
self.DealIndex = 0
}
func (self *Deck) ShuffleDeterministically(seed int64) {
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] })
self.DealIndex = 0
}
func (self *Deck) Deal(n int) (output Cards) {
if (self.DealIndex + n) > len(self.Cards) {
return output
}
for i := 0; i < n; i++ {
output = append(output, self.Cards[self.DealIndex+1])
self.DealIndex++
}
return output
}
func (self *Deck) Dealt() int {
return self.DealIndex
}
func (self *Deck) Remaining() int {
return (len(self.Cards) - self.DealIndex)
}
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.ShuffleDeterministically(42)
myHand := myDeck.Deal(2)
//spew.Dump(myHand)
fmt.Printf("my hand: %s\n", myHand)
cmty := myDeck.Deal(5)
fmt.Printf("community: %s\n", cmty)
}