开发一个炸金花游戏费用多少,python传奇小游戏代码

大家好,我是才哥。

众所周知扑克牌可谓是居家旅行、桌面交友的必备道具,今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏,先来看一下基本的游戏规则。

炸(诈)金花又叫三张牌,是在全国广泛流传的一种民间多人纸牌游戏。游戏使用一副除去大小王的扑克牌,共 4 个花色 52 张牌,各个玩家从中抽取 3 张牌,比较大小。各种牌型的大小顺序如下(按照全排列组合中出现的概率越小,牌型分数奖励越大):1、同花顺:三张同样花色且点数连续的牌,如红心2、红心3、红心4;2、豹子:三张点数一样的牌,如 AAA、222;3、顺子:三张点数连续的牌,如红心2、黑桃3、方块4;4、金花:三张同样花色的牌,如红心2、红心5、红心8;5、对子:两张点数一样的牌,如红心2、黑桃2;6、单张:2~10 < J < Q < K < A。以下概率截自百度百科:

注:本文所述游戏规则与实际有所不同,主要基于对不同牌型的比较进行设计

一、游戏流程实现

用python开发一个炸金花小游戏,注意别玩上瘾了

1、准备扑克牌

开始游戏前,需要先生成一副满足要求的扑克牌,牌友们都知道,扑克牌有以下四种花色,每种花色有 A、2~10、J、Q、K 等 13 张牌。

suit = ["黑桃", "红心", "方块", "梅花"]num = [str(i) for i in range(2, 11)] + ["J", "Q", "K", "A"]

为了便于后续算分,先给每一个单张赋予相应的点数。

score_map = {} # 单张点数映射表for s in suit: count = 2 for n in num: score_map[f"{s}{n}"] = count count += 1

扑克牌点数预览如下:

score_map = {'黑桃2': 2, '黑桃3': 3, '黑桃4': 4, '黑桃5': 5, '黑桃6': 6, '黑桃7': 7, '黑桃8': 8, '黑桃9': 9, '黑桃10': 10, '黑桃J': 11, '黑桃Q': 12, '黑桃K': 13, '黑桃A': 14, '红心2': 2, … }

2、玩家入场

以 p1、p2 等名称对玩家进行区分,我们先邀请 5 个玩家入场。

players = [f"p{i}" for i in range(1, 6)]

3、发牌

将玩家和扑克牌列表作为参数,传入发牌器。发牌器在扑克牌中进行不放回抽取,为每个玩家随机抽取 3 张牌,并记下玩家名称及其对应牌组。

def get_pk_lst(pls, pks): result = [] for p in pls: pk = sample(pks, 3) for _pk in pk: pks.remove(_pk) result.append({"name": p, "poker": pk}) return resultpokers = list(score_map.keys()) # 去掉大小王的一幅扑克poker_grp = get_pk_lst(players, pokers) # 发牌

发牌预览如下:

result = [{'name': 'p1', 'poker': ['方块5', '梅花3', '方块A']}, {'name': 'p2', 'poker': ['黑桃4', '方块8', '黑桃J']}, {'name': 'p3', 'poker': ['红心10', '红心K', '方块7']}, {'name': 'p4', 'poker': ['方块4', '梅花6', '方块J']}, {'name': 'p5', 'poker': ['红心5', '梅花10', '黑桃A']}]

4、判断牌型及算分

在算分之前先按之前的映射字典,将 pk_lst 里的 3 张扑克牌转换成对应的点数。

n_lst = list(map(lambda x: score_map[x], pk_lst)) # 点数映射

接下来截取花色部分的文本,利用集合去重后判断是否为三张同花。

same_suit = len(set([pk[:2] for pk in pk_lst])) == 1 # 是否同花色

再对点数部分进行排序,与依靠点数的最值生成的顺序列表进行比较,判断是否为连续的点数。要注意的是,A23 与 QKA 一样被视作顺子。

cOntinuity= sorted(n_lst) == [i for i in range(min(n_lst), max(n_lst) + 1)] or set(n_lst) == {14, 2, 3} # 是否连续

别忘了考虑对子和豹子的检查方式。

check = len(set(n_lst)) # 重复情况

那么正式开始判断牌型和算分吧!首先是单张,非同花、非顺子、三张点数不一。得分以 3 个单张点数相加。

