鱼C论坛

 找回密码
 立即注册
查看: 2916|回复: 2

[技术交流] 关于斗地主算法讨论(二)

[复制链接]
发表于 2017-12-14 17:44:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
斗地主发牌的算法:
package main

import (
        "container/list"
        "fmt"
        "math/rand"
        "time"
)

type Person struct {
        flag  int
        cards []string
}

func generateRandomNumber(start int, end int, count int) []int {
        //范围检查
        if end < start || (end-start) < count {
                return nil
        }

        //存放结果的slice
        nums := make([]int, 0)
        //随机数生成器,加入时间戳保证每次生成的随机数不一样
        r := rand.New(rand.NewSource(time.Now().UnixNano()))
        for len(nums) < count {
                //生成随机数
                num := r.Intn((end - start)) + start

                //查重
                exist := false
                for _, v := range nums {
                        if v == num {
                                exist = true
                                break
                        }
                }

                if !exist {
                        nums = append(nums, num)
                }
        }

        return nums
}

func DealCard() ([17]string, [17]string, [17]string, [4]string) {
        card := []string{"A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13",
                "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10", "B11", "B12", "B13",
                "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13",
                "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "K99", "Q66"}

        var list []int
        var cardlist []string
        var r1 [17]string
        var r2 [17]string
        var r3 [17]string
        var r4 [4]string
        list = generateRandomNumber(0, 54, 54)
        fmt.Println(list)
        for j := 0; j < 54; j++ {
                //fmt.Println(card[list[j]])

                cardlist = append(cardlist, card[list[j]])
        }
        for i1 := range cardlist[0:16] {
                r1[i1] = cardlist[0:16][i1]
        }
        for i2 := range cardlist[17:33] {
                r2[i2] = cardlist[17:33][i2]
        }
        for i3 := range cardlist[34:50] {
                r3[i3] = cardlist[34:50][i3]
        }
        for i4 := range cardlist[51:54] {
                r4[i4] = cardlist[51:54][i4]
        }
        return r1, r2, r3, r4

}

func (p *Person) Landlord(s []string) {
        p.flag = 1
        p.cards = append(p.cards, s...)
}

func (p *Person) PlayHand(r1 []string) {
        for _, j := range r1 {
                for x, y := range p.cards {
                        if j == y {
                                p.cards = append(p.cards[:x], p.cards[x+1:]...)
                        }
                }

        }
}

func main() {
        r1, r2, r3, r4 := DealCard()
        p1 := &Person{0, r1[:]}
        p2 := &Person{0, r2[:]}
        p3 := &Person{0, r3[:]}
        fmt.Println(p1, p2, p3)
        //升级为地主
        p1.Landlord(r4[:])
        fmt.Println(p1, p2, p3, r4)
        plist := []Person{*p1, *p2, *p3}
        l := list.New()
        for _, v := range plist {
                l.PushBack(v)
        }
        card_slice := p1.cards[0:3]
        for e := l.Front(); e != nil; e = e.Next() {
                p := e.Value.(Person)
                p.PlayHand(card_slice)
                break
                //fmt.Print(e.Value) //输出list的值,01234
        }
        fmt.Println(p1, p2, p3, r4)

}
************************************************
[ `go run 9.go` | done: 489ms ]
        [3 30 38 43 10 49 31 4 21 45 37 9 15 0 47 11 51 14 32 39 18 6 42 2 44 13 25 16 33 12 23 24 27 34 41 1 22 46 50 36 8 7 5 53 35 52 20 29 26 28 48 17 40 19]
        &{0 [A4 C5 C13 D5 A11 D11 C6 A5 B9 D7 C12 A10 B3 A1 D9 A12 ]} &{0 [B2 C7 D1 B6 A7 D4 A3 D6 B1 B13 B4 C8 A13 B11 B12 C2 ]} &{0 [D3 A2 B10 D8 D12 C11 A9 A8 A6 Q66 C10 K99 B8 C4 C1 C3 ]}
        &{1 [A4 C5 C13 D5 A11 D11 C6 A5 B9 D7 C12 A10 B3 A1 D9 A12  B5 D2 B7 ]} &{0 [B2 C7 D1 B6 A7 D4 A3 D6 B1 B13 B4 C8 A13 B11 B12 C2 ]} &{0 [D3 A2 B10 D8 D12 C11 A9 A8 A6 Q66 C10 K99 B8 C4 C1 C3 ]} [B5 D2 B7 ]
        &{1 [C5 D5 D11 C6 A5 B9 D7 C12 A10 B3 A1 D9 A12  B5 D2 B7    ]} &{0 [B2 C7 D1 B6 A7 D4 A3 D6 B1 B13 B4 C8 A13 B11 B12 C2 ]} &{0 [D3 A2 B10 D8 D12 C11 A9 A8 A6 Q66 C10 K99 B8 C4 C1 C3 ]} [B5 D2 B7 ]

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-14 21:20:47 | 显示全部楼层
感觉好复杂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-15 00:02:05 | 显示全部楼层
这怎么看着像买码啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 14:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表