前言:
  好久没写博客了, 今天来补上一篇, 是关于炸金花游戏模型的设计和牌力评估. 其核心思想和之前谈到过的德州模型很像, 本文也想为炸金花游戏这个系列开个头, 希望后面能写写AI相关的文章.

相关文章:
  德州扑克AI--Programming Poker AI(译). 
  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运气和所谓的心理对抗.
  系列文章:
  1. 炸金花游戏的模型设计和牌力评估 
  2. 炸金花游戏的胜率预估 
  3. 基于EV(期望收益)的简单AI模型
  4. 炸金花AI基准测试评估
  5. 动态收敛预期胜率的一种思路

游戏规则简介:
  炸金花是每个参与玩家, 手握三张底牌, 通过跟牌/加注/PK等操作, 最后决出最后胜利者的游戏. 它和德州不一样, 它没有公共牌这个变量, 在发牌就决定了牌力大小, 波动也小, 最后的结果取决于玩家的心理对抗和策略了.
  

  回归主题,***的牌力大小, 按如下规则来定义:
  豹子(炸弹) > 顺金(同花顺) > 金(同花) > 顺子 > 对子 > 高牌
  这边要特别说明下, 如果按照出现概率来评定牌力大小, 出现豹子(炸弹)的概率>顺金的概率, 即顺金理应比豹子大, 但炸金花约定, 豹子>顺金, 这算特例(需要尊重).

模型设计:
  和德州一样, 我们这边把三张手牌映射为一个可比较的整数. 其牌力大小和整数数值成正比.
  先定义牌型:

# 高high
HIGH_TYPE = 0# 对子
PAIR_TYPE = 1 << 12# 顺子
STRAIGHT_TYPE = 2 << 12# 同花(金)
FLUSH_TYPE = 3 << 12# 同花顺
STRAIGHT_FLUSH_TYPE = 4 << 12# 豹子
LEOPARD_TYPE = 5 << 12

  牌力值其由4个半字节(4 * 4 = 16位)组成, 其最高半字节为牌型, 后续三个半字节为该牌型下, 最大的手牌值填充.
  1. 牌型为豹子, 第二高半字节为豹子手牌数值, 三/四半字节缺省为0, 如(HA, DA, SA) => [5, 14, 0, 0].
  2. 牌型为顺金, 第二高半字节为顺子中最大的数值, 三/四半字节缺省为0, 如(HA, HK, HQ) => [4, 14, 0, 0].
  3. 牌型为金, 二到四半字节, 依次存放排序后的手牌值, 如(HA, HK, HT) => [3, 14, 13, 10].
  4. 牌型为顺, 第二高半字节为顺子中最大的手牌数值, 三/四半字节缺省为0, 如(HA ,HK, SQ) => [2, 14, 0, 0].
  5. 牌型为对子, 第二高半字节为对子手牌, 三半字节为剩下的单牌, 四半字节缺省为0, 如(H9, D9, ST) => [1, 9, 10, 0].
  6. 牌型为高牌, 二到四半字节, 依次存放排序后的手牌值, 如(H9, DA, ST) => [0, 14, 10, 9].

核心代码:
  定义常量:

# !/usr/bin/env python
# -*- coding:utf-8 -*-import sys
reload(sys)
sys.setdefaultencoding("utf-8")CARD_CONST = {"A": 14,"2": 2,"3": 3,"4": 4,"5": 5,"6": 6,"7": 7,"8": 8,"9": 9,"T": 10,"J": 11,"Q": 12,"K": 13
}class Card(object):"""牌的花色+牌值"""def __init__(self, val):self.suit = val[0]self.rank = val[1]self.value = CARD_CONST[val[1]]def __str__(self):return "%s%s" % (self.suit, self.rank)

  核心评估函数:

