https://blog.csdn/hhladminhhl/article/details/119304504
前言最近在网上看到一个有意思的开源项目,快手团队开发的开源AI斗地主——DouZero。今天我们就一起来学习制作一个基于DouZero的欢乐斗地主出牌器,看看AI是如何来帮助我们斗地主,赢欢乐豆,实现财富自由的吧!
首先一起来看看AI斗地主出牌器的效果:
下面,我们开始介绍这个AI出牌器的制作过程。
一、核心功能设计首先我们这款出牌器是基于DouZero开发的,核心是需要利用训练好的AI模型来帮住我们,给出最优出牌方案。
其次关于出牌器,先要需要确认一个AI出牌角色,代表我们玩家自己。我们只要给这个AI输入玩家手牌和三张底牌。确认好地主和农民的各个角色,告诉它三个人对应的关系,这样就可以确定队友和对手。我们还要将每一轮其他两人的出牌输入,这样出牌器就可以根据出牌数据,及时提供给我们最优出牌决策,带领我们取得胜利!
那么如何获取三者之间的关系呢?谁是地主?谁是农民?是自己一人作战还是农民合作?自己玩家的手牌是什么?三张底牌是什么?这些也都需要在开局后确认好。
拆解需求,大致可以整理出核心功能如下:
UI设计排版布局
显示三张底牌显示AI角色出牌数据区域,上家出牌数据区域,下家出牌数据区域,本局胜率区域AI玩家手牌区域AI出牌器开始停止手牌和出牌数据识别
游戏刚开始根据屏幕位置,截图识别AI玩家手牌及三张底牌确认三者之间的关系,识别地主和农民角色,确认队友及对手关系识别每轮三位玩家依次出了什么牌,刷新显示对应区域AI出牌方案输出
加载训练好的AI模型,初始化游戏环境每轮出牌判断,根据上家出牌数据给出最优出牌决策自动刷新玩家剩余手牌和本局胜率预测二、实现步骤1. UI设计排版布局根据上述功能,我们首先考虑进行简单的UI布局设计,这里我们使用的是pyqt5。核心设计代码如下:
def setupUi(self, Form): Form.setObjectName("Form") Form.resize(440, 395) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(9) font.setBold(True) font.setItalic(False) font.setWeight(75) Form.setFont(font) self.WinRate = QtWidgets.QLabel(Form) self.WinRate.setGeometry(QtCore.QRect(240, 180, 171, 61)) font = QtGui.QFont() font.setPointSize(14) self.WinRate.setFont(font) self.WinRate.setAlignment(QtCore.Qt.AlignCenter) self.WinRate.setObjectName("WinRate") self.InitCard = QtWidgets.QPushButton(Form) self.InitCard.setGeometry(QtCore.QRect(60, 330, 121, 41)) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(14) font.setBold(True) font.setWeight(75) self.InitCard.setFont(font) self.InitCard.setStyleSheet("") self.InitCard.setObjectName("InitCard") self.UserHandCards = QtWidgets.QLabel(Form) self.UserHandCards.setGeometry(QtCore.QRect(10, 260, 421, 41)) font = QtGui.QFont() font.setPointSize(14) self.UserHandCards.setFont(font) self.UserHandCards.setAlignment(QtCore.Qt.AlignCenter) self.UserHandCards.setObjectName("UserHandCards") self.LPlayer = QtWidgets.QFrame(Form) self.LPlayer.setGeometry(QtCore.QRect(10, 80, 201, 61)) self.LPlayer.setFrameShape(QtWidgets.QFrame.StyledPanel) self.LPlayer.setFrameShadow(QtWidgets.QFrame.Raised) self.LPlayer.setObjectName("LPlayer") self.LPlayedCard = QtWidgets.QLabel(self.LPlayer) self.LPlayedCard.setGeometry(QtCore.QRect(0, 0, 201, 61)) font = QtGui.QFont() font.setPointSize(14) self.LPlayedCard.setFont(font) self.LPlayedCard.setAlignment(QtCore.Qt.AlignCenter) self.LPlayedCard.setObjectName("LPlayedCard") self.RPlayer = QtWidgets.QFrame(Form) self.RPlayer.setGeometry(QtCore.QRect(230, 80, 201, 61)) font = QtGui.QFont() font.setPointSize(16) self.RPlayer.setFont(font) self.RPlayer.setFrameShape(QtWidgets.QFrame.StyledPanel) self.RPlayer.setFrameShadow(QtWidgets.QFrame.Raised) self.RPlayer.setObjectName("RPlayer") self.RPlayedCard = QtWidgets.QLabel(self.RPlayer) self.RPlayedCard.setGeometry(QtCore.QRect(0, 0, 201, 61)) font = QtGui.QFont() font.setPointSize(14) self.RPlayedCard.setFont(font) self.RPlayedCard.setAlignment(QtCore.Qt.AlignCenter) self.RPlayedCard.setObjectName("RPlayedCard") self.Player = QtWidgets.QFrame(Form) self.Player.setGeometry(QtCore.QRect(40, 180, 171, 61)) self.Player.setFrameShape(QtWidgets.QFrame.StyledPanel) self.Player.setFrameShadow(QtWidgets.QFrame.Raised) self.Player.setObjectName("Player") self.PredictedCard = QtWidgets.QLabel(self.Player) self.PredictedCard.setGeometry(QtCore.QRect(0, 0, 171, 61)) font = QtGui.QFont() font.setPointSize(14) self.PredictedCard.setFont(font) self.PredictedCard.setAlignment(QtCore.Qt.AlignCenter) self.PredictedCard.setObjectName("PredictedCard") self.ThreeLandlordCards = QtWidgets.QLabel(Form) self.ThreeLandlordCards.setGeometry(QtCore.QRect(140, 10, 161, 41)) font = QtGui.QFont() font.setPointSize(16) self.ThreeLandlordCards.setFont(font) self.ThreeLandlordCards.setAlignment(QtCore.Qt.AlignCenter) self.ThreeLandlordCards.setObjectName("ThreeLandlordCards") self.Stop = QtWidgets.QPushButton(Form) self.Stop.setGeometry(QtCore.QRect(260, 330, 111, 41)) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(14) font.setBold(True) font.setWeight(75) self.Stop.setFont(font) self.Stop.setStyleSheet("") self.Stop.setObjectName("Stop") self.retranslateUi(Form) self.InitCardednnect(Formit_cards) self.Stopednnect(Form.stop) QtCore.QMetaObjectnnectSlotsByName(Form)def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "AI欢乐斗地主--Dragon少年")) 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玩家手牌及三张底牌:
我们可以截取游戏屏幕,根据固定位置来识别当前AI玩家的手牌和三张底牌。核心代码如下:
# 牌检测结果滤波def cards_filter(self, location, distance): if len(location) == 0: return 0 locList = [location[0][0]] count = 1 for e in location: flag = 1 # “是新的”标志 for have in locList: if abs(e[0] - have) <= distance: flag = 0 break if flag: count += 1 locListend(e[0]) return count# 获取玩家AI手牌def find_my_cards(self, pos): user_hand_cards_real = "" img = pyautoguireenshot(region=pos) for card in AllCards: result = pyautogui.locateAll(needleImage='pics/m' + card + '.png', haystackImage=img, confidence=self.MyConfidence) user_hand_cards_real += card[1] * selfds_filter(list(result), self.MyFilter) return user_hand_cards_real# 获取地主三张底牌def find_three_landlord_cards(self, pos): three_landlord_cards_real = "" img = pyautoguireenshot(region=pos) img = img.resize((349, 168)) for card in AllCards: result = pyautogui.locateAll(needleImage='pics/o' + card + '.png', haystackImage=img, confidence=self.ThreeLandlordCardsConfidence) three_landlord_cards_real += card[1] * selfds_filter(list(result), self.OtherFilter) return three_landlord_cards_real
效果如下所示:
地主、地主上家、地主下家:
同理我们可以根据游戏屏幕截图,识别地主的图标,确认地主角色。核心代码如下:
# 查找地主角色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_posdex(pos) return None
这样我们就可以得到玩家AI手牌,其他玩家手牌(预测),地主三张底牌,三者角色关系,出牌顺序。核心代码如下:
# 坐标self.MyHandCardsPos = (414, 804, 1041, 59) # AI玩家截图区域self.LPlayedCardsPos = (530, 470, 380, 160) # 左侧玩家截图区域self.RPlayedCardsPos = (1010, 470, 380, 160) # 右侧玩家截图区域self.LandlordFlagPos = [(1320, 300, 110, 140), (320, 720, 110, 140), (500, 300, 110, 140)] # 地主标志截图区域(右-我-左)self.ThreeLandlordCardsPos = (817, 36, 287, 136) # 地主底牌截图区域,resize成349x168def init_cards(self): # 玩家手牌 selfer_hand_cards_real = "" selfer_hand_cards_env = [] # 其他玩家出牌 self.other_played_cards_real = "" self.other_played_cards_env = [] # 其他玩家手牌(整副牌减去玩家手牌,后续再减掉历史出牌) self.other_hand_cards = [] # 三张底牌 self.three_landlord_cards_real = "" self.three_landlord_cards_env = [] # 玩家角色代码:0-地主上家, 1-地主, 2-地主下家 selfer_position_code = None selfer_position = "" # 开局时三个玩家的手牌 selfd_play_data_list = {} # 出牌顺序:0-玩家出牌, 1-玩家下家出牌, 2-玩家上家出牌 self.play_order = 0 self.env = None # 识别玩家手牌 selfer_hand_cards_real = self.find_my_cards(self.MyHandCardsPos) self.UserHandCards.setText(selfer_hand_cards_real) selfer_hand_cards_env = [RealCard2EnvCard[c] for c in list(selfer_hand_cards_real)] # 识别三张底牌 self.three_landlord_cards_real = self.find_three_landlord_cards(self.ThreeLandlordCardsPos) self.ThreeLandlordCards.setText("底牌:" + self.three_landlord_cards_real) self.three_landlord_cards_env = [RealCard2EnvCard[c] for c in list(self.three_landlord_cards_real)] # 识别玩家的角色 selfer_position_code = self.find_landlord(self.LandlordFlagPos) if selfer_position_code is None: items = ("地主上家", "地主", "地主下家") item, okPressed = QInputDialog.getItem(self, "选择角色", "未识别到地主,请手动选择角色:", items, 0, False) if okPressed and item: selfer_position_code = itemsdex(item) else: return selfer_position = ['landlord_up', 'landlord', 'landlord_down'][selfer_position_code] for player in self.Players: player.setStyleSheet('background-color: rgba(255, 0, 0, 0);') self.Players[selfer_position_code].setStyleSheet('background-color: rgba(255, 0, 0, 0.1);') # 整副牌减去玩家手上的牌,就是其他人的手牌,再分配给另外两个角色(如何分配对AI判断没有影响) for i in set(AllEnvCard): self.other_hand_cards.extend([i] * (AllEnvCardunt(i) - selfer_hand_cards_envunt(i))) selfd_play_data_list.update({ 'three_landlord_cards': self.three_landlord_cards_env, ['landlord_up', 'landlord', 'landlord_down'][(selfer_position_code + 0) % 3]: selfer_hand_cards_env, ['landlord_up', 'landlord', 'landlord_down'][(selfer_position_code + 1) % 3]: self.other_hand_cards[0:17] if (selfer_position_code + 1) % 3 != 1 else self.other_hand_cards[17:], ['landlord_up', 'landlord', 'landlord_down'][(selfer_position_code + 2) % 3]: self.other_hand_cards[0:17] if (selfer_position_code + 1) % 3 == 1 else self.other_hand_cards[17:] }) print(selfd_play_data_list) # 生成手牌结束,校验手牌数量 if len(selfd_play_data_list["three_landlord_cards"]) != 3: QMessageBox.critical(self, "底牌识别出错", "底牌必须是3张!", QMessageBox.Yes, QMessageBox.Yes) selfit_display() return if len(selfd_play_data_list["landlord_up"]) != 17 or \ len(selfd_play_data_list["landlord_down"]) != 17 or \ len(selfd_play_data_list["landlord"]) != 20: QMessageBox.critical(self, "手牌识别出错", "初始手牌数目有误", QMessageBox.Yes, QMessageBox.Yes) selfit_display() return # 得到出牌顺序 self.play_order = 0 if selfer_position == "landlord" else 1 if selfer_position == "landlord_up" else 2
效果如下:
3. AI出牌方案输出下面我们就需要用到DouZero开源的AI斗地主了。DouZero项目地址:https://github/kwai/DouZero。我们需要将该开源项目下载并导入项目中。
创建一个AI玩家角色,初始化游戏环境,加载模型,进行每轮的出牌判断,控制一局游戏流程的进行和结束。核心代码如下:
# 创建一个代表玩家的AIai_players = [0, 0]ai_players[0] = selfer_positionai_players[1] = DeepAgent(selfer_position, selfd_play_model_path_dict[selfer_position])# 初始化游戏环境self.env = GameEnv(ai_players)# 游戏开始self.start()def start(self): self.envd_play_init(selfd_play_data_list) print("开始出牌\n") while not self.env_over: # 玩家出牌时就通过智能体获取action,否则通过识别获取其他玩家出牌 if self.play_order == 0: self.PredictedCard.setText("...") action_message = self.env.step(selfer_position) # 更新界面 self.UserHandCards.setText("手牌:" + str(''.join( [EnvCard2RealCard[c] for c in self.env_sets[selfer_position].player_hand_cards]))[::-1]) self.PredictedCard.setText(action_message["action"] if action_message["action"] else "不出") self.WinRate.setText("胜率:" + action_message["win_rate"]) print("\n手牌:", str(''.join( [EnvCard2RealCard[c] for c in self.env_sets[selfer_position].player_hand_cards]))) print("出牌:", action_message["action"] if action_message["action"] else "不出", ", 胜率:", action_message["win_rate"]) while self.have_white(self.RPlayedCardsPos) == 1 or \ pyautogui.locateOnScreen('pics/pass.png', region=self.RPlayedCardsPos, confidence=self.LandlordFlagConfidence): print("等待玩家出牌") selfunter.restart() while selfunter.elapsed() < 100: QtWidgets.QApplicationcessEvents(QEventLoop.AllEvents, 50) self.play_order = 1 elif self.play_order == 1: self.RPlayedCard.setText("...") pass_flag = None while self.have_white(self.RPlayedCardsPos) == 0 and \ not pyautogui.locateOnScreen('pics/pass.png', region=self.RPlayedCardsPos, confidence=self.LandlordFlagConfidence): print("等待下家出牌") selfunter.restart() while selfunter.elapsed() < 500: QtWidgets.QApplicationcessEvents(QEventLoop.AllEvents, 50) selfunter.restart() while selfunter.elapsed() < 500: QtWidgets.QApplicationcessEvents(QEventLoop.AllEvents, 50) # 不出 pass_flag = pyautogui.locateOnScreen('pics/pass.png', region=self.RPlayedCardsPos, confidence=self.LandlordFlagConfidence) # 未找到"不出" if pass_flag is None: # 识别下家出牌 self.other_played_cards_real = self.find_other_cards(self.RPlayedCardsPos) # 找到"不出" else: self.other_played_cards_real = "" print("\n下家出牌:", self.other_played_cards_real) self.other_played_cards_env = [RealCard2EnvCard[c] for c in list(self.other_played_cards_real)] self.env.step(selfer_position, self.other_played_cards_env) # 更新界面 self.RPlayedCard.setText(self.other_played_cards_real if self.other_played_cards_real else "不出") self.play_order = 2 elif self.play_order == 2: self.LPlayedCard.setText("...") while self.have_white(self.LPlayedCardsPos) == 0 and \ not pyautogui.locateOnScreen('pics/pass.png', region=self.LPlayedCardsPos, confidence=self.LandlordFlagConfidence): print("等待上家出牌") selfunter.restart() while selfunter.elapsed() < 500: QtWidgets.QApplicationcessEvents(QEventLoop.AllEvents, 50) selfunter.restart() while selfunter.elapsed() < 500: QtWidgets.QApplicationcessEvents(QEventLoop.AllEvents, 50) # 不出 pass_flag = pyautogui.locateOnScreen('pics/pass.png', region=self.LPlayedCardsPos, confidence=self.LandlordFlagConfidence) # 未找到"不出" if pass_flag is None: # 识别上家出牌 self.other_played_cards_real = self.find_other_cards(self.LPlayedCardsPos) # 找到"不出" else: self.other_played_cards_real = "" print("\n上家出牌:", self.other_played_cards_real) self.other_played_cards_env = [RealCard2EnvCard[c] for c in list(self.other_played_cards_real)] self.env.step(selfer_position, self.other_played_cards_env) self.play_order = 0 # 更新界面 self.LPlayedCard.setText(self.other_played_cards_real if self.other_played_cards_real else "不出") else: pass selfunter.restart() while selfunter.elapsed() < 100: QtWidgets.QApplicationcessEvents(QEventLoop.AllEvents, 50) print("{}胜,本局结束!\n".format("农民" if self.envner == "farmer" else "地主")) QMessageBoxrmation(self, "本局结束", "{}胜!".format("农民" if self.envner == "farmer" else "地主"), QMessageBox.Yes, QMessageBox.Yes) self.env.reset() selfit_display()
到这里,整个AI斗地主出牌流程基本已经完成了。
三、出牌器用法按照上述过程,这款AI出牌器已经制作完成了。后面应该如何使用呢?如果不想研究源码,只想使用这款AI斗地主出牌器,验证下效果,该怎么配置环境运行这个AI出牌器呢?下面就开始介绍。
1. 环境配置首先我们需要安装这些第三方库,配置相关环境,如下所示:
torch==1.9.0GitPython==3.0.5gitdb2==2.0.6PyAutoGUI==0.9.50PyQt5==5.13.0PyQt5-sip==12.8.1Pillow>=5.2.0opencv-pythonrlcard2. 坐标调整确认
我们可以打开欢乐斗地主游戏界面,将游戏窗口模式下最大化运行,把AI出牌器程序窗口需要移至右下角,不能遮挡手牌、地主标志、底牌、历史出牌这些关键位置。
其次我们要确认屏幕截图获取的各个区域是否正确。如果有问题需要进行区域位置坐标调整。
# 坐标self.MyHandCardsPos = (414, 804, 1041, 59) # 我的截图区域self.LPlayedCardsPos = (530, 470, 380, 160) # 左边截图区域self.RPlayedCardsPos = (1010, 470, 380, 160) # 右边截图区域self.LandlordFlagPos = [(1320, 300, 110, 140), (320, 720, 110, 140), (500, 300, 110, 140)] # 地主标志截图区域(右-我-左)self.ThreeLandlordCardsPos = (817, 36, 287, 136) # 地主底牌截图区域,resize成349x168
3. 运行测试当所有环境配置完成,各区域坐标位置确认无误之后,下面我们就可以直接运行程序,测试效果啦~
首先我们运行AI出牌器程序,打开欢乐斗地主游戏界面,进入游戏。当玩家就位,手牌分发完毕,地主身份确认之后,我们就可以点击画面中开始按钮,让AI来帮助我们斗地主了。
下面可以一起来看看这款AI出牌器的实验效果喔,看看AI是如何带领农民打倒地主,取得胜利的!
若本篇内容对您有所帮助,请三连点赞,在看,转发支持下。
1、一般都是花钱买100万左右,然后去高倍场打;运气好的话,像现在的不洗牌玩法,几把就可以上1000万了,当然前提是要有一定的实力,不然给你天牌都要机会输掉。
2、纯粹靠系统送每天9000豆赢上来,这些基本都是大神级别的,同时也要有一定的毅力才能完成。因为这个前面是最难搞的,但是只要把豆打到50万之后上豆速度就会快了。
3、在某宝上购买的豆豆,之前貌似很便宜,至于现在还有没有的卖就不知道了,因为我没有买过。
首先,我可以保证,你按照这些套路来,胜率不在65%以上,你可以回来举报我。不过没看过我上一篇技巧篇的最好去看一下,你要是一般的技巧都没学会,就去玩套路,也是扯淡。
其次,除了我的粉丝,我并不希望这篇文章被更多人看到,因为越多人知道这些套路,你我也就越不好混。所以喜欢这篇文章的读者,点个赞,收藏起来,关注一下作者就好,不用去转发。
再次,这篇文章讲的是不洗牌(这个模式容易套路)模式的高倍场(至少3w豆以上局)中的套路,希望读者不要记错。当然,这些套路在其他模式或者低倍场中也有作用,只是不及这个明显。
好了,进入正题。由于篇幅较长,一时看不完的可以先收藏。
套路一:不抢地主。不洗牌模式总会给人一个错觉——我的牌很好!特别是当前面两个人都没有叫地主的时候,总有人忍不住要叫(低倍局永远都是这样),结果被炸到哭!其实在这个模式中,只要能忍住不抢地主,你的胜率立即就能上升到60%以上!假如一定要抢,就看一下假如自己多了三张废牌,还能不能打的赢——不洗牌模式中,底牌有用率不足20%!特别是当有人叫地主的时候,相信我,你的牌绝没有好到和他去抢地主的地步!你可能看着手中的牌比较顺,但那也基本意味着别人手中的牌也比较顺!牌真好的话,别人当地主,你立即(注意是立即!后面提到的立即都是立即马上立刻的意思,不一一再提)超级加倍,然后给队友倒一杯茶,队友就会超级配合你出牌,这样你不但赢面更大,说不定还能打出更高的倍数!你说你又何必去冒那个险?——我用了多少个感叹号,就证明我有多强调这件事!
套路二:假如你牌很差,怎么让别人也不叫地主。这里说一下“6秒法则”,我曾经研究过,高倍场玩家做出决定的时间,基本都是在5——6秒之间(我上一篇讲斗地主技巧的那篇,曾说过“沉默法则”,就是以“6秒法则”为基础的。我也研究过低倍场的做出决定的时间——比高倍场稍短,约4——5秒),我们可以利用这个,大作文章!(我后面也会多次提到6秒法则,读者要记住)在你叫地主的时候,沉默6秒再点不叫,别人会以为你牌很好,只是不适合当地主,从而让别人也不敢叫——越高倍场,6秒法则越好用。
套路三:假如你的牌很好,自己不叫地主怎么让别人叫。一种是立即点不叫(成功率50%),一种是装掉线——就是一直不动等系统自动放弃不叫地主(成功率60%),一种是自己不叫之后,挨个给下面的人倒茶——别人会误以为你是心虚(成功率70%)。
套路四:超级加倍的用法。一个超级加倍,就是两个炸弹的威慑力!在高倍场,除非牌很好,不然超级加倍并不是很多,我们可以利用这点,把差牌打赢。比如你当地主,手里的牌很顺,但是没炸弹,这样你反而用了超级加倍更容易打赢——别人会误以为你手里有炸弹,而且还不止一个,所以会不敢炸出来,从而放你过牌。但假如你不超级加倍,可能第二手牌都过不了就被炸了。
套路五:后手法则。在这个模式中,大家出牌的次数相对于普通场至少要少一半——因为大家牌都好,根本就没几手牌(所以假如你是地主上家,堵地主牌必须做到位!),所以我们出牌的时候一定要考虑出牌顺序。我上一篇讲技巧的时候,说到过“后手法则”,在这里更为适用!在这个模式中,假如你有王炸,开局出个2被炸的几率很小,但是假如你开局出了一个飞机,基本就被炸了,而很多时候,就是因为一张2没过去而输了一手好牌。
套路六:你农民,牌很差,怎么不输更高的倍数。首先抢地主的时候六秒法则后再不抢,然后向抢地主的人扔番茄,让他感觉你也想抢地主,但是被他抢了,也可以给队友上茶,一样的效果,都是可以防止别人超级加倍。而差牌想打赢的话,就不能破罐子破摔,其实在这个模式中,有的时候你一张牌都不用出就能赢,而且还是超高倍数,你要做的就是配合队友就行了。
套路七:你牌很好,怎么打出更高的倍数。首先是亦步亦趋,从抢地主到每次出牌都6秒法则(想超级加倍就等时间快过完再点超级加倍),让别人感觉你不敢抢,不敢炸,那别人会帮你出炸弹增加倍数。还有就是你知道外面还有炸弹,但你手里有更大的炸弹,那你可以留两手牌不出(只留一个炸弹的话威慑力太大),在知道对方无法一次把牌出完的情况下,等对方炸出来之后再收回来。还有一个有意思的,就是你给队友上茶的时候,队友会炸,而你给对手上茶的话,很多时候也有这个效果——因为他感觉你是心虚。
套路八:你地主,牌一般的赢牌技巧。上面提到,好牌的时候慢出,那差牌的时候则要快出,让别人感觉你有炸弹在手上,所以超级自信。讲个实例,我三个2带单收回来一手牌,手里剩一个比较小的炸和一个三带一共八张牌,因为我超级加倍了,且前面出牌速度快,所以外面有4个炸都没敢炸,但牌出到这个时候被炸的话,也是完蛋,并输高倍数。所以我在三个2收回那手牌之后,立即向两个农民扔番茄,让农民感觉我手里八张牌是两个炸,扔番茄是在勾引他们出炸弹,结果不出所料,没人敢炸,我三代一打出去之后,炸弹一收,赢了。
套路九:留牌技巧。1.由于这个模式中炸弹多,所以并不是你每手牌都能收的回来,所以留牌的时候必须注意,不能空门!也就是留牌尽量每门都有,这样别人出哪门你都能再过牌,这就更有机会赢牌。2.比如出三带一时,每个人的习惯都是带最小的那个,但有的时候这样并不对,像你把手里小牌带出完了,再出单牌的时候,你出个k想过自己的2,基本过不了!但是假如你出的是3,那你过2的几率就增加太多了。3.很多人两个炸弹的话,炸出去一个之后,第二个就不敢炸了,因为心里没底,(其实就在你考虑要不要炸的这6秒,你已经输了)其实不用怕,你手里有个三带一,别人也会感觉你有个炸弹,像我上面讲那个例子,其实即使我先出炸弹,留个三带一,我也会赢——因为我心理上已经占据上风了。
套路十:心理博弈。从上面那些套路,大家可以看出来,你能不能赢,有时候跟你的牌的好坏关系不大,反而是看你能不能在心理博弈上占据上风,这个不好具体讲,需要你去感受气氛,有时候你一个表情,能把这手牌打赢,但有时候同样是这手牌,这个表情,反而挨了炸弹输了。你在考虑的时候,根据气氛,反向思考,在心理上赢得时候,你就赢一半了。
套路十一:杀大放小。结合猜牌技巧,比如你是地主,出个对3你下家就用对j来压,你可以考虑放他过,但是假如他用对2来压的话,你反而不能放他(你不空门的情况下另说),因为他很可能出的每一手牌你都收不过来。
套路十二:打一枪换个地方。套路这玩意,对生人好用,当别人摸清了还跟他这么玩就没多大用了。
套路十三:猜牌技巧。这个比较复杂,这里就先讲一下简单的,1.记牌器左划会看到别人出过什么牌。2.根据对方的出牌速度,考虑时间,有无加倍来猜测对方谁手里有炸弹,谁会给你送牌。
套路的话就先发这么多,我过段时间可能会开直播,大家想看结合实战的套路和高端猜牌技巧的话,可以关注一下我的头条号和大鱼号——火种电竞或者企鹅号——少年小凡,开直播我到时会通知大家,到时候会细讲,也会帮粉丝赢欢乐豆哦!
如果不开直播的话,我会再写一篇图文类的文章讲猜牌技巧。
还有,想要其他模式套路的玩家,可以留言告诉我,我会根据留言情况,再发新的。
祝大家一波连胜赢百万欢乐豆。
1、一般都是花钱买100万左右,然后去高倍场打;运气好的话,像现在的不洗牌玩法,几把就可以上1000万了,当然前提是要有一定的实力,不然给你天牌都要机会输掉。
2、纯粹靠系统送每天9000豆赢上来,这些基本都是大神级别的,同时也要有一定的毅力才能完成。因为这个前面是最难搞的,但是只要把豆打到50万之后上豆速度就会快了。
3、在某宝上购买的豆豆,之前貌似很便宜,至于现在还有没有的卖就不知道了,因为我没有买过。