斗地主AI出牌

斗地主游戏的初期版本目前为止大概已经完成的一半了...

还剩下最麻烦的部分(AI)没写,写这篇博文主要是想理一下基本的思路,然后把这一部分也搞完.

先上一个目前的进度截图纪念一下好了

经过较长时间的冥思苦想,包括网上找资料...(网上关于斗地主AI的资料很少.)

终于想到了一个大概可行的办法~先写出来试试吧..

斗地主的AI部分主要分为两块:

一个是主动出牌.(自己是第一个出牌的,或者上一把打出的牌没有人要,又轮到自己了) ---这时候就需要从当前的手牌中选取一道合适的牌打出.

怎样选取呢?这正是要解决的问题.

还有一个是被动出牌,也就是根据上家的牌,从自己的手牌中选取一道比较好的牌打出.

这一个比第一个要麻烦一点,因为涉及到了大小的比较,同队之间的配合等等因素.

怎样从当前手牌中选取一道比较科学的牌呢?

如果我的手牌中有单牌,有对牌,有炸弹,刚上来肯定是出单牌或者对牌,而不是炸弹,(因为炸弹是用来炸别人的)

所以要想得到一个比较好的出牌,就必须遵循一定的规则

(Nothing can be accomplished without norms or standards.)

.....

我的想法是这样的

首先应该扫描整幅手牌,看一下有哪些类型的牌.

这一过程"斗地主业界"称之为拆牌

比如 334445778910JJJJQK2这样的一副烂手牌.

凭借我多年的打牌经验,我觉得应该这样拆:

[JJJJ(炸弹)] [33444(三带二)] [5,8,9,10,Q,K,2(单牌)] (不过这破手牌,怎么拆也是输~)

下面就来看一下怎样分牌才能达到我们想要的效果~

考虑采用4个辅助数组来拆牌

我们将它分成如下的四个数组.

(0)--34578910JQK2

(1)--347J

(2)--4J

(3)--J

然后可以通过这四个数组,得到一个较好的出牌.

首先,我们定义一些牌型组,每个牌型组放该类型的牌,牌型组包括:单牌组,单顺组,对牌组,双顺组,三牌组,三带一组,三带二组,炸弹组,火箭组.

(这里为什么没有四带二组,飞机组呢,因为我觉得这两种牌没什么震慑力,就是一搅屎棍子~)

下面是我总结的一些规律:

  • 在四个数组中,下面的每个数组都是上面数组的子数组.(所以,我们可以由下往上依次扫描各个数组)
  • 如果第四个数组中有元素,则该组手牌中一定有炸弹.(我认为炸弹的作用非常大,所以遇到炸弹应该直接提取出来)
  • 第四个数组变为空时,就扫描第三个数组,第三个数组中的元素一定对应三张相同的牌.(根据这些牌,可以找到三带一,三带二等)
  • 另:[鼓励三带一,三带二,但不鼓励飞机,四带二,这样一是可以降低复杂度,二是四带二没有什么价值].
  • 找单牌(存在与第一个数组中,而不存在于第二个数组中的,一定是单牌,找出单牌后,还应该判断能不能组成单顺)
  • 找双顺(从第二个数组中找,但是双顺最好不要拆三牌,因为三牌的价值大于双顺)
  • 找单顺,肯定是在第一个数组中找~(要单顺还是要对牌是一个比较纠结的问题,可以制定一个标准)
  • 最后总结一下找牌的顺序,就可以开始编码了.

(顺序很重要,好的顺序才能拆出好的牌,下面是我总结的拆牌顺序~)

0.找一下有没有火箭,有的话放入火箭组.

1.找出所有的炸弹,放入炸弹组.

2.找出所有的单牌,放入单牌组.

3.找出三牌,放入三牌组.

4.找出所有的对牌,放入对牌组.

5.找出单牌组中的单顺,放入单顺组.

6.找出对牌组中的双顺,放入双顺组.

7.将三牌组与单牌组的元素依次结合,放入三带一组.

8.将三牌组与对牌组的元素依次结合,放入三带二组

9.注意:三带一不能带大小王,单顺不能带2和大小王,双顺和三顺不能带2.

基于上面的步骤,我们就可以找到一个较好的出牌了~

0.如果是主动出牌,扫描顺序为:

单牌组,单顺组,对牌组,双顺组,三牌组,三带一组,三带二组,炸弹组,火箭组.

出第一个找到的牌即可.

1.如果是被动出牌.

----0.首先找同类型组中比上家大的牌,如果有,出牌.

----1.如果没有,就评估一下是否值得出炸弹,如果值得,则到炸弹组中找,出炸弹.如果不值得,pass.

----2.没有炸弹,就到火箭组中找,出火箭.没有火箭,pass.

注意:暂时没有考虑同队伤害.

原文地址:https://www.cnblogs.com/huangliang-hb/p/8858120.html

时间: 2024-10-09 17:47:57

斗地主AI出牌的相关文章

Unity3D手机斗地主游戏开发实战(03)_地主牌显示和出牌逻辑(不定期更新中~~~)

