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 }