# 核心思路和德州一致, 把牌力映射为一个整数
# 牌力组成: 4个半字节(4位), 第一个半字节为牌型, 后三个半字节为牌型下最大的牌值
# 牌型, 0: 单张, 1: 对子, 2: 顺子, 3: 金, 4: 顺金, 5: 豹子# 高high
HIGH_TYPE = 0# 对子
PAIR_TYPE = 1 << 12# 顺子
STRAIGHT_TYPE = 2 << 12# 同花(金)
FLUSH_TYPE = 3 << 12# 同花顺
STRAIGHT_FLUSH_TYPE = 4 << 12# 豹子
LEOPARD_TYPE = 5 << 12class ThreeCardEvaluator(object):"""工具类"""@staticmethoddef evaluate(cards):if not isinstance(cards, list):return -1if len(cards) != 3:return -1vals = [card.value for card in cards]# 默认是从小到大排序vals.sort()# 豹子检测leopard_res, leopard_val = ThreeCardEvaluator.__leopard(cards, vals)if leopard_res:return LEOPARD_TYPE + (vals[0] << 8)# 同花检测flush_res, flush_list = ThreeCardEvaluator.__flush(cards, vals)# 顺子检测straight_res, straight_val = ThreeCardEvaluator.__straight(cards, vals)if flush_res and straight_res:return STRAIGHT_FLUSH_TYPE + (straight_val << 8)if flush_res:return FLUSH_TYPE + (flush_list[2] << 8) + (flush_list[1] << 4) + flush_list[2]if straight_res:return STRAIGHT_TYPE + (straight_val << 8)# 对子检测pair_res, pair_list = ThreeCardEvaluator.__pairs(cards, vals)if pair_res:return PAIR_TYPE + (pair_list[0] << 8) + (pair_list[1] << 4)# 剩下的高highreturn HIGH_TYPE + (vals[2] << 8) + (vals[1] << 4) + vals[2]@staticmethoddef __leopard(cards, vals):if cards[0].rank == cards[1].rank and cards[1].rank == cards[2].rank:return True, cards[0].valuereturn False, 0@staticmethoddef __flush(cards, vals):if cards[0].suit == cards[1].suit and cards[1].suit == cards[2].suit:return True, valsreturn False, []@staticmethoddef __straight(cards, vals):# 顺子按序递增if vals[0] + 1 == vals[1] and vals[1] + 1 == vals[2]:return True, vals[2]# 处理特殊的牌型, A23if vals[0] == 2 and vals[1] == 3 and vals[2] == 14:return True, 3return False, 0@staticmethoddef __pairs(cards, vals):if vals[0] == vals[1]:return True, [vals[0], vals[2]]if vals[1] == vals[2]:return True, [vals[1], vals[0]]return False, []

  

测试集:
  编写一些case

