guandan.dev

guandan.dev

https://git.tonybtw.com/guandan.dev.git git://git.tonybtw.com/guandan.dev.git
2,180 bytes raw
1
package game
2
3
type Suit int
4
5
const (
6
	Suit_Hearts Suit = iota
7
	Suit_Diamonds
8
	Suit_Clubs
9
	Suit_Spades
10
	Suit_Joker
11
)
12
13
type Rank int
14
15
const (
16
	Rank_Two Rank = iota
17
	Rank_Three
18
	Rank_Four
19
	Rank_Five
20
	Rank_Six
21
	Rank_Seven
22
	Rank_Eight
23
	Rank_Nine
24
	Rank_Ten
25
	Rank_Jack
26
	Rank_Queen
27
	Rank_King
28
	Rank_Ace
29
	Rank_Black_Joker
30
	Rank_Red_Joker
31
)
32
33
type Card struct {
34
	Suit Suit
35
	Rank Rank
36
	Id   int
37
}
38
39
type Deck struct {
40
	Cards []Card
41
}
42
43
func New_Deck() *Deck {
44
	deck := &Deck{Cards: make([]Card, 0, 108)}
45
	id := 0
46
47
	for copy := 0; copy < 2; copy++ {
48
		for suit := Suit_Hearts; suit <= Suit_Spades; suit++ {
49
			for rank := Rank_Two; rank <= Rank_Ace; rank++ {
50
				deck.Cards = append(deck.Cards, Card{Suit: suit, Rank: rank, Id: id})
51
				id++
52
			}
53
		}
54
		deck.Cards = append(deck.Cards, Card{Suit: Suit_Joker, Rank: Rank_Black_Joker, Id: id})
55
		id++
56
		deck.Cards = append(deck.Cards, Card{Suit: Suit_Joker, Rank: Rank_Red_Joker, Id: id})
57
		id++
58
	}
59
60
	return deck
61
}
62
63
func (d *Deck) Shuffle() {
64
	for i := len(d.Cards) - 1; i > 0; i-- {
65
		j := rand_int(i + 1)
66
		d.Cards[i], d.Cards[j] = d.Cards[j], d.Cards[i]
67
	}
68
}
69
70
func (d *Deck) Deal() [4][]Card {
71
	var hands [4][]Card
72
	for i := 0; i < 4; i++ {
73
		hands[i] = make([]Card, 0, 27)
74
	}
75
76
	for i, card := range d.Cards {
77
		hands[i%4] = append(hands[i%4], card)
78
	}
79
80
	return hands
81
}
82
83
func rank_value(rank Rank, level Rank) int {
84
	if rank == Rank_Red_Joker {
85
		return 100
86
	}
87
	if rank == Rank_Black_Joker {
88
		return 99
89
	}
90
	if rank == level {
91
		return 98
92
	}
93
94
	base_order := []Rank{
95
		Rank_Two, Rank_Three, Rank_Four, Rank_Five, Rank_Six,
96
		Rank_Seven, Rank_Eight, Rank_Nine, Rank_Ten,
97
		Rank_Jack, Rank_Queen, Rank_King, Rank_Ace,
98
	}
99
100
	for i, r := range base_order {
101
		if r == rank {
102
			return i
103
		}
104
	}
105
	return -1
106
}
107
108
func card_value(card Card, level Rank) int {
109
	return rank_value(card.Rank, level)
110
}
111
112
func Card_Value(card Card, level Rank) int {
113
	return rank_value(card.Rank, level)
114
}
115
116
func Is_Wild(card Card, level Rank) bool {
117
	return card.Suit == Suit_Hearts && card.Rank == level
118
}
119
120
func compare_cards(a, b Card, level Rank) int {
121
	va := card_value(a, level)
122
	vb := card_value(b, level)
123
	if va > vb {
124
		return 1
125
	}
126
	if va < vb {
127
		return -1
128
	}
129
	return 0
130
}