遨游太空2014

算法分析参照下面的blog麻将胡牌算法

我用lua写了一个简化的麻将算法,只考虑麻将字牌和万

牌编号1~9对应1-9万,,10-16是字牌

下面是lua代码

local print = printlocal tconcat = table.concatlocal tinsert = table.insertlocal srep = string.replocal type = typelocal pairs = pairslocal tostring = tostringlocal next = next function print_r(root)local cache = { [root] = "." }local function _dump(t,space,name)local temp = {}for k,v in pairs(t) dolocal key = tostring(k)if cache[v] thentinsert(temp,"+" .. key .. " {" .. cache[v].."}")elseif type(v) == "table" thenlocal new_key = name .. "." .. keycache[v] = new_keytinsert(temp,"+" .. key .. _dump(v,space .. (next(t,k) and "|" or " " ).. srep(" ",#key),new_key))elsetinsert(temp,"+" .. key .. " [" .. tostring(v).."]")endendreturn tconcat(temp,"\n"..space)endprint(_dump(root, "",""))endlocal Hu = {}function analyze(cards, zi)print_r(cards)print("zi", zi)if not next(cards) thenreturn trueendlocal startlocal overif zi thenstart = 10over = 16elsestart = 1over = 9endlocal finish = truefor i = start, over doif cards[i] and cards[i] ~= 0 thenstart = ifinish = falsebreakendendif finish then — 手牌为空return trueendprint("start", start)local resultif cards[start] and cards[start] >= 3 then — 刻牌cards[start] = cards[start] – 3result = analyze(cards , zi)cards[start] = cards[start] + 3return resultendif not zi and cards[start +1] and cards[start + 2] and cards[start + 1] > 0 and cards[start + 2] > 0 thencards[start ] = cards[start ] – 1cards[start + 1] = cards[start + 1] – 1cards[start + 2] = cards[start + 2] – 1result = analyze(cards, zi)cards[start ] = cards[start ] + 1cards[start + 1] = cards[start + 1] + 1cards[start + 2] = cards[start + 2] + 1return resultendreturn falseendfunction fmod( arr, num)local count = 0for k, v in pairs(arr) docount = count + vendreturn count % numend–是否可胡牌function Hu:win( cards)local jiangPoslocal yuShulocal jiangExisted = falselocal wan = {}local zi = {}for k, v in pairs(cards) doif k < 10 thenwan[k] = velsezi[k] = vendend– wanyuShu = fmod(wan, 3)if yuShu == 1 thenreturn falseelseif yuShu == 2 thenjiangPos = wanjiangExisted = trueend–ziyuShu = fmod(zi, 3)if yuShu == 1 thenreturn falseelseif yuShu == 2 thenif jiangExisted thenreturn falseelsejiangPos = ziendendif jiangPos == wan thenif not analyze(zi, true) thenreturn falseendelseif not analyze(wan, false) thenreturn falseendif not jiangPos then — no jiangreturn falseend– jianglocal success = falsefor k, v in pairs(jiangPos) doif v >= 2 thenjiangPos[k] = v – 2if analyze(jiangPos, jiangPos == zi) thensuccess = trueendjiangPos[k] = vif success thenbreakendendendreturn successend–怎么听牌function Hu:ting(cards)local success = falselocal post = {}local will = {}for k ,v in pairs(cards) doif v > 0 thencards[k] = cards[k] – 1print_r(cards)local willCards = {}for i = 1, 16 doif i ~= k thenif cards[i] thencards[i] = cards[i] + 1elsecards[i] = 1endsuccess = self:win(cards)cards[i] = cards[i] – 1if success thentable.insert(willCards, i)endendendcards[k] = cards[k] + 1if next(willCards) thenwill[k] = willCardsendendendreturn willendlocal player = {[1] = 1,[2] = 1,[3] = 1,[4] = 3,[10] = 3,[12] = 1,[13] = 1,}print_r(Hu:ting(player))return Hu

放弃那些不愿放弃的,容忍那些不可容忍的。

遨游太空2014

相关文章:

你感兴趣的文章:

标签云: