我是新手,正在尝试通过练习来学习,包括构建一些卡片功能。我有一个洗牌的功能。我如何编写一个函数,以便可以将同一副牌洗牌n
次?我必须使用指针吗?谢谢
package main
import (
"math/rand"
"time"
)
type Suit struct {
label string
value int
}
type Rank struct {
label string
value int
}
type Card struct {
Suit
Rank
}
type Deck []Card
func getPerm(n int) []int {
r := rand.New(rand.NewSource(time.Now().Unix()))
return r.Perm(n)
}
func (d Deck) shuffle() Deck {
finalDeck := Deck{}
perm := getPerm(len(d))
for _, j := range perm {
finalDeck = append(finalDeck, d[j])
}
return finalDeck
}
假设您想在适当的位置洗牌,您可以利用标准库rand shuffle。
要做到这一点,你需要提供牌组的长度,此外还需要一个交换功能,以便洗牌功能能够真正洗牌。
我们还可以添加一个for循环,以增加任意次数洗牌的能力。
这可以通过完成
func (d *Deck) shuffleN(n int) {
for k := 0; k < n; k++ {
rand.Shuffle(len(d), func(i, j int) {
d[i], d[j] = d[j], d[i]
})
}
}
In Go方法只能在将其作为指针接收时更改调用的结构的值。请参见按示例进行:方法。
如果您将shuffle()
的接收器设为(d *Deck)
(指向Deck的指针(,则该方法可以对Deck本身进行变异(搅乱(,而不是返回新的搅乱的Deck
。在方法体中,您需要将finalDeck
分配给d
,而不是返回它(或者在没有辅助甲板的情况下使用d
(。每次您调用anyDeck.shuffle()
时,它都会更改anyDeck
,因此您将执行n
次。
注意:如果您打算使shuffle()
在main
包(公共(之外可用,则需要以大写S
开头。我将在我的";伪代码";下图:
func (d *Deck) Shuffle() {
// shuffle d here (and it will change the deck .Shuffle() was called on)
}
// somewhere else in code
...
deck := Deck{}
deck.Shuffle()
从那里你可以扩展func Shuffle(n int)
以进行多次洗牌,并将n
轮嵌入函数体中(或者你可以制作func ShuffleN(n int)
,它将调用原始Shuffle()
n
次。