Python控牌情况的模拟

代码如下

# 构造必输牌池
import numpy as np
import random
# 定义多维数列转换函数,后面输出参数使用
def flatten(a):
    if not isinstance(a, (list, )):
        return [a]
    else:
        b = []
        for item in a:
            b += flatten(item)
    return b
# 构造差牌牌池
pl_bad=range(1,6)
# 正常的差牌
pool_bad=(np.repeat(pl_bad,4)).tolist()
# 无炸的差牌
pool_bad_nb=(np.repeat(pl_bad,3)).tolist()
# 构造中间牌牌池
pl_mid=range(6,9)
pool_mid=(np.repeat(pl_mid,4)).tolist()
# 无炸的中牌
pool_mid_nb=(np.repeat(pl_mid,3)).tolist()
# 不含双王的好牌牌局
pl_gd=range(9,14)
pool_gd_nj=(np.repeat(pl_gd,4)).tolist()
# 不含双王且无炸的好牌牌局
pool_gd_nj_nb=(np.repeat(pl_gd,3)).tolist()
# 提示
# 差中好的发牌概率prob
prob=[0.8,0.1,0.1]
# 生成用于储存概率的数组
pick_num=np.repeat(0,len(prob))
# 发牌张数
for i in range(0,3):
    pick_num[i]=round(17*prob[i])

# 判断总牌数是否合理,调整差中好牌的牌数,若大于17张则减少好牌,反之增加差牌
if sum(pick_num)>17:
    pick_num[2]=pick_num[2]-(sum(pick_num)-17)
elif sum(pick_num)<17:
    pick_num[0]=pick_num[0]-(sum(pick_num)-17)
else:
    pass

# 分批抽取
result_ls=[]
for pool_kind,pick_n in zip((pool_bad_nb,pool_mid_nb,pool_gd_nj_nb),pick_num):
    result=np.random.choice(pool_kind,pick_n,replace=False).tolist()
    result_ls.append(result)
#败家从差中好牌中抽取的牌数
pl_bad_rm=result_ls[0]
pl_mid_rm=result_ls[1]
pl_gd_rm=result_ls[2]
# 转换为1维数组并排序
result_ls=flatten(result_ls)
result_ls.sort()

# 转换为列表
loser_1=result_ls
# 统计统计败家牌局中出现三张的牌值

temp=np.unique(result_ls,return_counts=True) #此时temp为tuple不能直接操作array,用temp临时转换一下
mat_ls=np.array(temp)

in_case=mat_ls[0,(np.where(mat_ls[1,]==3))] #incase代表败家手中三张牌的牌值,不能是最后三张,这三张将会发给一个normal的玩家

# 移除已经使用的牌以及in_case
# 构造牌池,不包括大小王
pool_1 = range(1, 14)
np.repeat(pool_1, 4)
# 转换为列表
pool = (np.repeat(pool_1, 4)).tolist()

#胜家从牌池中抽取15张
## 差牌移除败家
for bad in pl_bad_rm:
    pool_bad.remove(bad)
## 差牌中移除in_case
for bd in in_case[0,]:
    while bd in pool_bad:
        pool_bad.remove(bd)
## 中牌移除..
for mid in pl_mid_rm:
    pool_mid.remove(mid)
## 好牌移除..
for gd in pl_gd_rm:
    pool_gd_nj.remove(gd)
## 抽取个数
# 差中好的发牌概率prob_winer
prob_winer=[0.1,0.2,0.7]
# 生成用于储存概率的数组
pick_num=np.repeat(0,len(prob_winer))
# 发牌张数
for i in range(0,3):
    pick_num[i]=round(15*prob_winer[i])
# 判断各阶段牌数是否合理
# 判断总牌数是否合理,调整差中好牌的牌数,若大于15张则减少查牌,反之增加好牌
if sum(pick_num)>15:
    pick_num[0]=pick_num[0]-(sum(pick_num)-15)
elif sum(pick_num)<15:
    pick_num[2]=pick_num[2]-(sum(pick_num)-15)
else:
    pass
# 分批抽取
result_ls_winer=[]
for pool_kind,pick_n in zip((pool_bad,pool_mid,pool_gd_nj),pick_num):
    result=np.random.choice(pool_kind,pick_n,replace=False).tolist()
    result_ls_winer.append(result)
# 胜家手牌转换为一维数列
result_ls_winer=flatten(result_ls_winer)
result_ls_winer.sort()
#胜家添加双王
result_ls_winer.append(14)
result_ls_winer.append(15)
# 牌池移除胜家
for w_card in result_ls_winer[0:15]:
    pool.remove(w_card)
# 牌池移除败家
for l_card in loser_1:
    pool.remove(l_card)

# 牌池移除in_case
if len(in_case[0,])>0:
    for in_card in in_case[0,].tolist():
        pool.remove(in_card)
else:
    pass
