背景
闲着没事,写了个武汉麻将的判断胡牌方法,因为每把癞子不一样而且只能带一个癞子胡牌,所以没有判断多个癞子的情况,主要是碰到清一色又带癞子的情况,不知道胡了没有,而且打哪张胡的更多,类似于一个简单的指示器
【注】如果胡牌的时候没有癞子或者癞子没有变成其他牌,算是硬的,两倍计算;胡牌的时候有癞子,算是软的,一倍计算
直接上代码
card = {11: '一万', 12: '二万', 13: '三万', 14: '四万', 15: '五万', 16: '六万', 17: '七万', 18: '八万', 19: '九万',
21: '一筒', 22: '二筒', 23: '三筒', 24: '四筒', 25: '五筒', 26: '六筒', 27: '七筒', 28: '八筒', 29: '九筒',
31: '一条', 32: '二条', 33: '三条', 34: '四条', 35: '五条', 36: '六条', 37: '七条', 38: '八条', 39: '九条',
41: '东风', 42: '南风', 43: '西风', 44: '北风', 45: '红中', 46: '发财', 47: '白板'}
def if_success(cards14):
# 找到所有的对子,判断剩下的12张能不能组成顺子
pair = []
for i in set(cards14):
if cards14.count(i) >= 2:
pair.append(i)
# print(pair)
for p in pair:
tmp = cards14[:]
tmp.remove(p)
tmp.remove(p)
# print('\n去除对子之后的序列为:', tmp)
# 现在判断tmp是不是顺序序列
for trip in set(tmp):
if tmp.count(trip) >= 3:
tmp.remove(trip)
tmp.remove(trip)
tmp.remove(trip)
# print('去除三张之后的序列为:', tmp)
# 现在判断tmp里面还有没有顺子
tmp.sort()
while len(tmp) > 0:
start = tmp[0]
if start + 1 in tmp and start + 2 in tmp:
tmp.remove(start)
tmp.remove(start + 1)
tmp.remove(start + 2)
else:
break
# print('去除三连之后的序列为:', tmp)
if not tmp:
return True
return False
def if_ready(cards13, ran):
# 武汉麻将胡牌时至多只能有一个癞子
cards13.sort()
ans, ans_print = [], []
# print('Begin:', cards13, len(cards13))
# 考虑癞子,且癞子已经存在手牌里
if ran in cards13:
cards13.remove(ran)
for i in range(11, 40):
if i % 10 == 0:
continue
cards13.append(i)
for j in range(11, 40):
if j % 10 == 0:
continue
cards13.append(j)
if if_success(cards13):
ans.append(j)
# print('癞子当做:', card[i], '可以胡:', card[j])
cards13.remove(j)
cards13.remove(i)
cards13.append(ran)
if not ans:
# print('还没停口!!!打牌!摸牌!')
return False
# print('Switch1:', cards13, len(cards13))
# 考虑癞子,但癞子不存在手牌里
else:
ans.append(ran)
for i in range(11, 40):
if i % 10 == 0:
continue
cards13.append(i)
if if_success(cards13):
ans.append(i)
cards13.remove(i)
if len(ans) == 1:
# print('还没停口!!!打牌!摸牌!')
return False
# print('Switch2:', cards13, len(cards13))
ans = list(set(ans))
ans.sort()
for i in ans:
ans_print.append(card[i])
# print('可以胡:', ans_print)
# print('End:', cards13, len(cards13))
return ans_print
def success_or_ready(cards14: list, ran: int):
cards14.sort()
cards14_print = []
ans = 0
for i in cards14:
cards14_print.append(card[i])
print('这副牌是:', cards14_print)
print('癞子是:', card[ran])
# case1:不管有没有癞子,直接糊了,硬的
if if_success(cards14):
print('胡牌!硬的!赢2倍!')
return True
# case2:有癞子,也糊了,软的
if ran in cards14:
cards14.remove(ran)
for i in range(11, 40):
if i in [20, 30]:
continue
cards14.append(i)
if if_success(cards14):
print('胡牌!软的!赢1倍!')
return True
cards14.remove(i)
cards14.append(ran)
# case3:不管有没有癞子,打一张停口
tmp = list(set(cards14[:]))
for i in tmp:
cards14.remove(i)
# print(cards14, len(cards14))
if if_ready(cards14, ran):
print('打掉:', card[i], '可以胡:', if_ready(cards14, ran))
ans += 1
cards14.append(i)
# case4:不管有没有癞子,口都没停
if ans == 0:
print('【警告】口都没停!随便打一张吧!')
return True
if __name__ == '__main__':
cards14 = [11,11,11,12,13,14,15,16,17,18,19,19,19,22]
cards13 = [13,13,13,14,14,14,15,16,17,18,19,19,19]
ran = 21
# print(if_ready(cards13, ran))
success_or_ready(cards14, ran)
运行结果是这样的:
这副牌比较有代表性,1112345678999,这13张底牌甚至还有个专业名词:九莲宝灯,一到九万都可以胡牌,用来判断麻将程序的执行结果非常适合
【注】这里没有判断暗杠加番的情况,只算是普通胡牌;七小对也不能胡牌;感兴趣的可以基于我的代码继续修改,增加这些判断方式
总结
这一版暂时写出来给我自己看的,还没润色,后期会在这篇文章上继续修改,增加注释和评论