Hi,之前有同学说要我把源码发出来,那我就把半成品源码的链接放在每篇文件的最后,有兴趣的话可以查阅参考,有问题可以跟我私信,也可以关注我的个人公众号,互相交流嘛.当然,代码也是在不断的持续改进中~ 上期我们实现了叫地主功能,不过遗留了一个小功能:叫地主完成以后,要显示地主的3张牌,这期首先弥补这块的功能: 接着我们要进入开发出牌逻辑的开发阶段,好了,废话不多说,继续我们斗地主开发之旅~ 地主牌的显示 我们在玩家界面的顶部中间位置,放置一个新的GameObject,命名为BidCards,用来记录

cocos2dx《单机斗地主》源码解剖之八 电脑玩家出牌与跟牌(结束)

上一篇文章对玩家手中的牌进行分析归类,下面就该实现电脑玩家出牌与跟牌的策略了.首先我们来看看出牌的策略,代码如下: void GameScene::update(float delta){ switch (m_iState) { case 0: SendPk(); break; case 1: schedule(schedule_selector(GameScene::Call),1); break; case 2: scheduleOnce(schedule_selector(GameScen

开发h5斗地主大厅算法——第十二章の主动出牌(1)

本章开始,我们介绍主动出牌的算法,和被动出牌类似,我们第一步把主要架子搭起来. 首先清空出牌序列 [cpp] view plain copy clsHandCardData.ClearPutCardList(); 主动出牌的策略按照优先级大体可以分为三类: [一]能直接一手牌出去,优先出. [二]两手牌出去且有绝对大牌,先出绝对大牌. [三]出一手牌使得接下来自己手牌价值最大化. [cpp] view plain copy //剪枝:如果能出去最后一手牌直接出 CardGroupData Sur

斗地主滑动选牌&&出牌(Cocos Creator)

本文主要讲解以下几个方面: card model 滑动处理 阴影 选择 出牌 Card Model   首先,牌有两个属性:数字.花型:   ps:本文现在是,用数字和花型来组成一张牌,有空可以再用另一种形式走一遍,比如用54个数字(0-53)来表示一副牌. CardInfo.js //花型 var CardSuit = cc.Enum ({ none: 0, spade: 1, //黑桃 heart: 2, //红心 club: 3, //梅花 diamond: 4,//方块 }); //数字

Android斗地主棋牌游戏牌桌实现源码下载

本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下:为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity    package com.bison;            import android.app.Activity;      import android.content.pm.ActivityInfo;      import android.os.Bundle;      import android.view.Wind

斗地主算法判断牌型

由于近年来网络棋牌游戏的火爆导致个各个地区的特色棋牌游戏开发进入红火时期,也有越来越多的团队个人开始研究棋牌游戏的开发,所以本文主旨在于各个开发人员之间的交流. 每个游戏都有属于自己的规则,当然斗地主也不例外,常斗地主的朋友可能知道在斗地主里面一共有13种牌型,你所出的牌必须符合13种的一种才能够出得了牌,这个就叫地主的规则.那么我们下面可以通过一个枚举结构来表示每一种的牌型,在这里我们把错误的牌型也当成是一种牌型. 那么在编程中我们该怎么来判断一组牌到底该属于哪一种牌型了?? ?这就是接下来我

要讲究相互之间的规则,同创娱乐不会随意出牌

其实按照每一个牌面的组合和相互之间的影响,在玩法上特别需要注意的是彼此之间的陷阱,首先要确定的是应该如何发挥出来各自的标准和相互之间固定的条件,因为随着这些影响以及在提升的方式上,每一种范围以及在利用的表现方式上都是能够获得的,所以同创娱乐会将这些牌面的组合情况能够给我们一些比较具有优势的组合.往往就会比较积极的截杀这种好牌,而且随着这些优势以及在相互之间固定的条件,每一种标准以及在固定的搭配上,这些方式确实能够获得稳定的效果,因为他们要掌握这个牌面组合的主动性. 出牌要有更好的策略,不会受到干

ArrayList模拟斗地主的洗牌,发牌和看牌

/* * ArrayList模拟斗地主的洗牌,发牌和看牌 * * 分析: * 1.创建一个牌盒 * 2.装牌 * 3.洗牌 * 4.发牌 * 5.看牌 */ 代码: import java.util.ArrayList; import java.util.Collections; /** * ArrayList模拟斗地主的洗牌,发牌和看牌 * @author TP * */ public class Doudizhu { /* * ArrayList模拟斗地主的洗牌,发牌和看牌 * * 分析:

使用javascript随机生成斗地主玩家手牌

学习javascript估摸着有半个多月了,好歹自己有过编程基础,学的还算轻松,不过js里的面向对象是真的打脑壳,但都但不懂,和我以前学过的c#简直相差太远 今天写了个随机生成斗地主玩家手牌的代码,自己还蛮满意的,一溜叽滚下床,戳开电脑来分享一手 虽然这种东西根本没啥用,哈哈 卡牌列表数组元素类型: [1, "黑桃", 11, "K"] 每一张卡牌为一个数组,有4个元素,0号元素代表当前花色大小,2号元素代表当前卡片数值大小,1号和3号都是字符串,用来表示卡牌表面信