点击注册
点击注册
.

斗地主就用AI出牌器让我们一起用Python制作赢取海量欢乐豆走上豆豆巅峰

发布日期:2022-02-26 21:09    点击次数:98
前言最近在CSDN上看到一个很火的开源项目《斗地主老是输?一起用Python做个AI出牌器,欢乐豆蹭蹭涨!》,但是在扑克牌牌型识别的时候由于使用的是特定模板匹配,所以只适用于固定分辨率的某游戏大厅的斗地主,而无法适用于大部分的斗地主,尤其是某手游助手的斗地主。于是打算通过YOLOv5算法进行扑克牌目标检测与识别,从而实现AI出牌。那么现在我们就一起来学习自己制作一个基于Dragon少年版本的斗地主出牌器,看看AI是如何来帮助我们斗地主,赢取海量欢乐豆,走上豆豆巅峰的吧!首先一起来看看AI斗地主出牌器的效果:出牌器实现效果: 可以看到,该游戏平台自带的推荐牌型是一对八,而我们这款出牌器推荐出一对A,可以看到效果还是比较明显的。下面,我们开始介绍这个AI出牌器的制作过程。一、核心功能设计这款出牌器是基于Dragon少年开发的,核心是DouZero,利用训练好的AI模型给出最优出牌方案。所以我们首先要让这个出牌器确认一个AI出牌角色,代表我们玩家自己。其次我们只要给这个AI出牌器输入玩家手牌和三张底牌。确认好地主和农民的各个角色,告诉它三个人对应的关系,这样就可以确定队友和对手。我们还要识别每一轮其他两人的出牌并将其输入到出牌器,这样出牌器就可以根据出牌数据,及时提供给我们最优出牌决策,带领我们取得胜利。那么如何获取三者之间的关系呢?谁是地主?谁是农民?是自己一人作战还是农民合作?自己玩家的手牌是什么?三张底牌是什么?其他人出牌情况是什么?这些也都需要在开局后逐步确认。拆解需求后,整理出核心功能如下:UI设计排版布局 显示三张底牌显示AI角色出牌数据区域,上家出牌数据区域,下家出牌数据区域,本局胜率区域AI玩家手牌区域AI出牌器开始停止手牌和出牌数据识别 游戏刚开始根据屏幕位置,截图识别AI玩家手牌及三张底牌确认三者之间的关系,识别地主和农民角色,确认队友及对手关系识别每轮三位玩家依次出了什么牌,刷新显示对应区域AI出牌方案输出 加载训练好的AI模型,初始化游戏环境每轮出牌判断,根据上家出牌数据给出最优出牌决策自动刷新玩家剩余手牌和本局胜率预测二、实现步骤1. UI设计排版布局由于我们是基于Dragon少年开发的AI出牌器进行开发,所以我们不需要重新制作界面,只需要理解该界面设计,并将通用的扑克牌牌型识别加入到手牌和出牌数据识别就可以了。其使用的是pyqt5,进行简单的UI布局设计,核心代码如下:def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "AI欢乐斗地主")) self.WinRate.setText(_translate("Form", "胜率:--%")) self.InitCard.setText(_translate("Form", "开始")) self.UserHandCards.setText(_translate("Form", "手牌")) self.LPlayedCard.setText(_translate("Form", "上家出牌区域")) self.RPlayedCard.setText(_translate("Form", "下家出牌区域")) self.PredictedCard.setText(_translate("Form", "AI出牌区域")) self.ThreeLandlordCards.setText(_translate("Form", "三张底牌")) self.Stop.setText(_translate("Form", "停止"))实现效果如下:2. 手牌和出牌数据识别下面我们需要截取游戏屏幕特定区域,并将相应截图送入提前训练好的神经网络中进行图像识别,这样才能获取AI玩家手牌、底牌、每一轮出牌、三者关系(地主、地主上家、地主下家)。识别AI玩家手牌及三张底牌:我们可以截取游戏屏幕的固定位置,送入训练好的YOLOv5网络,来识别当前AI玩家的手牌和三张底牌。核心代码如下:def find_three_landlord_cards(self, pos): three_landlord_cards_real = "" img = pyautogui.screenshot(region=pos) three_landlord_cards_real=detect_cards(img) return three_landlord_cards_real def find_my_cards(self, pos): user_hand_cards_real = "" img.save(path) raw_cards=detect(source=path) replace_cards=[replace_num[i] if i in replace_num else i for i in raw_cards] list_cards = sorted(replace_cards, key=lambda x: ranks_value[x]) cards=("".join(list_cards)) return cards def detect() # Initialize set_logging() # device = select_device(device) device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#若有gpu可用则用gpu # half &= device.type != 'cpu' # half precision only supported on CUDA w = weights[0] if isinstance(weights, list) else weights classify, pt, onnx = False, w.endswith('.pt'), w.endswith('.onnx') # inference type stride, names = 64, [f'class{i}' for i in range(1000)] # assign defaults if pt: model = attempt_load(weights, map_location=device) # load FP32 model stride = int(model.stride.max()) # model stride names = model.module.names if hasattr(model, 'module') else model.names # get class names if half: model.half() # to FP16 if classify: # second-stage classifier modelc = load_classifier(name='resnet50', n=2) # initialize modelc.load_state_dict(torch.load('resnet50.pt', map_location=device)['model']).to(device).eval() elif onnx: check_requirements(('onnx', 'onnxruntime')) import onnxruntime session = onnxruntime.InferenceSession(w, None) dataset = LoadImages(source, img_size=imgsz, stride=stride) bs = 1 # batch_size vid_path, vid_writer = [None] * bs, [None] * bs t0 = time.time() imgsz = check_img_size(imgsz, s=stride) # check image size for path, img, im0s, vid_cap in dataset: if pt: img = torch.from_numpy(img).to(device) img = img.half() if half else img.float() # uint8 to fp16/32 elif onnx: img = img.astype('float32') img /= 255.0 # 0 - 255 to 0.0 - 1.0 if len(img.shape) == 3: img = img[None] # expand for batch dim # Inference t1 = time_sync() if pt: pred = model(img, augment=augment, visualize=visualize)[0] elif onnx: pred = torch.tensor(session.run([session.get_outputs()[0].name], {session.get_inputs()[0].name: img})) # NMS pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det) t2 = time_sync() # Second-stage classifier (optional) if classify: pred = apply_classifier(pred, modelc, img, im0s) # Process predictions for i, det in enumerate(pred): # detections per image p, s, im0, frame = path, '', im0s.copy(), getattr(dataset, 'frame', 0) p = Path(p) # to Path gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh imc = im0.copy() if save_crop else im0 # for save_crop if len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() lists=[] # Print results for c in det[:, -1].unique(): n = (det[:, -1] == c).sum() # detections per class for i in range(n): lists.append(names[int(c)]) return lists效果如下所示:地主、地主上家、地主下家:同理我们可以根据游戏屏幕截图,识别地主的图标,确认地主角色。核心代码如下:# 查找地主角色 def find_landlord(self, landlord_flag_pos): for pos in landlord_flag_pos: result = pyautogui.locateOnScreen('pics/landlord_words.png', region=pos, confidence=self.LandlordFlagConfidence) if result is not None: return landlord_flag_pos.index(pos) return None 效果如下所示:这样我们就可以得到玩家AI手牌,其他玩家手牌(预测),地主三张底牌,三者角色关系,出牌顺序。3. AI出牌方案输出这一部分,我们依然是基于Dragon少年所用到的DouZero开源的AI斗地主了。DouZero项目地https://github.com/kwai/DouZero。我们需要将该开源项目下载并导入项目中。创建一个AI玩家角色,初始化游戏环境,加载模型,进行每轮的出牌判断,控制一局游戏流程的进行和结束。但在这过程中需要判断斗地主中其他二人的出牌情况,包括等待,不出或者出牌。所以在这一阶段,我们训练了ResNet50网络,将对应区域的图像送入网络中进行三种状态的判断。如果是出牌的话,那么再将对应区域的图像送入YOLOv5网络进行牌型识别。出牌、不出、等待状态:同理我们可以根据游戏屏幕截图,识别其他人出牌区域,判断其状态 。核心代码如下:labels=['等待','出牌','不出'] device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#若有gpu可用则用gpu model +'_'+time+'.png' src = cv2.imread(path) # aeroplane.jpg image = cv2.resize(src, (224, 224)) image = np.float32(image) / 255.0 image[:,:,] -= (np.float32(0.485), np.float32(0.456), np.float32(0.406)) image[:,:,] /= (np.float32(0.229), np.float32(0.224), np.float32(0.225)) image = image.transpose((2, 0, 1)) input_x = torch.from_numpy(image).unsqueeze(0).to(device) pred = model(input_x) pred_index = torch.argmax(pred, 1).cpu().detach().numpy() pred_index=int(pred_index) print(pred_index) return pred_index效果如下所示: 到这里,整个AI斗地主出牌流程基本已经完成了。三、出牌器用法按照上述过程,这款AI出牌器已经制作完成了。后面应该如何使用?如果不想研究源码,只想使用这款AI斗地主出牌器,验证下效果,那么下面开始介绍如何配置环境并运行这个AI出牌器。1. 环境配置首先我们需要安装这些第三方库,配置相关环境,如下所示:torch==1.9.0 GitPython==3.0.5 gitdb2==2.0.6 PyAutoGUI==0.9.50 PyQt5==5.13.0 PyQt5-sip==12.8.1 Pillow>=5.2.0 opencv-python rlcard2. 坐标调整确认我们可以打开斗地主游戏界面,把AI出牌器程序窗口需要移至右下角,只要不要遮挡手牌、地主标志、底牌、历史出牌这些关键位置,就可以。其次我们要确认屏幕截图获取的各个区域是否正确。如果有问题需要进行区域位置坐标调整。# 坐标 self.MyHandCardsPos = (110, 1310, 3620, 600) # 我的截图区域 self.LPlayedCardsPos = (880, 340, 1020, 545) # 左边截图区域 self.RPlayedCardsPos = (1940, 340, 1020, 545) # 右边截图区域 self.LandlordFlagPos = [ (105, 545, 240, 260), (640, 1190, 240, 260), (3475, 545, 240, 260)] # 地主标志截图区域(右-我-左) self.ThreeLandlordCardsPos = (1770, 50, 300, 170) # 地主底牌截图区域,resize成349x168调整无误后,效果如下:3. 运行测试当所有环境配置完成,各区域坐标位置确认无误之后,下面我们就可以直接运行程序,测试效果啦~首先我们运行AI出牌器程序,打开欢乐斗地主游戏界面,进入游戏。当玩家就位,手牌分发完毕,地主身份确认之后,我们就可以点击画面中开始按钮,让AI来帮助我们斗地主了。下面可以一起来看看这款AI出牌器的实验效果喔,看看AI是如何带领农民打倒地主,取得胜利的!斗地主就用AI出牌器!今天我们就到这里,明天继续努力!如果对如何用YOLOv5进行牌型图像检测与识别感兴趣的同学,可以参考我上一篇文章《杀鸡用牛刀!通过YOLOv5识别斗地主牌型,做一个AI记牌器,再也不用担心如何算牌赢豆了!》。感谢H师姐的鼎力相助!!!如果该文章对您有所帮助,麻烦点赞,关注,收藏三连支持下!创作不易,白嫖不好,各位的支持和认可,是我创作的最大动力!如果本文有任何错误,请批评指教,不胜感激 !!!参考:斗地主老是输?一起用Python做个AI出牌器,欢乐豆蹭蹭涨!​