if not same_suit and not continuity and check == 3: return sum(n_lst), "单张"

其次是对子,非同花,有且仅有两张点数一致。得分中对于构成对子的部分给予 2 倍奖励。

if not same_suit and check == 2: w = [i for i in n_lst if n_lst.count(i) == 2][0] single = [i for i in n_lst if i != w][0] return w*2*2 + single, "对子"

金花,即同花而非顺子,给予 9 倍奖励。

if same_suit and not continuity: return sum(n_lst)*9, "金花"

顺子,即点数连续而非同花,给予 81 倍奖励。

if continuity and not same_suit: return sum(n_lst)*81, "顺子"

豹子,即三张点数一致,这不得刷个 666 嘛。

if check == 1: return sum(n_lst)*666, "豹子"

同花顺,同花色且点数连续,绝了,赌神一个技能 999 伤害。

if continuity and same_suit: return sum(n_lst)*999, "同花顺"

5、决出胜负

一组玩家、抽牌、算分、牌型记录如下:

pk_grp = [{'name': 'p1', 'poker': ['方块5', '梅花3', '方块A'], 'score': 22, 'type': '单张'}, {'name': 'p2', 'poker': ['黑桃4', '方块8', '黑桃J'], 'score': 23, 'type': '单张'}, {'name': 'p3', 'poker': ['红心10', '红心K', '方块7'], 'score': 30, 'type': '单张'}, {'name': 'p4', 'poker': ['方块4', '梅花6', '方块J'], 'score': 21, 'type': '单张'}, {'name': 'p5', 'poker': ['红心5', '梅花10', '黑桃A'], 'score': 29, 'type': '单张'}]

利用 max 函数找出来谁是最棒的,公布名字!

best = max(pk_grp, key=lambda x: x["score"])["name"]

赢家是—— p3

好啦,又可以开始下一场愉快的游戏了~

二、统计及源码

用python开发一个炸金花小游戏,注意别玩上瘾了

1、牌型统计

进行了 10 万场游戏并对各类牌型进行频率统计,可见与前述排列组合的计算所得概率基本一致。

Counter({'单张': 371856, '对子': 84773, '金花': 24833, '顺子': 16239, '豹子': 1179, '同花顺': 1120})单张频率:74.37%对子频率:16.95%金花频率:4.97%顺子频率:3.25%豹子频率:0.24%同花顺频率:0.22%

2、牌局案例

各类牌型的局面和结果如下:

