鱼C论坛

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

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

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

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

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

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

  2. import (
  3.         "container/list"
  4.         "fmt"
  5.         "math/rand"
  6.         "time"
  7. )

  8. type Person struct {
  9.         flag  int
  10.         cards []string
  11. }

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

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

  24.                 //查重
  25.                 exist := false
  26.                 for _, v := range nums {
  27.                         if v == num {
  28.                                 exist = true
  29.                                 break
  30.                         }
  31.                 }

  32.                 if !exist {
  33.                         nums = append(nums, num)
  34.                 }
  35.         }

  36.         return nums
  37. }

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

  43.         var list []int
  44.         var cardlist []string
  45.         var r1 [17]string
  46.         var r2 [17]string
  47.         var r3 [17]string
  48.         var r4 [4]string
  49.         list = generateRandomNumber(0, 54, 54)
  50.         fmt.Println(list)
  51.         for j := 0; j < 54; j++ {
  52.                 //fmt.Println(card[list[j]])

  53.                 cardlist = append(cardlist, card[list[j]])
  54.         }
  55.         for i1 := range cardlist[0:16] {
  56.                 r1[i1] = cardlist[0:16][i1]
  57.         }
  58.         for i2 := range cardlist[17:33] {
  59.                 r2[i2] = cardlist[17:33][i2]
  60.         }
  61.         for i3 := range cardlist[34:50] {
  62.                 r3[i3] = cardlist[34:50][i3]
  63.         }
  64.         for i4 := range cardlist[51:54] {
  65.                 r4[i4] = cardlist[51:54][i4]
  66.         }
  67.         return r1, r2, r3, r4

  68. }

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

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

  80.         }
  81. }

  82. func main() {
  83.         r1, r2, r3, r4 := DealCard()
  84.         p1 := &Person{0, r1[:]}
  85.         p2 := &Person{0, r2[:]}
  86.         p3 := &Person{0, r3[:]}
  87.         fmt.Println(p1, p2, p3)
  88.         //升级为地主
  89.         p1.Landlord(r4[:])
  90.         fmt.Println(p1, p2, p3, r4)
  91.         plist := []Person{*p1, *p2, *p3}
  92.         l := list.New()
  93.         for _, v := range plist {
  94.                 l.PushBack(v)
  95.         }
  96.         card_slice := p1.cards[0:3]
  97.         for e := l.Front(); e != nil; e = e.Next() {
  98.                 p := e.Value.(Person)
  99.                 p.PlayHand(card_slice)
  100.                 break
  101.                 //fmt.Print(e.Value) //输出list的值,01234
  102.         }
  103.         fmt.Println(p1, p2, p3, r4)

  104. }
复制代码

************************************************
[ `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 ]

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-12-14 21:20:47 | 显示全部楼层
感觉好复杂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-15 00:02:05 | 显示全部楼层
这怎么看着像买码啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 16:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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