90 lines
1.4 KiB
Go
90 lines
1.4 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
// Suit — масть карты.
|
|
type Suit int
|
|
|
|
const (
|
|
Clubs Suit = iota // трефы
|
|
Diamonds // бубны
|
|
Hearts // червы
|
|
Spades // пики
|
|
)
|
|
|
|
func (s Suit) String() string {
|
|
switch s {
|
|
case Clubs:
|
|
return "♣"
|
|
case Diamonds:
|
|
return "♦"
|
|
case Hearts:
|
|
return "♥"
|
|
case Spades:
|
|
return "♠"
|
|
default:
|
|
return "?"
|
|
}
|
|
}
|
|
|
|
// Rank — ранг карты. Туз = 1, валет/дама/король = 11/12/13.
|
|
type Rank int
|
|
|
|
const (
|
|
Ace Rank = iota + 1
|
|
Two
|
|
Three
|
|
Four
|
|
Five
|
|
Six
|
|
Seven
|
|
Eight
|
|
Nine
|
|
Ten
|
|
Jack
|
|
Queen
|
|
King
|
|
)
|
|
|
|
func (r Rank) String() string {
|
|
switch r {
|
|
case Ace:
|
|
return "A"
|
|
case Jack:
|
|
return "J"
|
|
case Queen:
|
|
return "Q"
|
|
case King:
|
|
return "K"
|
|
default:
|
|
return fmt.Sprintf("%d", int(r))
|
|
}
|
|
}
|
|
|
|
// Value возвращает очковую стоимость карты для подсчёта веса руки
|
|
// и штрафов: туз = 1, картинки = 10, остальные — номинал.
|
|
func (r Rank) Value() int {
|
|
switch {
|
|
case r == Ace:
|
|
return 1
|
|
case r >= Jack: // J, Q, K
|
|
return 10
|
|
default:
|
|
return int(r)
|
|
}
|
|
}
|
|
|
|
// Card — игральная карта.
|
|
type Card struct {
|
|
Suit Suit
|
|
Rank Rank
|
|
}
|
|
|
|
func (c Card) String() string {
|
|
return fmt.Sprintf("%s%s", c.Rank, c.Suit)
|
|
}
|
|
|
|
// Value — очковая стоимость карты (см. Rank.Value).
|
|
func (c Card) Value() int {
|
|
return c.Rank.Value()
|
|
}
|