112 lines
1.5 KiB
Go
112 lines
1.5 KiB
Go
|
|
package game
|
||
|
|
|
||
|
|
import "math/rand"
|
||
|
|
|
||
|
|
type Rank int
|
||
|
|
|
||
|
|
const (
|
||
|
|
RankAce Rank = iota
|
||
|
|
Rank2
|
||
|
|
Rank3
|
||
|
|
Rank4
|
||
|
|
Rank5
|
||
|
|
Rank6
|
||
|
|
Rank7
|
||
|
|
Rank8
|
||
|
|
Rank9
|
||
|
|
Rank10
|
||
|
|
RankJack
|
||
|
|
RankQueen
|
||
|
|
RankKing
|
||
|
|
)
|
||
|
|
|
||
|
|
func (r Rank) String() string {
|
||
|
|
switch r {
|
||
|
|
case RankAce:
|
||
|
|
return "A"
|
||
|
|
case Rank2:
|
||
|
|
return "2"
|
||
|
|
case Rank3:
|
||
|
|
return "3"
|
||
|
|
case Rank4:
|
||
|
|
return "4"
|
||
|
|
case Rank5:
|
||
|
|
return "5"
|
||
|
|
case Rank6:
|
||
|
|
return "6"
|
||
|
|
case Rank7:
|
||
|
|
return "7"
|
||
|
|
case Rank8:
|
||
|
|
return "8"
|
||
|
|
case Rank9:
|
||
|
|
return "9"
|
||
|
|
case Rank10:
|
||
|
|
return "10"
|
||
|
|
case RankJack:
|
||
|
|
return "J"
|
||
|
|
case RankQueen:
|
||
|
|
return "Q"
|
||
|
|
case RankKing:
|
||
|
|
return "K"
|
||
|
|
}
|
||
|
|
return "?"
|
||
|
|
}
|
||
|
|
|
||
|
|
type Suit int
|
||
|
|
|
||
|
|
const (
|
||
|
|
SuitClubs Suit = iota
|
||
|
|
SuitDiamonds
|
||
|
|
SuitHearts
|
||
|
|
SuitSpades
|
||
|
|
)
|
||
|
|
|
||
|
|
func (s Suit) String() string {
|
||
|
|
switch s {
|
||
|
|
case SuitClubs:
|
||
|
|
return "♣"
|
||
|
|
case SuitDiamonds:
|
||
|
|
return "♦"
|
||
|
|
case SuitHearts:
|
||
|
|
return "♥"
|
||
|
|
case SuitSpades:
|
||
|
|
return "♠"
|
||
|
|
}
|
||
|
|
return "?"
|
||
|
|
}
|
||
|
|
|
||
|
|
type Card struct {
|
||
|
|
Rank Rank
|
||
|
|
Suit Suit
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewDeck() []Card {
|
||
|
|
var deck []Card
|
||
|
|
for suit := SuitClubs; suit <= SuitSpades; suit++ {
|
||
|
|
for rank := RankAce; rank <= RankKing; rank++ {
|
||
|
|
deck = append(deck, Card{Rank: rank, Suit: suit})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return deck
|
||
|
|
}
|
||
|
|
|
||
|
|
func Shuffle(deck []Card) []Card {
|
||
|
|
result := make([]Card, len(deck))
|
||
|
|
copy(result, deck)
|
||
|
|
for i := len(result) - 1; i > 0; i-- {
|
||
|
|
j := rand.Intn(i + 1)
|
||
|
|
result[i], result[j] = result[j], result[i]
|
||
|
|
}
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
var faceCards = map[Rank]bool{
|
||
|
|
RankJack: true,
|
||
|
|
RankQueen: true,
|
||
|
|
RankKing: true,
|
||
|
|
}
|
||
|
|
|
||
|
|
func IsFaceCard(r Rank) bool {
|
||
|
|
return faceCards[r]
|
||
|
|
}
|