go 实现斗地主牌型检测

写了一个简单的牌型检测算法,还请方家多指点

本方法没有使用 1-5 为花色 1-13 表示牌点的方法 而是使用 1-54 分别代表方块1 -大王来表示每张牌

package main

import (

"fmt"

"time"

"math/rand"

"runtime"

"log"

)

//所有扑克牌id

//1,2,3,4,5,6,7,8,9,10,11,12,13

//14,15,16,17,18,19,20,21,22,23,24,25,26

//27,28,29,30,31,32,33,34,35,36,37,38,39

//40,.41,42,43,44,45,46,47,48,49,50,51,52

//53,54

const (

_ =iota

  CARD_TYPE_SINGLE  //单牌

  CARD_TYPE_TWO      //对牌

  CARD_TYPE_THREE  // 三张

  CARD_TYPE_THREE_ONE  // 三带1

  CARD_TYPE_THREE_TWO  // 三带2

  CARD_TYPE_SING_SHUN  // 单顺

  CARD_TYPE_TWO_SHUN  //双顺

  CARD_TYPE_THREE_SHUN  //三顺

  CARD_TYPE_AIR_SINGLE // 飞机带单

  CARD_TYPE_AIR_TWO  // 飞机带双

  CARD_TYPE_FOUR_TOW // 四带二

  CARD_TYPE_BOOM    // 炸弹

  CARD_TYPE_ROCKET //火箭

)


//统计多有各牌点的张数

func getPointNum(arr []int)map[int][]int {

cardMap := make(map[int]int)

for _, v :=range arr {

_, id := getColorAndID(v)

num, ok := cardMap[id]

if !ok {

cardMap[id] =1

      }

cardMap[id] = num +1

  }

detailMap := make(map[int][]int)

for id, num :=range cardMap {

detailMap[num] = append(detailMap[num], id)

}

return detailMap

}

//计算牌型

//牌点为(1-54)

//传入的牌是有序的

func getCardType(arr []int) int  {

detailMap:=getPointNum(arr)

len1:= len(detailMap[1])

len2 := len(detailMap[2])

len3 := len(detailMap[3])

len4 := len(detailMap[4])


switch len(detailMap) {

case 1:

if len1 ==1  {//单牌

        return CARD_TYPE_SINGLE

      }else if  len1 ==2 && arr[0]==53 &&arr[1]==54  {

return  CARD_TYPE_ROCKET  //火箭

      }else if len2 ==1 {

return CARD_TYPE_TWO //对子

      }else if len3 ==1 {

return  CARD_TYPE_THREE //三张

      }else if len1 >=5  {

fmt.Println("detail",detailMap[1],isSort(detailMap[1]))

if !isSort(detailMap[1]) {

return -1

        }

return CARD_TYPE_SING_SHUN  //单顺

      }else if len2 >=3 {

if !isSort(detailMap[2]) {

return  -1

        }

return CARD_TYPE_TWO_SHUN //双顺

      }else if len3 >=2  {//三顺

        if  isSort(detailMap[3]) {

return CARD_TYPE_THREE_SHUN

        }else  {// 4,5,6 ,8 飞机带单

            if len3 ==4  {

m:=splitSlice(detailMap[3])

if len(m)==2 &&( (len(m[0])==1 && isSort(m[1])) || (len(m[1])==1 && isSort(m[0]))  ) {

return CARD_TYPE_AIR_SINGLE

              }

return -1

            }

}

}else if len4==1 {

return CARD_TYPE_BOOM

      }else {

return  -1

      }

case 2:

if  len1==1 && len3 ==1{

return CARD_TYPE_THREE_ONE  //三带单

      }else if  len2 ==1 && len3 ==1{

return CARD_TYPE_THREE_TWO //三带对

      }else if  len4==1 && (len1 ==2 || len2==2){

return CARD_TYPE_FOUR_TOW

      }else if len3 == len1 && len3 !=0 {

if !isSort(detailMap[3]) {

return -1

        }


return CARD_TYPE_AIR_SINGLE //飞机带单

      }else if (len3==len2 || len3 == len4*2) && len3 !=0 {

if !isSort(detailMap[3]) {

return -1

        }

return CARD_TYPE_AIR_TWO //飞机带对

      }else if len3==5 && len1==1 {// 4,5,6,7,9 +1单

        m:=splitSlice(detailMap[3])

if len(m)==2 &&( (len(m[0])==1 && isSort(m[1])) || (len(m[1])==1 && isSort(m[0]))  ) {


return CARD_TYPE_AIR_SINGLE

        }

return -1

      }else if len3 == len4*4  && len3 !=0{//4,5,6,7 +炸弹

        if isSort(detailMap[3]) {

return CARD_TYPE_AIR_SINGLE

        }

return -1

      }

return -1

  case 3:

if (len4*2 + len2 )== len3 && len3 !=0 {

if !isSort(detailMap[3]) {

return -1

        }

return CARD_TYPE_AIR_TWO

      }else if  len3 ==5 &&len4 ==1 && len1==1{//4,5,6,7,8 +炸弹 +1

        return CARD_TYPE_AIR_SINGLE

      }

return  -1

  case 4:

return  -1

  }

return  -1

}

//检查数组是否连续

func isSort(arr []int)bool  {

randomQuickSort(arr,0,len(arr))

for i:=0;i

if arr[i+1] -arr[i] >1 {

return false

      }

}

return  true

}

获取一张牌的花色和牌点

func getColorAndID(point int) (color int,id int) {

color1 := point /13

  if point %13 ==0 {

color = color1

}else {

color = color1+1

  }

point2 := point %13

  if point >=53{

id = point

}else if point2 ==0 {

id =13

  }else if point2 ==1  {

id =14

  }else if point2 ==2{

id =15

  }else  {

id = point2

}

return

}

快速排序

func randomQuickSort(list []int, start, end int) {

if end-start >1 {

// get the pivot

      mid := randomPartition(list, start, end)

randomQuickSort(list, start, mid)

randomQuickSort(list, mid+1, end)

}

}

func randomPartition(list []int, begin, end int) int {

i := randInt(begin, end)

list[i], list[begin] = list[begin], list[i]

return partition(list, begin, end)

}

func partition(list []int, begin, end int) (i int) {

cValue := list[begin]

i = begin

for j := i +1; j < end; j++ {

if list[j] < cValue {

i++

list[j], list[i] = list[i], list[j]

}

}

list[i], list[begin] = list[begin], list[i]

return i

}

func randInt(min, max int) int {

rand.Seed(time.Now().UnixNano())

return min + rand.Intn(max-min)

}

//将有序切片切割为有序与无序切片

//4,5,6,8

func splitSlice(arr []int)map[int][]int {

l := len(arr)

m := make(map[int][]int)

l3 :=0

  for i :=0; i < l-1; i++ {

l2 := len(m)

if arr[i+1]-arr[i] >1 {

fmt.Println(i+1)

m[l2] = arr[l3:i+1]

l3 = i+1

      }

}

m[len(m)] = arr[l3:]

return m

}

//所有扑克牌id

//1,  2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13

//14,15,16,17,18,19,20,21,22,23,24,25,26

//27,28,29,30,31,32,33,34,35,36,37,38,39

//40,.41,42,43,44,45,46,47,48,49,50,51,52

//53,54

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349