在围棋中多次洗牌

  • 本文关键字:围棋 go
  • 更新时间 :
  • 英文 :


我是新手,正在尝试通过练习来学习,包括构建一些卡片功能。我有一个洗牌的功能。我如何编写一个函数,以便可以将同一副牌洗牌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次。

最新更新