人机(AI)四人斗地主

2023-10-30

最近在使用Cocos Creator做一款四人斗地主的手机游戏,半成品(仅前端)代码附在最后,仅供参考。游戏中的单机(人机)模式以及游戏过程中的托管都需要出牌算法的设计,因此借这篇博客梳理一下现有的一些思路。

首先,明确“AI出牌算法的目的是能够模拟人打牌时的思考过程”,所以我根据平时自己玩斗地主的游戏经验,将思考过程大致分成了三个部分:“看自己手中的牌”、“看别人打出的牌”和“我该怎么出牌”。

第一步:看自己手中的牌

如何让电脑知道自己拿了一手什么牌呢?我这里所说的“知道”并不只是让电脑获取到点数、花色这样的数据,然是在此基础上通过牌型分析生成一套出牌方案。这里,我们需要引进一个“手数”的概念,就是指在不被压的前提下,需要多少次出牌机会才能把手中的牌打光。由于不同的出牌方案,同样的一手牌,可能有好几个不同的手数。

1.1 牌型分析

下面这段代码并不是完整代码,是我从项目中截取部分直接复制过来的,写的有些粗糙,为的是能表达大概意思,具体的牌型判断规则可参考四人斗地主

/* 最后的数字代表此类牌型可能打出的张数
    判断牌组的类型:
    -1: 不符合逻辑的牌
    1: 单牌 ------------------------------------------------------------------------------1
    2: 2张相同数字的牌(对子)---------------------------------------------------------------2
    3: 3张相同数字的牌 ---------------------------------------------------------------------3
    4: 4张相同数字的牌(炸弹)---------------------------------------------------------------4
    5: 5张相同数字的牌(炸弹)---------------------------------------------------------------5
    6: 6张相同数字的牌(炸弹)---------------------------------------------------------------6
    7: 7张相同数字的牌(炸弹)---------------------------------------------------------------7
    8: 8张相同数字的牌(炸弹)---------------------------------------------------------------8
    9: 2张大王带2张小王(王炸)--------------------------------------------------------------4
    10: 5张或5张以上数字连续的牌(顺子)-------------------------------------------------------5~13
    11: 3张相同数字的牌带一对(三带二)--------------------------------------------------------5
    12: 3个或3个以上连续的对子(姐妹对)-------------------------------------------------------6,8,10,……,26
    13: 2个或2个以上连续的3张相同数字的牌(飞机)-----------------------------------------------6,9,12,……,30
    14: 2个或2个以上连续的3张相同数字的牌带同样数量的连续的对子(飞机带翅膀)------------------------10,15,20,25,30
*/
        // 判断单张
        if (choose.length == 1){ // choose 代表被选中的牌,数组型,以下皆是
            return 1;
        }
        // 判断对子
        if (choose.length == 2){ // Math.floor(Poker._player1[c_player[i]]/10) 代表player1手中被选中的牌,i 代表被选中的牌中从小到大第i张,从0开始,以下皆是
            if (Math.floor(Poker._player1[c_player[0]]/10) == Math.floor(Poker._player1[c_player[1]]/10) && Math.floor(Poker._player1[c_player[0]]/10) < 14) {
                return 2;
            }
        }
        // 判断三张相同的牌
        if (choose.length == 3){
            if (Math.floor(Poker._player1[c_player[0]]/10) == Math.floor(Poker._player1[c_player[1]]/10) && Math.floor(Poker._player1[c_player[1]]/10) == Math.floor(Poker._player1[c_player[2]]/10) && Math.floor(Poker._player1[c_player[0]]/10) < 14) {
                return 3;
            }
        }
        // 判断四张炸弹
        if (choose.length == 4) {
            if (M
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人机(AI)四人斗地主 的相关文章

  • 腾讯云数据库团队:MySQL5.7 JSON实现简介

    作者介绍 吴双桥 腾讯云工程师 阅读原文 更多技术干货 请访问腾云阁 本文主要介绍在MySQL 5 7 7开始引入的非结构化数据类型JSON的特性以及具体的实现方式 包括存储方式 首先介绍为什么要引入JSON的原生数据类型的支持 接着介绍M
  • element-ui表格el-table的使用

    先给大家展示一下效果 Table 属性 属性名 说明 类型 可选值 默认值 data 显示的数据 array height Table 的高度 默认为自动高度 如果 height 为 number 类型 单位 px 如果 height 为
  • Python+win32gui将Excel文件xlsx批量快速转换xls(附完整代码+全注释)

    欢迎来到Python办公自动化专栏 Python处理办公问题 解放您的双手 博客主页 一晌小贪欢的博客主页 该系列文章专栏 Python办公自动化专栏 文章作者技术和水平有限 如果文中出现错误 希望大家能指正 欢迎各位佬关注 Python可
  • java 是面向对象编程的语言

    什么叫对象 public class Person private string name 什么叫类 Person是定义了一个人的java类 它是一类事物的统称 既然是人了 那就应该有名字吧 name就是person的一个属性 比如还有年龄
  • linux更改文件属性,Linux系统中修改与查看文件属性的基本方法

    chattrchattr 修改文件在Linux第二扩展文件系统 E2fs 上的特有属性 符号模式有 ASacdisu 几种格式 操作符 用来在文件已有属性的基础上增加选定的属性 用来去掉文件上的选定的属性 而 用来指定该文件的唯一属性 字符
  • hp n54l 网站服务器,HP N40L/HP N54L 刷DSM 4.1指南

    HP N40L 54L是HP自己的低端SERVER 用的是AMD TURION NEO II的CPU 从跑分来看 比SYNO家用或小企业系列里用的最新的D2700还好些 这个平时350米刀左右 但是有时候有DEAL的时候 250就可以拿下
  • java怎么编程安卓软件

    前言 今天逛论坛 看到了一位35岁的老程序员发的博文 看完内容后我又活了 35岁挑战华为社招 竟然凭实力在半个月内经历4轮面试后成功拿到了offer 不得不佩服这位大哥 35岁还这么强我们这些后辈还怕啥 当然重要的是这位程序员大佬最后总结的
  • 使用Python,dlib进行对象实时追踪

    这篇博客将介绍如何使用Python dlib执行对象跟踪 即通过dlib的相关跟踪器来实时跟踪视频流中的对象 与July的质心跟踪 Centroid Tracking 不同 dlib的对象跟踪算法可以利用从输入RGB图像收集的信息进行自我更
  • Java学习(超详细)三(循环结构+debug调试)

    目录 1 循环缘由与定义 1 1循环缘由 1 2循环定义 2 while循环结构 2 1 while循环语法 2 2 while循环实战 3 调试程序 3 1为什么需要程序调试 3 2什么是程序调试 3 3程序调试步骤 3 4程序 实战 调
  • Qt工程中如何添加.pri文件

    pri文件中的i 是包含 include 的首字母 类似于C C 中的头文件就是我们可以把 pro 文件内需要include的一部分或者多个工程相同的部分单独放到一个 pri 文件内 然后包含到工程的pro文件中 这种pri文件十分适合多子
  • Ubuntu 18.04 安装 PyCharm

    1 下载PyCharm安装包 1 进入PyCharm官网 选择Professional专业版 直接点击DOWNLOAD 如图1 2 进入跳转页面 出现提示框 点savefile 开始下载 3 下载完成后 安装包在Downloads文件夹下
  • Web安全公开课-XSS-前端基础

    这节课分两个部分讲 1 HTML概述 2 javascript概述 什么是HTML呢 HTML是种超文本标记语言 英文名字叫 HyperText Markup Language 超级文本标记语言是 种规范 也是一种标准 它通过标记符号来标
  • 2.微服务项目实战---环境搭建,实现电商中商品、订单、用户

    使用的电商项目中的商品 订单 用户为案例进行讲解 2 1 案例准备 2 1 1 技术选型 maven 3 3 9 数据库 MySQL 5 7 持久层 SpingData Jpa 其他 SpringCloud Alibaba 技术栈 2 1
  • H.264 和 MPEG-4 基础

    H 264 和 MPEG 4 的关系 H 264 AVC Advanced Video Coding 标准 是 MPEG 4 的第 10 部分 MPEG 4的初衷是将DVD质量的图像码流从每秒6兆降低到1 5兆 将高清电视的码流从每秒几十兆
  • 圆周率π的取值

    const double pi acos 1 0 头文件是
  • react 接口调用

    这是你定义好的页面 在你需要调用接口的页面先引入你写好的界面 页面 去你写好的页面里找movieseatmodel 后面的名字 seat就是你要找的名字 api seat是你写好的接口 seat response是你下
  • awk '{print $2}' 这个命令

    2 表示第二个字段 print 2 打印第二个字段 awk print 2 fileName 一行一行的读取指定的文件 以空格作为分隔符 打印第二个字段 比如有个文件是testAWK txt 文件内容如下 11 22 33 44 55 66

随机推荐

  • Java I/O流实现文件复制

    Java I O流实现文件复制 1 文件复制原理 2 文件遍历算法 1 算法分析 2 算法源码 3 文件复制算法 1 算法分析 2 算法源码 1 文件复制原理 文件的类型有很多 从层次上分 有目录 即文件夹 与普通文件 从内容上分 有文本
  • virtualenv 设置python3环境简明教程

    一开始直接用的是python3环境 而没有安装virtualenv进行不同的python环境版本控制 一 为什么用到virtualenv centos7默认的python版本是2 7的 想在其上做python3的开发会遇到问题 比如要使用p
  • ibm服务器usb虚拟网卡,山石虚拟防火墙安装步骤

    山石虚拟防火墙 可以安装在vmware workstation上 非常适合动手操作实践 做实验等 非常好用 前提也非常容易 电脑支持64位 内存最小4G 山石虚拟防火墙桥接在物理网卡上 虚拟机和虚拟防火墙内网口都桥接在虚拟网卡上 步骤大概如
  • Differences between Thumb and ARM instruction sets

    本文转载至 http infocenter arm com help index jsp topic com arm doc dui0068b ch02s02s09 html The general differences between
  • 动态规划-最大子数组

    题目 给定一个整数数组 找出和最大的子数组 返回其和 例如 1 2 3 5 1 2 最大子数组 3 5 1 2 和为9 分析 利用动态规划 记Sum i 表示以A i 结尾的子数组中的和最大子数组 Sum i 1 呢 考虑Sum i 的情况
  • c++智能指针

    我们在编写c 程序时经常会面临内存泄漏的问题 例如 void f int p new int throw unknow exception delete p 在这个简单的函数中 我们申请了一块内存 但是因为抛出异常跳出函数执行catch函数
  • linux dc命令,Linux中dc命令起什么作用呢?

    摘要 下文讲述Linux中dc的功能说明 如下所示 dc命令是Linux下一个任意精度的计算器 dc命令功能 用于计算操作 dc命令注意事项 1 dc命令支持无限精度运算 2 dc命令可定义及调用宏 3 dc命令可从界面读取数据 也可从指定
  • 验证手机号 身份证号 邮箱号

    public class ValidateUtil 验证手机号格式是否正确 param phone return public static boolean isMobilePhone String phone if StringUtils
  • 导入ecplise项目No projects are found to import解决方案

    最近在clone一个git项目的时候遇到一些文件 首先导入直接显示 No projects are found to import 显然这是ecplise无法正确识别项目类型导致的 这是由于ecplise识别一个工程需要 classpath
  • VS2019安装Qt插件(附安装失败解决方案)

    方法1 1 进入官网下载 qt vsaddin msvc2019 2 4 3 vsix 然后点击运行 2 点击install安装插件 3 等待安装完成Close 打开VS2019 4 在扩展下面就会出现Qt VS Tools 然后进入Qt
  • X电容(差模电容)和Y电容(共模电容)简介

    性质 X电容和Y电容多应用于开关电源当中 都属于安规电容 安规电容是指用于这样的场合 即电容器失效后 不会导致电击 不危及人身安全 X电容 外观容值 多是黄色 方形 uF级别的电容 作用 X电容主要用于抑制差模干扰 位置 接在火线零线之间
  • Java中的LinkedList集合详解

    LinkedList集合 基础概念 可以在任何位置高效插入和删除的一个有序序列 简而言之就是数据结构里的链表 我们都清楚在链表很容易进行插入和删除 但是我们在使用c c 的时候需要新建一个链表项的结构体并且需要在里面设置指针 java不需要
  • IO流(一)

    IO概述 什么是IO java中I O的操作主要是靠java io包下的类和接口来实现的 IO分类 根据数据的流向 输入流和输出流 输入流 把数据从其他设备上读取到内存当中的流 输出流 把数据从内存当中写入到其他设备上的流 根据数据的类型分
  • [C++] 哈希详解

    目录 1 哈希概念 2 实现机制 2 1 插入时 2 2 查找时 2 3 缺陷 2 4 常见哈希函数 2 4 1 直接定制法 2 4 2 除留余数法 2 4 3 平方取中法 2 4 4 折叠法 注意 3 解决哈希冲突 3 1 闭散列 3 1
  • zabbix的安装配置及基本使用

    一 zabbix的安装 1 最小化安装操作系统 安装以下常用依赖包 yum install vim iotop bc gcc gcc c glibc glibc devel pcre pcre devel openssl openssl d
  • qcustomplot绘制动态曲线_第十讲 频域分析法(Nyquist曲线)

    金鸡一唱天下白 第九讲 根轨迹法 zhuanlan zhihu com 自动化人 知乎 www zhihu com 概述 频域 频率响应 分析法是研究控制系统的一种工程方法 典控制理论最重要 最主要的分析方法 应用系统的频率特性可以间接地分
  • 获取在本地缓存

    我们有时候需要获取在本地缓存 在这个时候我们大部分朋友们做不到 今天我找到啦这个的好办法 现在分享给你们 第一步 如果我们已登录并保存缓存的话 我们可以直接看下面的代码 这个是在我们需要的js里面获取缓存的数据 第二步 如果你还没完成登录并
  • 《计算机网络》——第四章知识点

    五类题型1 已知主机IP地址和子网掩码 求网络号2 已知主机IP地址和子网掩码 求子网 主机最多有多少个 3 已知网络号 X位子网号 求子网掩码4 已知网络号 要分成X个子网 求子网掩码和IP地址范围 5 已知子网掩码 求哪些IP地址属于同
  • 操作系统考研复习——第五章(设备管理)

    操作系统考研复习 第五章 设备管理 5 输入 输出 I O管理 5 1 I O管理概述 5 1 1 I O设备 1 什么是I O设备 2 I O设备的分类 按使用特性 3 I O设备的分类 按传输速率分类 4 I O设备的分类 按信息交换的
  • 人机(AI)四人斗地主

    最近在使用Cocos Creator做一款四人斗地主的手机游戏 半成品 仅前端 代码附在最后 仅供参考 游戏中的单机 人机 模式以及游戏过程中的托管都需要出牌算法的设计 因此借这篇博客梳理一下现有的一些思路 首先 明确 AI出牌算法的目的是