血战AI
兄弟们有福了,血战AI对战。
思路流程:
1丶识别麻将(这一步不难但是很费时间和精力,要玩很长时间录视频再分别截图)
我现在用的是欢乐麻将,欢乐麻将效果其实很不好,第一游戏画面有灯光环境要影响识别,第二腾讯系都是动态调整对手难度的,这杨就导致不容易测试AI真实水平。有游戏环境的还是用熊猫麻将更好。有这方面资环或者团队的我们可以合作一波呗。
2丶很简单得到游戏信息后直接暴力计算所有可能胡牌牌型(这里可以同时过滤已经出过的牌),同时计算每个牌型得分,每个牌型要丢弃的牌,每个牌型要摸的牌。再计算每个要丢弃的牌单张得分。(核心难点就是如何在0-3秒内完成,超过5秒为不合格,好像网上还没有公开的算法,嘿嘿那不是我还挺厉害)
3丶遍历每个番型丢弃每张手牌的得分,每张牌取最大值
4丶按丢弃每手牌得分排序,每次打出得分最高的手牌。完事了,嘿嘿
#这里打个补丁我一会放个视频,玩麻将时的录屏。
mmexport1678891196411_Trim
#这里是打印胡牌得分前50的所有牌型
#格式为json。格式为key=[弃牌]val=[番数,进张牌,胡牌牌型,番型得分名,牌型得分]
#举个例子:[13, 13, 14, 38, 38, 39] [5, [32, 32, 33, 34, 37, 37], [[32, 32], [33, 33, 33], [34, 34, 34], [36, 36, 36], [37, 37, 37]], ',碰碰胡,断19,清一色', 32.0]
'''
需要弃牌:[13, 13, 14, 38, 38, 39]
需要摸牌: [32, 32, 33, 34, 37, 37]
番数:5(平胡,1 + 碰碰胡,1 + 断19,1 + 清一色,2)共5番(这里给平胡一番是为了出牌是程序要考虑平胡是平推)
牌型:[[32, 32], [33, 33, 33], [34, 34, 34], [36, 36, 36], [37, 37, 37]]
番型得分名:',碰碰胡,断19,清一色'
牌型得分:32.0
'''
[13, 13, 14, 38, 38, 39] [5, [32, 32, 33, 34, 37, 37], [[32, 32], [33, 33, 33], [34, 34, 34], [36, 36, 36], [37, 37, 37]], ',碰碰胡,断19,清一色', 32.0]
[13, 13, 14, 37, 39] [5, [32, 32, 33, 34, 38], [[32, 32], [33, 33, 33], [34, 34, 34], [36, 36, 36], [38, 38, 38]], ',碰碰胡,断19,清一色', 32.0]
[13, 13, 14, 33, 33, 39] [5, [32, 32, 34, 37, 37, 38], [[32, 32], [34, 34, 34], [36, 36, 36], [37, 37, 37], [38, 38, 38]], ',碰碰胡,断19,清一色', 32.0]
[13, 13, 14, 34, 34, 39] [5, [32, 32, 33, 37, 37, 38], [[32, 32], [33, 33, 33], [36, 36, 36], [37, 37, 37], [38, 38, 38]], ',碰碰胡,断19,清一色', 32.0]
[13, 13, 14, 39] [5, [34, 37, 37, 38], [[33, 33], [34, 34, 34], [36, 36, 36], [37, 37, 37], [38, 38, 38]], ',碰碰胡,断19,清一色', 32.0]
[13, 13, 14, 33, 37, 39] [4, [32, 32, 32, 34, 34, 38], [[32, 32], [32, 33, 34], [34, 34, 34], [36, 36, 36], [38, 38, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 33, 38, 39] [4, [32, 32, 32, 34, 34, 36], [[32, 32], [32, 33, 34], [34, 34, 34], [36, 36, 36], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 33, 36, 39] [4, [32, 32, 32, 34, 34, 37], [[32, 32], [32, 33, 34], [34, 34, 34], [36, 37, 38], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 34, 37, 39] [4, [32, 32, 32, 33, 33, 38], [[32, 32], [32, 33, 34], [33, 33, 33], [36, 36, 36], [38, 38, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 34, 38, 39] [4, [32, 32, 32, 33, 33, 36], [[32, 32], [32, 33, 34], [33, 33, 33], [36, 36, 36], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 36, 38, 39] [4, [32, 32, 32, 33, 33, 35], [[32, 32], [32, 33, 34], [33, 33, 33], [34, 35, 36], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 34, 36, 39] [4, [32, 32, 32, 33, 33, 37], [[32, 32], [32, 33, 34], [33, 33, 33], [36, 37, 38], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 33, 34, 39] [4, [32, 32, 32, 37, 37, 38], [[32, 32], [32, 33, 34], [36, 36, 36], [37, 37, 37], [38, 38, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 37, 38, 38] [4, [31, 31, 33, 34, 39, 39], [[31, 31], [33, 33, 33], [34, 34, 34], [36, 36, 36], [39, 39, 39]], ',碰碰胡,清一色', 16.0]
[13, 13, 14, 38, 39] [4, [32, 32, 32, 32, 36], [[32, 32], [32, 33, 34], [36, 36, 36], [32, 33, 34], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 36, 36, 39] [4, [32, 32, 32, 32, 35, 38], [[32, 32], [32, 33, 34], [38, 38, 38], [32, 33, 34], [35, 36, 37]], ',断19,清一色', 16.0]
[13, 13, 14, 36, 39] [4, [32, 32, 32, 32, 37], [[32, 32], [32, 33, 34], [32, 33, 34], [36, 37, 38], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 33, 39] [4, [32, 32, 32, 35, 37], [[32, 32], [32, 33, 34], [34, 35, 36], [36, 37, 38], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 36, 37, 39] [4, [32, 32, 33, 35, 35, 38], [[32, 32], [34, 35, 36], [33, 33, 33], [38, 38, 38], [34, 35, 36]], ',断19,清一色', 16.0]
[13, 13, 14, 34, 39] [4, [32, 32, 33, 35, 37], [[32, 32], [34, 35, 36], [33, 33, 33], [36, 37, 38], [36, 37, 38]], ',断19,清一色', 16.0]
[13, 13, 14, 33, 33] [4, [34, 37, 38, 39, 39], [[37, 37], [34, 34, 34], [36, 36, 36], [38, 38, 38], [39, 39, 39]], ',碰碰胡,清一色', 16.0]
[13, 13, 14, 34, 34] [4, [33, 37, 38, 39, 39], [[37, 37], [33, 33, 33], [36, 36, 36], [38, 38, 38], [39, 39, 39]], ',碰碰胡,清一色', 16.0]
[13, 13, 14, 34, 34, 37] [4, [31, 31, 33, 38, 39, 39], [[31, 31], [33, 33, 33], [36, 36, 36], [38, 38, 38], [39, 39, 39]], ',碰碰胡,清一色', 16.0]
[13, 13, 14, 33, 33, 37] [4, [31, 31, 34, 38, 39, 39], [[31, 31], [34, 34, 34], [36, 36, 36], [38, 38, 38], [39, 39, 39]], ',碰碰胡,清一色', 16.0]
[13, 13, 14, 37] [4, [34, 38, 39, 39], [[33, 33], [34, 34, 34], [36, 36, 36], [38, 38, 38], [39, 39, 39]], ',碰碰胡,清一色', 16.0]
[13, 13, 14, 38, 38] [4, [33, 34, 37, 39, 39], [[37, 37], [33, 33, 33], [34, 34, 34], [36, 36, 36], [39, 39, 39]], ',碰碰胡,清一色', 16.0]
[34, 34, 37, 38, 38, 39] [3, [12, 12, 13, 14, 14, 33], [[12, 12], [13, 13, 13], [14, 14, 14], [33, 33, 33], [36, 36, 36]], ',碰碰胡,断19', 8.0]
[33, 33, 37, 38, 38, 39] [3, [12, 12, 13, 14, 14, 34], [[12, 12], [13, 13, 13], [14, 14, 14], [34, 34, 34], [36, 36, 36]], ',碰碰胡,断19', 8.0]
[33, 33, 34, 34, 37, 39] [3, [12, 12, 13, 14, 14, 38], [[12, 12], [13, 13, 13], [14, 14, 14], [36, 36, 36], [38, 38, 38]], ',碰碰胡,断19', 8.0]
[13, 13, 37, 38, 38, 39] [3, [12, 12, 14, 14, 33, 34], [[12, 12], [14, 14, 14], [33, 33, 33], [34, 34, 34], [36, 36, 36]], ',碰碰胡,断19', 8.0]
[13, 13, 34, 34, 37, 39] [3, [12, 12, 14, 14, 33, 38], [[12, 12], [14, 14, 14], [33, 33, 33], [36, 36, 36], [38, 38, 38]], ',碰碰胡,断19', 8.0]
[13, 13, 33, 33, 37, 39] [3, [12, 12, 14, 14, 34, 38], [[12, 12], [14, 14, 14], [34, 34, 34], [36, 36, 36], [38, 38, 38]], ',碰碰胡,断19', 8.0]
[13, 13, 14, 34, 34, 38] [3, [31, 31, 31, 32, 33, 33], [[31, 31], [31, 32, 33], [33, 33, 33], [36, 36, 36], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 33, 33, 38] [3, [31, 31, 34, 34, 35, 36], [[31, 31], [34, 35, 36], [34, 34, 34], [36, 36, 36], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 33, 34, 38] [3, [31, 31, 31, 32, 35, 36], [[31, 31], [31, 32, 33], [36, 36, 36], [34, 35, 36], [37, 38, 39]], ',清一色', 8.0]
[14, 37, 38, 38, 39] [3, [12, 12, 13, 33, 34], [[12, 12], [13, 13, 13], [33, 33, 33], [34, 34, 34], [36, 36, 36]], ',碰碰胡,断19', 8.0]
[14, 36, 36, 36, 37, 39] [3, [12, 12, 13, 33, 34, 38], [[12, 12], [13, 13, 13], [33, 33, 33], [34, 34, 34], [38, 38, 38]], ',碰碰胡,断19', 8.0]
[14, 34, 34, 38, 38, 39] [3, [12, 12, 13, 33, 37, 37], [[12, 12], [13, 13, 13], [33, 33, 33], [36, 36, 36], [37, 37, 37]], ',碰碰胡,断19', 8.0]
[14, 34, 34, 37, 39] [3, [12, 12, 13, 33, 38], [[12, 12], [13, 13, 13], [33, 33, 33], [36, 36, 36], [38, 38, 38]], ',碰碰胡,断19', 8.0]
[14, 33, 33, 38, 38, 39] [3, [12, 12, 13, 34, 37, 37], [[12, 12], [13, 13, 13], [34, 34, 34], [36, 36, 36], [37, 37, 37]], ',碰碰胡,断19', 8.0]
[14, 33, 33, 37, 39] [3, [12, 12, 13, 34, 38], [[12, 12], [13, 13, 13], [34, 34, 34], [36, 36, 36], [38, 38, 38]], ',碰碰胡,断19', 8.0]
[14, 33, 33, 34, 34, 39] [3, [12, 12, 13, 37, 37, 38], [[12, 12], [13, 13, 13], [36, 36, 36], [37, 37, 37], [38, 38, 38]], ',碰碰胡,断19', 8.0]
[13, 13, 14, 33, 38] [3, [31, 31, 31, 32, 34], [[31, 31], [31, 32, 33], [34, 34, 34], [36, 36, 36], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 33, 36, 36] [3, [31, 31, 31, 32, 34, 37], [[31, 31], [31, 32, 33], [34, 34, 34], [36, 37, 38], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 33, 34, 34] [3, [31, 31, 31, 32, 38, 38], [[31, 31], [31, 32, 33], [36, 36, 36], [38, 38, 38], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 34, 38] [3, [31, 31, 31, 32, 32], [[31, 31], [31, 32, 33], [36, 36, 36], [32, 33, 34], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 36, 36, 38] [3, [31, 31, 31, 32, 32, 35], [[31, 31], [31, 32, 33], [32, 33, 34], [34, 35, 36], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 34, 36, 36] [3, [31, 31, 31, 32, 32, 37], [[31, 31], [31, 32, 33], [32, 33, 34], [36, 37, 38], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 33, 36, 38] [3, [31, 31, 31, 32, 35, 35], [[31, 31], [31, 32, 33], [34, 35, 36], [34, 35, 36], [37, 38, 39]], ',清一色', 8.0]
[13, 13, 14, 33, 34, 36] [3, [31, 31, 31, 32, 35, 37], [[31, 31], [31, 32, 33], [34, 35, 36], [36, 37, 38], [37, 38, 39]], ',清一色', 8.0]
这里写麻将牌型打分器
#调用前先判断副牌条件
fpsx=[0,0,0,0]#258,断19,带19,颜色 副牌状态
if len(fp1)>0:#如果副牌大于0
c1=[]
ys=[]
val_f=0#番型得分
for i in set(fp1):#遍历副牌
if fp1.count(i)==4:val_f+=1#有杠加一番
c1.append(int(i%10))#加入副牌面值 123456789,用于判断带19,断19,258不用考虑颜色
if int(i%10) not in ys:ys.append(int(i%10))#加入副牌颜色 1,2,3用于判断清一色
if len(set(c1) & set([1,3,4,6,7,9]))==0:fpsx[0]=1#可能有258
if len(set(c1) & set([1,9]))==0:fpsx[1]=1#无19
if len(set(c1) & set([2,3,4,5,6,7,8]))==0:fpsx[2]=1#不能找19
if len(ys)==1:fpsx[3]=1#一个颜色,可以继续判断手牌颜色
if len(fp1)==0:fpsx=[1,1,0,1]#如果副牌没有,则所有副牌状态调为准许状态
def 麻将打分(手牌牌型,副牌,弃牌):
#基本牌型判断 碰碰胡,金钩钩 和 无牌型(带顺子定位为无基础牌型)
#再判断状态牌型 258,断19,带19,清一色
#七对是一样的,但是要另外写一个判断函数这里就不贴了
#判断 基础牌型 7对,n龙七对(就这两种)
#再判断 状态牌型和这里过程一样
牌型番值=1
判断是否带有顺子:#基础牌型判断 碰碰胡(金钩钩)和平胡
如果是:牌型番值=1#平胡
如果不是
判断是不是金钩钩:
是金钩钩:牌型番值+=2#金钩钩加两番
不是:牌型番值+=1#碰碰胡加一番
如果副牌可以判断258:
判断所有刻子,顺子,对子相加是否带有258 且 2,5,8 必须出现一次:
是258:牌型番值+=2#258加两番
如果副牌可以判断断19:
判断所有手牌不带有 【1,9】:
是断19: 牌型番值+=1#断19加1番
如果副牌可以判断带19:
判断所有刻子,顺子,对子相加是否带有19 且 1,9 必须出现一次:
是带19:牌型番值+=2#带19加两番
如果副牌可以判断清一色:
判断手牌颜色是否为一个 且 与副牌颜色相同:
是清一色:牌型番值+=2#清一色加两番
return 牌型番值#记得再加上外面副牌的杠牌得分
我先发表吧,以后每天传点,直到传完。
欢迎互相讨论
以下是整个代码。需要将屏幕分辨率调整为1600*900