# 牌池抽取17-len(in_case[0,])张牌
norm_er=np.random.choice(pool,(17-len(in_case[0,])),replace=False).tolist()
# 剩余牌数为normer
norm_ls=norm_er+in_case[0,].tolist()
norm_ls.sort()
# 胜家手牌result_ls_winer
# 败家手牌loser_1
# 另外一家norm_ls
# 以下内容为转换java牌值
def trans_card(loser_1,winer_1,norm_er):
    pool_dict={"0":12,"1":12,"2":12,"3":12,"4":13,"5":13,"6":13,"7":13,"8":1,"9":1,"10":1,"11":1,"12":2,"13":2,"14":2,"15":2
,"16":3,"17":3,"18":3,"19":3,"20":4,"21":4,"22":4,"23":4,"24":5,"25":5,"26":5,"27":5,"28":6,"29":6,"30":6,"31":6,"32":7,"33":7,"34":7,"35":7,"36":8,"37":8,"38":8,"39":8,"40":9,"41":9,"42":9,"43":9,"44":10,"45":10,"46":10,"47":10,"48":11,"49":11,"50":11,"51":11,"52":14,"53":15}
    key_list = []
    value_list = []
    for key, value in pool_dict.items():
        key_list.append(key)
        value_list.append(value)
    loser_card = []
    for number in loser_1:
        index_mid = value_list.index(number)
        add_card = key_list[index_mid]
        add_card = int(add_card)
        value_list.pop(index_mid)
        key_list.pop(index_mid)
        loser_card.append(add_card)
    winer_card = []
    for number1 in winer_1:
        index_mid = value_list.index(number1)
        add_card = key_list[index_mid]
        add_card = int(add_card)
        value_list.pop(index_mid)
        key_list.pop(index_mid)
        winer_card.append(add_card)
    norm_card = []
    for number2 in norm_er:
        index_mid = value_list.index(number2)
        add_card = key_list[index_mid]
        add_card = int(add_card)
        value_list.pop(index_mid)
        key_list.pop(index_mid)
        norm_card.append(add_card)
    for pt in (loser_card, winer_card, norm_card):
        print(pt)
#传递给java
trans_card(loser_1,result_ls_winer,norm_ls)

因为后端使用java,所以注释中写的是传递给java

其实质上是对牌型值一一对应起来

接收端是8对应牌值3

我书写的代码中1代表牌值3

原文地址:https://www.cnblogs.com/yuvejxke/p/12569168.html

时间: 2024-11-01 10:52:37

Python控牌情况的模拟的相关文章

【Python运维脚本】Python监控CPU情况

#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected]126.com #Python监控CPU情况 """ 1.实现原理:通过SNMP协议获取系统信息,再进行相应的计算和格式化,最后输出结果 2.特别注意:被监控的机器上需要支持snmp.yum install -y net-snmp*安装 """ #!/usr/bin/pyth

洗牌问题(模拟)

题目大意: 已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去. 现在输入s1和s2的初始状态 以及 预想的最终状态s12 问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1". 解题思路: 很浅白的模拟题= = 不懂为什么别人要把它归类到广搜...所以我又重新分类了... 直接模拟就可以了,关键在于状态记录,然后判重 若s1和s2在洗牌后

hdoj 1210 Eddy&#39;s 洗牌问题 【模拟】

题意:中文题,不翻译.. 策略:观察可知,第i张牌 如果小于等于n 那么他的序号就会变为i*2, 如果大于n 那么就会变成(i-n)*2-1  故 只需要模拟下就好了 AC by SWS 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1210 代码: #include<stdio.h> int main() { int n, cur, pre; while(scanf("%d", &n) == 1){ int ans

codeforces 439C Devu and Partitioning of the Array(烦死人的多情况的模拟)

题目 //这是一道有n多情况的烦死人的让我错了n遍的模拟题 #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; int a[100010],n,k,p; int vis[100010]; int ji=0,ou=0; int main() { memset(vis,0,sizeof(vis)); cin >>

python 操作mysql数据库之模拟购物系统登录及购物

python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TABLE userinfo ( u_id int(10) not null auto_increment, u_name varchar(35), u_passwd varchar(35), money decimal(10,2), role int(5), primary key(u_id) )CHA

Python多版本情况下四种快速进入交互式命令行的操作技巧

因为工作需求或者学习需要等原因,部分小伙伴的电脑中同时安装了Python2和Python3,相信在Python多版本的切换中常常会遇到Python傻傻分不清楚的情况,今天小编整理了四个操作技巧,以帮助大家解决这个"心头之痛". 1.直接在命令行窗口中输入命令"python",便可以进入命令行了,如下图所示. 不过此时默认弹出的是Python2版本,这是因为小编的电脑中Python的环境变量将Python2放在了Python3的前面,所以默认是弹出Python2版本.

splinter python浏览器自动化操作,模拟浏览器的行为

Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没有更新了.还 有就是利用selenium,可支持多种浏览器.网上资料比较多.经过比较,我选择了Splinter模块,因为利用Splinter开发浏览器自动化操 作,编写代码比较简单. 一.Splinter的安装 Splinter的使用必修依

Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)

经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 1. python模拟登录淘宝网页 2. 获取登录用户的所有订单详情 3. 学会应对出现验证码的情况 4. 体会一下复杂的模拟登录机制 探索部分成果 1. 淘宝的密码用了AES加密算法,最终将密码转化为256位,在POST时,传输的是256位长度的密码. 2. 淘宝在登录时必须要输入验证码,在经过几次尝试失败后最终获取了验证码图片让用户手动输入来验证.

python爬虫(下)--模拟登录与Captcha识别

前言 之前在 python爬虫(上)–请求--关于模拟浏览器方法,中我挖了一个坑,时隔一个多月,趁着最近有点空,我想是时候填填坑了,总结总结了,不然真的就忘了 验证码 虽然之前挖坑的那篇已经说了一些,现在还是稍微说一说. 在模拟登录中,其实让写爬虫的人疼头就是验证码,只要能破掉验证码,那么登录不是问题. 验证码(Chaptcha)内容从英文字符和数字识别,到数字加减乘除,再到汉字的出现,后面还有12306的看图识别,到现在的新型的基于人的行为的谷歌的reCaptcha,验证码也是经历了很长时间的