开牌结果------{'name': 'p1', 'poker': ['方块5', '梅花3', '方块A'], 'score': 22, 'type': '单张'}{'name': 'p2', 'poker': ['黑桃4', '方块8', '黑桃J'], 'score': 23, 'type': '单张'}{'name': 'p3', 'poker': ['红心10', '红心K', '方块7'], 'score': 30, 'type': '单张'}{'name': 'p4', 'poker': ['方块4', '梅花6', '方块J'], 'score': 21, 'type': '单张'}{'name': 'p5', 'poker': ['红心5', '梅花10', '黑桃A'], 'score': 29, 'type': '单张'}赢家是------p3开牌结果------{'name': 'p1', 'poker': ['方块Q', '黑桃5', '黑桃K'], 'score': 30, 'type': '单张'}{'name': 'p2', 'poker': ['黑桃2', '方块2', '红心10'], 'score': 18, 'type': '对子'}{'name': 'p3', 'poker': ['梅花2', '黑桃4', '梅花J'], 'score': 17, 'type': '单张'}{'name': 'p4', 'poker': ['红心K', '梅花7', '红心6'], 'score': 26, 'type': '单张'}{'name': 'p5', 'poker': ['方块A', '方块6', '红心4'], 'score': 24, 'type': '单张'}赢家是------p1开牌结果------{'name': 'p1', 'poker': ['黑桃J', '黑桃5', '黑桃4'], 'score': 180, 'type': '金花'}{'name': 'p2', 'poker': ['梅花7', '红心4', '梅花5'], 'score': 16, 'type': '单张'}{'name': 'p3', 'poker': ['方块5', '黑桃9', '梅花10'], 'score': 24, 'type': '单张'}{'name': 'p4', 'poker': ['黑桃Q', '梅花9', '黑桃10'], 'score': 31, 'type': '单张'}{'name': 'p5', 'poker': ['红心9', '方块9', '红心A'], 'score': 50, 'type': '对子'}赢家是------p1开牌结果------{'name': 'p1', 'poker': ['方块8', '黑桃10', '方块9'], 'score': 2187, 'type': '顺子'}{'name': 'p2', 'poker': ['梅花9', '红心Q', '黑桃3'], 'score': 24, 'type': '单张'}{'name': 'p3', 'poker': ['方块A', '梅花K', '黑桃4'], 'score': 31, 'type': '单张'}{'name': 'p4', 'poker': ['方块J', '红心J', '红心6'], 'score': 50, 'type': '对子'}{'name': 'p5', 'poker': ['梅花5', '黑桃K', '方块3'], 'score': 21, 'type': '单张'}赢家是------p1开牌结果------{'name': 'p1', 'poker': ['黑桃Q', '黑桃8', '梅花6'], 'score': 26, 'type': '单张'}{'name': 'p2', 'poker': ['红心3', '梅花3', '黑桃3'], 'score': 5994, 'type': '豹子'}{'name': 'p3', 'poker': ['红心A', '红心6', '方块5'], 'score': 25, 'type': '单张'}{'name': 'p4', 'poker': ['黑桃4', '梅花A', '方块2'], 'score': 20, 'type': '单张'}{'name': 'p5', 'poker': ['梅花7', '黑桃6', '梅花8'], 'score': 1701, 'type': '顺子'}赢家是------p2开牌结果------{'name': 'p1', 'poker': ['黑桃5', '梅花9', '方块9'], 'score': 41, 'type': '对子'}{'name': 'p2', 'poker': ['黑桃Q', '黑桃2', '红心Q'], 'score': 50, 'type': '对子'}{'name': 'p3', 'poker': ['红心2', '黑桃7', '红心5'], 'score': 14, 'type': '单张'}{'name': 'p4', 'poker': ['梅花3', '方块10', '黑桃A'], 'score': 27, 'type': '单张'}{'name': 'p5', 'poker': ['黑桃9', '黑桃J', '黑桃10'], 'score': 29970, 'type': '同花顺'}赢家是------p5

3、完整代码

# @Seon# 炸金花from random import samplefrom collections import Counterdef get_pk_lst(pls, pks): # 发牌 result = [] for p in pls: pk = sample(pks, 3) for _pk in pk: pks.remove(_pk) result.append({"name": p, "poker": pk}) return resultdef calculate(_score_map, pk_lst): # 返回得分和牌型 n_lst = list(map(lambda x: _score_map[x], pk_lst)) # 点数映射 same_suit = len(set([pk[:2] for pk in pk_lst])) == 1 # 是否同花色 cOntinuity= sorted(n_lst) == [i for i in range(min(n_lst), max(n_lst) + 1)] or set(n_lst) == {14, 2, 3} # 是否连续 check = len(set(n_lst)) # 重复情况 if not same_suit and not continuity and check == 3: return sum(n_lst), "单张" if not same_suit and check == 2: w = [i for i in n_lst if n_lst.count(i) == 2][0] single = [i for i in n_lst if i != w][0] return w*2*2 + single, "对子" if same_suit and not continuity: return sum(n_lst)*9, "金花" if continuity and not same_suit: return sum(n_lst)*81, "顺子" if check == 1: return sum(n_lst)*666, "豹子" if continuity and same_suit: return sum(n_lst)*999, "同花顺"def compare(_score_map, pk_grp): # 比大小 for p in pk_grp: p["score"], p["type"] = calculate(_score_map, p["poker"]) print("开牌结果------") for p in pk_grp: print(p) print("赢家是------") best = max(pk_grp, key=lambda x: x["score"])["name"] print(best) return pk_grpdef show(_score_map, _players): # 开局 pokers = list(_score_map.keys()) poker_grp = get_pk_lst(_players, pokers) return compare(_score_map, poker_grp)def start_game(_score_map, _players, freq=1): # 游戏和统计 type_lst = [] for i in range(freq): grp = show(_score_map, _players) type_lst = type_lst + [t["type"] for t in grp] c = Counter(type_lst) print(c) total = sum(c.values()) for item in c.items(): print(f"{item[0]}频率:{item[1]/total:.2%}")if __name__ == '__main__': # 准备扑克牌 suit = ["黑桃", "红心", "方块", "梅花"] num = [str(i) for i in range(2, 11)] + ["J", "Q", "K", "A"] score_map = {} # 单张点数映射表 for s in suit: count = 2 for n in num: score_map[f"{s}{n}"] = count count += 1 # 5个玩家入场 players = [f"p{i}" for i in range(1, 6)] # 开始游戏 start_game(score_map, players, freq=100000)