if __name__ == "__main__":card_cases = [[Card('HA'), Card('SA'), Card('DA')],      # 豹子[Card('HA'), Card('HK'), Card('HQ')],      # 顺金[Card('HA'), Card('HK'), Card('HT')],      # 金[Card('HA'), Card('HK'), Card('SQ')],      # 顺子[Card('H9'), Card('D9'), Card('ST')],      # 对子[Card('H9'), Card('DA'), Card('ST')]       # 高牌]for case in card_cases:card = ', '.join([str(_) for _ in case])hand_value = ThreeCardEvaluator.evaluate(case)print "[{}] = {}".format(card, hand_value)

  测试的输出结果:

[HA, SA, DA] = 24064
[HA, HK, HQ] = 19968
[HA, HK, HT] = 16094
[HA, HK, SQ] = 11776
[H9, D9, ST] = 6560
[H9, DA, ST] = 3758

  

总结:
  总的来说,***的核心模型和牌力映射比德州简单多了, 因为其没有组合优化的问题, 所以比较直接暴力. 后续的文章, 希望自己写写AI方面的想法, ^_^.
  对待博彩游戏, 希望大家娱乐心态行娱乐之事, 切勿赌博, ^_^.

转载于:https://www.cnblogs.com/mumuxinfei/p/10287600.html

炸金花游戏(1)--炸金花游戏的模型设计和牌力评估相关推荐

  1. 炸金花游戏(4)--炸金花AI基准测试评估

    前言: 本文将谈谈如何评估测试炸金花的AI, 其实这个也代表一类的问题, 德州扑克也是类似的解法. 本文将谈谈两种思路, 一种是基于基准AI对抗评估, 另一种是基于测试集(人工选定牌谱). 由于炸金花 ...

  2. 炸金花游戏(2)--炸金花游戏的胜率预估

    前言: 我也是突然心血来潮, 想写写炸金花这类游戏的AI实现. 本文算是这一系列的第二篇, 主要写炸金花的胜率预估, 主要基于蒙特卡罗的思想, 胜率是炸金花AI的核心决策数据, ^_^. 相关文章: ...

  3. dnf打团显示服务器即将关闭,DNF:游戏服务器炸锅?当天在打团的小伙伴,你们还好吗...

    原标题:DNF:游戏服务器炸锅?当天在打团的小伙伴,你们还好吗 在2.23号这一天许多的DNF玩家都发现游戏是彻底的登不上去,变成了名副其实的掉线城与勇士.可在这一天,不单单是地下城变成了掉线城,就连 ...

  4. 计算机特色的小游戏,宅家必备小游戏-steam小型游戏推荐

    宅家必备小游戏-steam小型游戏推荐 2020-01-28 16:34:29 18点赞 67收藏 2评论 创作立场声明:所有游戏都为自己或者女票购买且玩过的,部分游戏有十多小时的游戏时间. 这几天想 ...

  5. 游戏策划设计中关于游戏节奏的控制

      如同乐章一般,每一款游戏都有游戏自身的节奏,这种节奏有的是游戏类型本身所赋予的,而有的则是游戏设计所带来的.而玩家在游戏过程中则能够体会到这种潜在的节奏感,同时对于设计者来说,把握和控制游戏节奏, ...

  6. 基于cocos2d-x的快速的游戏开发--回合制游戏

    2019独角兽企业重金招聘Python工程师标准>>> #基于cocos2d-x的快速的游戏开发--回合制游戏 开发时间:3天 开发工具:cocos2d-x和cocostudio 开 ...

  7. 格斗类游戏和休闲类游戏不同

    前阵子我开发了Match3D, 一个可以把三维动画输出成为swf的工具, 而且实现了swf渲染的实时三维角色动画, 这可以说是我真正推出的第一个flash第三方软件, 其实这以前, 我曾经开发过几个其 ...

  8. 在通知栏上玩游戏,Steve iOS 游戏实现思路

    在通知栏上玩游戏,Steve iOS 游戏实现思路 最近有一款游戏特别的火爆,叫做Steve ,一种可以在通知中心直接玩的游戏.作者的脑洞也是非常的大,实在让人佩服.其实实现起来也简单,就是用到了iO ...

  9. cocos游戏源码怎么用_亲子游戏怎么玩?游戏方式用对了,才会事半功倍

    孩子的出生对于一个家庭来说都是至关重要的大事.如何将孩子抚育好也是父母最关注的问题.从早教到兴趣辅导班.我们变着法子让孩子可以发展的更全面更优秀,请最好的老师.上最好的学校.住着大房子.我们忙着给家人 ...

最新文章

  1. virtualbox+vagrant学习-2(command cli)-16-vagrant snapshot命令
  2. NTP时间同步服务器报错:no server suitable for synchronization found
  3. hibernate 管理 Session(单独使用session,非spring)
  4. generate random or regular test data in R
  5. 【Android】init.rc
  6. 莫比乌斯反演定理证明
  7. 学习面向对象和设计模式的好地方
  8. 2top 存储过程 查看_S7-1500 PLC的存储区
  9. redisTemplate.opsForHash()
  10. Android 常用操作
  11. 易宝支付 -- 微信小程序对接
  12. GJB 软件配置管理计划(模板)
  13. java读取scv文件
  14. 项目跟踪管理工具_7种时间跟踪工具可帮助您管理时间
  15. 缓存应用(一)Ehcache使用介绍
  16. 连享会新命令 lxh:随时查看 Stata 资源
  17. 高德地图API之定位API
  18. Altium Designer初学者入门——stm32最小系统的PCB图(接上一篇原理图绘制)
  19. Google Guava的5个鲜为人知的特性
  20. testflight无法联网怎么办_Testflight不可用怎么办?

热门文章

  1. 有限状态自动机java实现_有限状态机FSM的几种简单实现
  2. java输入菱形边长,输出菱形
  3. VS2017离线安装失败解决无法重新安装问题 catalog问题
  4. Studio3T 无限破解 (2019.3.0.0)
  5. 基于Linux系统sqlite3数据库的学生信息管理系统
  6. YTU 问题 : 排序
  7. failed to connect to ‘192.168.199.143:5555‘: Connection refused
  8. 1026-西方经济学(本)8153-商务交际英语(2)
  9. 移臂调度算法java_C语言 磁盘调度模拟
  10. ffmpeg h264文件转mp4