34 lines
1.6 KiB
Go
34 lines
1.6 KiB
Go
package main
|
||
|
||
// NewDurakDeck создаёт колоду для Дурака: 36 карт (от шестёрки до
|
||
// туза), без карт от двойки до пятёрки. Использует те же типы
|
||
// Suit/Rank/Card, что и остальные игры коллекции.
|
||
func NewDurakDeck() *Deck {
|
||
ranks := []Rank{Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace}
|
||
d := &Deck{cards: make([]Card, 0, 36)}
|
||
for s := Clubs; s <= Spades; s++ {
|
||
for _, r := range ranks {
|
||
d.cards = append(d.cards, Card{Suit: s, Rank: r})
|
||
}
|
||
}
|
||
return d
|
||
}
|
||
|
||
// durakRankOrder — старшинство рангов в Дураке: шестёрка младше
|
||
// всех, туз — старше всех. В отличие от Rank.Value() (очковая
|
||
// стоимость карты в Тонке), здесь важен только порядок.
|
||
var durakRankOrder = map[Rank]int{
|
||
Six: 0, Seven: 1, Eight: 2, Nine: 3, Ten: 4,
|
||
Jack: 5, Queen: 6, King: 7, Ace: 8,
|
||
}
|
||
|
||
// durakBeats проверяет, бьёт ли карта defend карту attack при
|
||
// козыре trump: старше по рангу той же масти, либо любой козырь
|
||
// против некозырной карты. Козырь козырем бьётся только старшим
|
||
// козырем — простая, но не менее важная деталь.
|
||
func durakBeats(defend, attack Card, trump Suit) bool {
|
||
if defend.Suit == attack.Suit {
|
||
return durakRankOrder[defend.Rank] > durakRankOrder[attack.Rank]
|
||
}
|
||
return defend.Suit == trump && attack.Suit != trump
|
||
}
|