麻將胡牌演算法 查表法 和 拆解法

2021-08-21 06:28:11 字數 3930 閱讀 6385

/*

1.查表法計算麻將胡牌(原理:

2.跟拆解法對比進行效率比較

*/package main

import (

"fmt"

"time"

"sort"

"os"

"encoding/json"

"log"

"runtime/debug"

"io/ioutil"

"io"

"math/rand"

)type jsondata struct

var g_cards = int

func value2index(value int) int else

}func count(cards int) int

return nums

}func calckey(nums int) int

} else

}} if (b)

} dong := value2index(0x31)

bai := value2index(0x91)

// 字牌

for i := dong; i <= bai; i++

x |= 0x1 << uint32(p)

p++} }

return x

}/* 可以是這種牌型11 111,雖然1不可能有5張,但是可以胡1的.且最多有一種牌是5張牌的組合 */

func checkisvalid(nums int) bool

n := 0

for _, v := range nums

if v == 5

} if n > 1

return true

}func getcardsnum(nums int) int

} return cardsnum

}var printnum = 1

func encode(encodedata map[int]int, cards int) }}

func getpairs() int

} return pairs

}func getgroups() int

} // find three sequence tiles

for i := 2; i < len(g_cards); i++

} }return groups

}/* 將所有胡牌牌型編碼成json資料 */

func encodecards(pairs int, groups int) map[int]int }}

} }fmt.println("-----------------七對----------------")

//七對

l := len(pairs)

temp := make(int, 14)

for i := 0; i < l; i++ }}

}}

} }return encodedata

}func hucards2json()

var jd jsondata

enc := json.newencoder(f)

fmt.println("map len = ", len(m))

for k, v := range m }}

/* 配置檔案只有乙個json資料,如:, 有多個是會出錯 */

func readonejson()

var jd jsondata

err = json.unmarshal(data, &jd)

if err != nil

fmt.println(jd)

}func readalljson() map[int]int

var jd jsondata

dec := json.newdecoder(f)

m := make(map[int]int)

for else if err != nil

m[int(jd.k)] = jd.v

} return m

}var totalcardnums = int

func randcards(allcards int, n int) int

alllen := len(allcards)

var cards = make(int, n)

for i := 0; i < n; i++

return cards

}/* 判斷胡牌-拆解法(3n+2) */

func husplitmethod(nums int, cardsnum int) bool

f := func(n int) bool else

}} return false

} //對子

if cardsnum % 3 == 2

//三張

if f(3)

//順子

loop := int, , }

for j := 0; j < len(loop); j++ else

}} }

return false

}/* 胡牌-七對判斷 */

func huqidui(nums int) bool

} return true

}func ishu(nums int) bool

} return true

}func test1_split(times int, allcards int) }}

func test1(times int, m map[int]int, allcards int) }}

func test2(times int, m map[int]int, allcards int) }}

func test3(times int, m map[int]int, allcards int)

sort.sort(sort.intslice(cards))

nums := count(cards)

key := calckey(nums)

_, ok := m[key]

if ok

if ishu(nums)

} cardstmp := int, //yes

, //no

, //yes

, //no

, //yes

, //no

, //yes

, //no

, //yes

, //no

, //yes

, //no

, //yes

, //no

, //yes

, //yes

, //yes

} for i := 0; i < len(cardstmp) ; i++ else

if ishu(nums) else }}

func benchmark()

begin := time.now().utc().unixnano()

times := 10000000

//test1(times, m, allcards)

test1_split(times, allcards)

//test2(times, m, allcards)

//test3(times, m, allcards)

}func main()

}()fmt.println("start...")

//hucards2json()

benchmark()

fmt.println("end...")

time.sleep(time.duration(3000)*time.second)

}

結論: 查表法效率稍高。拆解法簡單方便,不需要預先生成表,但不穩定:不同的牌型,計算胡牌時消耗時間相差可能很大。查表法需要預先生成表,計算胡牌比較穩定

麻將胡牌演算法

majiang algorithm是帶多張鬼牌的通用胡牌演算法,採用查表方式,簡單高效。在生成表的階段,時間是不值錢的,所以生成方法我們可以任意窮舉。首先分為普通 風 箭三張表。窮舉出所有的key,比如普通表,就是000000000 444420000,因為每一種牌最大4張,且總和不超過14張牌。對...

麻將胡牌演算法 C

這裡只介紹普通的麻將胡牌演算法,也就是7個對子或者 1個對子 3 n n 三個順子或者三個一樣的 其中字牌 東南西北中發白 不能算順子。首先對於每張牌 它有牌的的數字 1 9,牌的種類 萬條筒以及字 所以先封裝乙個牌的包裝類。如果要和伺服器互動的話就應該給這個類序列化 即加上system.seria...

麻將無賴子胡牌演算法

include typedef unsigned char uchar typedef unsigned short ushort define max count 14 define wik null 0 define wik chi hu 0x40 uchar analysedeletepair...