其实,四川麻将现在已经不是一个地区的概念了,随着网络化的发展,早已推广到各地,受到了更多不论男女还是老少的欢迎了。所以可以说是在全国都颇为出名的地方麻将。那么四川麻将究竟怎么开始呢?四川麻将的核心是打缺门,刮风下雨棋牌资讯,成都计番和查花猪。光听这些名称都觉得四川麻将的地域性很强。四川麻将的特别之处在于它是只有条,筒,万三种牌,而没有风,花和箭牌。牌总共有108张,比较少。也正是因为牌类减少,使得整个牌局不会显得过分繁杂,玩起来也比较容易观察棋牌资讯,从而使得玩家倾注力较高。





Powered by 电子游戏平台 @2013-2022 RSS地图 HTML地图

网站统计——

  • 谷歌搜索留痕推广
  • 谷歌搜索留痕排名技术
  • 谷歌快速排名
  • 留痕方法
  • 谷歌搜索快速方法
  • google搜索留痕程序
  • 谷歌快速排名
  • 澳门太阳城
  • 最大博彩公司
  • 谷歌搜索关键词排名
  • 搜索留痕程序
  • 谷歌排名出售
  • 谷歌蜘蛛池排名
  • 搜索留痕软件
  • 缅甸果敢赌场
  • 电子游艺规则
  • 谷歌留痕推广
  • google引流程序
  • 谷歌快速排名
  • google引流程序
  • 留痕推广
  • 大西洋城赌场
  • 买球地址
  • 搜索留痕
  • 搜索留痕程序出售
  • 谷歌蜘蛛池排名技术
  • 留痕程序
  • 如何提高google搜索排名
  • 数字币博彩
  • 洗钱方法
  • Google留痕收录
  • 最新谷歌搜索留痕排名
  • 搜索留痕
  • Google留痕收录
  • google搜索留痕
  • 数字币博彩网站
  • 足球投注平台
  • 博彩推广话术
  • 推广引流方法
  • 引流方法
  • 博彩推广话术
  • 网上博彩推广引流
  • 数字币赌场
  • 皇冠现金网
  • 蜘蛛池排名
  • 谷歌蜘蛛池
  • 留痕程序出售
  • google搜索留痕程序
  • 比特币网上赌场
  • 洗钱平台
  • 搜索留痕
  • 博彩推广方式
  • 网上博彩推广
  • 快速排名
  • 搜索留痕程序
  • bbin平台大全
  • 体育博彩公司排名
  • 留痕排名技术
  • 最新谷歌关键词排名
  • 推广渠道
  • 谷歌快速排名
  • 博彩推广
  • 世界杯赌球地址
  • 皇冠博彩公司
  • 谷歌排名出售
  • 博彩引流渠道
  • 搜索留痕程序
  • google搜索留痕
  • 引流渠道
  • 果敢网上赌场
  • 世界杯赌球
  • 搜索留痕方法
  • 博彩搜索留痕
  • 博彩引流
  • 博彩引流
  • 搜索留痕
  • 缅甸网上赌场
  • 欧洲杯赌球
  • 谷歌搜索排名
  • 留痕程序
  • 网上博彩推广引流
  • 留痕技术
  • 搜索留痕技术出售
  • 澳门威尼斯人网上赌场
  • 外围博彩
  • 博彩网站推广
  • 推广引流
  • 留痕程序出售
  • 谷歌推广引流技术
  • 推广引流方法
  • 美国在线赌场
  • 沙巴体育投注平台
  • 最新谷歌搜索留痕
  • 谷歌蜘蛛池排名技术
  • 网站推广方法
  • 留痕程序出售
  • 博彩推广方法
  • 菠菜论坛
  • 买球平台
  • 谷歌搜索留痕
  • 蜘蛛池排名
  • 博彩公司推广渠道
  • 谷歌搜索留痕
  • 博彩公司推广渠道
  • 真钱游戏
  • 网上赌球地址
  • 赌球平台推荐
  • 赌球网址
  • 博彩包网
  • 买球app
  • 澳门博彩公司
  • 威尼斯人赌场
  • 博彩平台推荐
  • 美国博彩网站
  • 缅甸实体赌场
  • 柬埔寨网上赌场
  • 柬埔寨在线赌场
  • 韩国博彩
  • 支持人民币的博彩公司
  • 世界五大比特币交易所
  • 欧易是哪个国家的
  • 中币跑路
  • 亚洲博彩公司
  • 合法网上赌场
  • 马尼拉赌场
  • 支持人民币的博彩公司
  • 大陆博彩平台
  • 澳门新葡京娱乐城
  • 老挝赌场
  • 世界赌场排名
  • 网上博彩公司排行
  • 菠菜论坛
  • 东南亚赌博网站
  • 虚拟币博彩
  • 澳门百家乐网址
  • 网上博彩导航
  • 区块链百家乐游戏
  • 马来西亚博彩公司
  • 越南赌场
  • 区块链百家乐
  • 香港娱乐场
  • 澳大利亚赌博网站
  • 足球赔率
  • 菲律宾网上赌场
  • 数字币博彩网站
  • 足球投注网站
  • 百家乐论坛
  • 皇冠体育博彩公司
  • 网上赌博网站
  • 网上博彩推广话术
  • 谷歌搜索快速方法
  • 网上博彩推广话术
  • 数字币赌场
  • 皇冠博彩公司
  • 世界杯博彩公司
  • 英国博彩公司
  • 网上博彩合法化
  • 新加坡赌场
  • 比特币网上赌场
  • 怎么洗钱
  • 加密货币博彩平台
  • 世界杯赌球网址
  • 网上赌球地址
  • 博彩推广方式
  • 印度尼西亚博彩公司
  • 国际包网
  • bbin平台直营
  • 亚洲体育博彩平台
  • 越南博彩公司
  • 百家乐路单
  • 澳门博彩官网
  • 博彩网推荐
  • 澳门太阳城网址
  • 百家乐网址
  • 世界杯赌球网址
  • 皇冠博彩网址
  • 洗钱方法
  • 买球网站
  • 欧洲杯赌球平台
  • 皇冠现金网
  • 外围赌球平台
  • 果敢赌场
  • 买球技巧
  • 全球最大博彩公司
  • 电子游艺
  • 真人电子游戏
  • 骰宝游戏规则
  • 亚洲体育博彩平台
  • 澳门在线赌场
  • 缅甸赌场地址
  • 赌球平台
  • 赌场如何赢钱
  • 世界杯买球网站
  • 真人牌九游戏
  • 世界杯买球官网
  • 时时彩平台
  • 六合彩预测
  • 威尼斯人网上赌场
  • 外围赌球网站
  • 赌博网址
  • 彩票群
  • 微信赌博群
  • 韩国首尔赌场
  • 赌钱游戏
  • 美国网上赌场
  • bbin官网
  • 沙巴体育官网
  • 博彩平台推荐
  • 数字币博彩网站
  • 比特币网上赌场
  • 世界赌场名单
  • 美国赌场攻略
  • 菠菜论坛排名
  • 菠菜论坛排名
  • 缅甸网上赌场
  • 支持人民币的博彩公司