go_games_collection/durak_deck.go
2026-07-04 13:51:04 +03:00

34 lines
1.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}