这里是水中滑翔者、鱼类按摩师,Seon塞翁,下一篇再见!

(0)
上一篇 2023年3月9日 下午1:51
下一篇 2023年3月9日 下午1:52

相关推荐

  • 择一事终一生 偏毫厘不敢安——记工行崇明桥支行大堂经理蔡金生

    蔡金生是工行镇江句容崇明桥支行的大堂经理,他把做一名合格的大堂经理作为自己的目标,刻苦专研业务,对客户热情周到、细致入微,在大堂经理这个岗位作出了优秀的业绩,得到网点主任和同事的一…

    生活百科 2023年3月12日
    0
  • 焊剂的特性及检测项目要求

    在金属材料的检测项目之中,焊剂的检测是测试焊接性能,了解焊剂质量的一个重要的手段。下面我们主要从焊剂的特性以及检测的标准和性质来确定具体的检测内容。 首先助焊剂的成分分为:保护剂、…

    2023年4月30日
    0
  • 中国邮政储蓄银行的信用卡怎么样

    10月25日,中国邮政储蓄银行官网发布关于中国邮政储蓄银行白金信用卡权益规则调整的公告。 全文如下: 由于业务调整,我行将于2021年11月1日起更新白金信用卡部分权益使用规则,具…

    2023年6月20日
    0
  • 孙子兵法三十六计之欲擒故纵,关于三十六计之欲擒故纵的ppt

    成语欲擒故纵意思是想捉住他,故意先放开他。比喻为了进一步的控制,先故意放松一步。原文是“逼则反兵,走则减势。紧随勿迫,累其气力,消其斗志,散而后擒,兵不血刃。” 追击过紧,敌人就会…

    2023年3月12日
    0
  • 怎样将照片裁剪成自己想要的规格

    在日常生活工作中,我们有时候会需要将图片上传到各种平台上。因为有一些平台对于图片的尺寸大小有一定的限制要求,所以为了能成功上传图片,我们需要对图片的大小裁剪成合适的尺寸。那小伙伴们…

    2023年2月23日
    0
  • 你以为换个发型就变漂亮了

    世上没有丑女人,只有懒女人,只要愿意花些时间打扮一下自己,几乎所有女士都能变女神,从发型着手改变就是很不错的选择,看看这10几位女士,前后对比就像变张脸,想不美都难。 发型选对颜值…

    2023年1月2日
    0
  • 黄牛主打心理战(黄牛心理战)

    一到春运想黄牛,然而2019年春运抢票,黄牛也怂了。 2019年春运,第三方抢票软件的加速包是当头一棒,12306首次上线的“候补购票”功能则给了黄牛致命一击。 “但有些人就是更相…

    2023年4月26日
    0
  • 剥好的石榴在真空袋里能放多久

    石榴是一种营养丰富的水果,但是剥好的石榴放置时间过长会导致其失去营养价值和口感。那么问题来了,剥好的石榴在真空袋里能放多久呢? 首先,剥好的石榴应该放在密封的容器中,以减少与外界空…

    生活百科 2023年7月9日
    0
  • 手机上如何查自己的邮信地址,怎样正确填写邮箱地址

    本文目录 1. 手机上如何查自己的邮信地址 2. 怎样正确填写邮箱地址 3. 电子邮箱地址怎么查询 手机上如何查自己的邮信地址 1、首先下载qq邮箱并登陆; 2、在手机版的QQ邮箱…

    2023年12月30日
    0
  • 钢铁肥皂什么原理

    钢铁肥皂,是一种常用于清洁厨房油渍和手脏的清洁用品。许多人对其原理感到好奇,下面我们来探讨一下。 首先,钢铁肥皂并不是真正的肥皂,它是由钢丝和铁质组成的。当我们用它来清洁手或物品时…

    生活百科 2023年6月16日
    0

发表评论

登录后才能评论