首页 > 编程语言 >python实现打扑克方法

python实现打扑克方法

时间:2023-12-29 11:13:30浏览次数:50  
标签:calculate val python 打扑克 print score cards 方法 card

# 游戏规则:
# 一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。
#
# 有以下几种牌:
# 豹子:三张一样的牌,如3张6.
# 同花顺:即3张同样花色的顺子, 如红桃 5、6、7
# 顺子:又称拖拉机,花色不同,但是顺子,如红桃5、方片6、黑桃7,组成的顺子
# 对子:2张牌一样
# 单张:单张最大的是A
# 这几种牌的大小顺序为, 豹子>同花顺>同花>顺子>对子>单张


# 需程序实现的点:
# 1. 先生成一付完整的扑克牌
# 2. 给5个玩家随机发牌
# 3. 统一开牌,比大小,输出赢家是谁
# 3.1 单牌之间如何比较大小 (权重)
# 3.2 其他牌型如何比较大小
# A:红桃J 红桃K 黑桃A 1.1 13 140 = 154.1
#
# B:方片2 方片2 梅花3 0.2 2 30 = 32.2*5 = 161

# 3.3 判断玩家手里是什么牌(不同的牌型有不同的判断方法)高内聚 低耦合
# val = [2, 2, 3] # SET
# if len(set(val)) == 2: # {2, 3}
# print("对子")
#
# if len(set(val)) == 1:
# print("豹子")

# 代码实现
import random


# 1. 生成牌
def alex():
poke_types = ['♥', '♠', '♦', '♣']
poke_nums = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
poke_list = []
for p_type in poke_types:
count = 2
for p_num in poke_nums:
card = [f"{p_type}{p_num}", count]
poke_list.append(card)
count += 1
# print(poke_list)
return poke_list


pokeList = alex()

# 2. 发牌
players = ['木木', '鬼鬼', '神经蛤蟆', 'error', '裕', '感叹号']


def blackGirl(pl, pk, pn):
player_dic = {}
for p_name in pl:
p_cards = random.sample(pk, pn)
for card in p_cards:
pk.remove(card)
player_dic[p_name] = p_cards
print(f"为玩家【{p_name}】生成了牌:{p_cards}")
return player_dic


playerDic = blackGirl(players, pokeList, 3)


# 3. 写好每种牌型的判断函数
# 冒泡排序
def sortList(dataList):
length = len(dataList)
for i in range(length):
for j in range(length - i - 1):
if dataList[j][1] > dataList[j + 1][1]:
dataList[j], dataList[j + 1] = dataList[j + 1], dataList[j]
return dataList


# 单张
def calculate_single(p_cards, score):
# 初始化
# score = 0

# 算分 0.1 1 10
# 先排序
p_cards = sortList(p_cards)
weight_val = [0.1, 1, 10]
count = 0
for card in p_cards:
score += card[1] * weight_val[count]
count += 1

print(f"计算单牌的结果是:{score}")
return score


# 对子
def calculate_pair(p_cards, score):
p_cards = sortList(p_cards)
# 列表推导式
card_val = [i[1] for i in p_cards]

if len(set(card_val)) == 2:
if card_val[0] == card_val[1]: # aab
score = (card_val[0] + card_val[1]) * 50 + card_val[2]
else: # abb
score = (card_val[1] + card_val[2]) * 50 + card_val[0]

print(f"计算对子的结果是:{score}")
return score


# 顺子
def calculate_straight(p_cards, score):
p_cards = sortList(p_cards)

card_val = [i[1] for i in p_cards]
a, b, c = card_val
if b - a == 1 and c - b == 1:
score *= 100
print(f"计算顺子的结果是:{score}")
return score


# 同花
def calculate_same_color(p_cards, score):
color_val = [i[0][0] for i in p_cards]
if len(set(color_val)) == 1:
score *= 1000
print(f"计算同花的结果是:{score}")
return score


# 同花顺
def calculate_same_color_straight(p_cards, score):
# 同花
color_val = [i[0][0] for i in p_cards]
if len(set(color_val)) == 1:
# 顺子
p_cards = sortList(p_cards)

card_val = [i[1] for i in p_cards]
a, b, c = card_val
if b - a == 1 and c - b == 1:
score *= 0.1
print(f"计算同花顺的结果是:{score}")
return score


# 豹子
def calculate_leopard(p_cards, score):
card_val = {i[1] for i in p_cards}

if len(card_val) == 1:
score *= 100000
print(f"计算豹子的结果是:{score}")
return score


# 4. 比对
calc_func_orders = [
calculate_single,
calculate_pair,
calculate_straight,
calculate_same_color,
calculate_same_color_straight,
calculate_leopard
]
player_score = []
for p_name, p_cards in playerDic.items():
print(f"开始计算玩家【{p_name}】的牌:{p_cards}")
score = 0
for calc_func in calc_func_orders:
score = calc_func(p_cards, score)
player_score.append([p_name, score])


winner = sortList(player_score)[-1]

print(f"恭喜最后获胜的玩家是【{winner[0]}】,得分是:{winner[1]}")

 

标签:calculate,val,python,打扑克,print,score,cards,方法,card
From: https://www.cnblogs.com/yangmeichong/p/17934325.html

相关文章

  • js里URL编码的不同方法和区别
    总结:1.escape/unescape这两个方法不能用于URL编码,但有很多人用,特此指出,因为它的真正作用是返回一个字符的Unicode编码值,不会对"+"进行编码,但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。2.encodeURI/decodeURI......
  • Miniconda 3 | 出发,探索Python
    介绍Miniconda是Anaconda的精简版本,是一个轻量级的Python包管理工具和环境管理工具。优势和功能主要包括:轻量级和快速安装:Miniconda相比Anaconda更小巧,只包含最基本的工具和包管理功能。安装速度更快,更适合对资源要求较高的环境。包管理:提供conda包管理工具,可......
  • 软件测评的等价类设计方法
    一、黑盒测试:又称数据驱动测试,完全不考虑程序内部结构和内部特性,注重于测试软件的功能需求。二、黑盒测试能发现5类错误:1、功能不对或功能遗漏2、界面错误3、数据结构或数据库访问错误4、性能问题5、初始化和终止错误三、黑盒测试的优点:1、有针对性地找问题,并且定位问题更加准确2、......
  • python 删除链表的倒数第 N 个结点 多种解法
    解法一:双指针法这种解法使用两个指针,一个快指针和一个慢指针,它们之间的距离为N。首先,让快指针先移动N步。然后,同时移动快指针和慢指针,直到快指针到达链表末尾。此时,慢指针指向的节点就是要删除的节点的前一个节点。最后,将慢指针的下一个节点指向下下个节点,完成删除操作。defre......
  • python turtle画图练习一
    1. 使用turtle库的函数绘制10层旋状放大的类正方形,提示:类正方形边长从0度方向,边长为1像素开始,每条边长度比前一条边增加2个像素,画笔逆时针旋转91度。效果如下图所示: 2. 使用turtle库的turtle.righ()函数和turtle.circle()函数绘制一个星星图形,圆弧的半径为90......
  • 软件双开教程:一机双用的实现方法
    软件双开教程:一机双用的实现方法在日常生活中,我们经常会遇到需要同时使用两个相同软件的情况,比如同时登录两个微信账号、同时打开两个游戏账号等。然而,许多应用程序并不支持同时登录多个账号,这就需要我们寻找一种解决方案来实现“一机双用”。本文将介绍一些常见的实现方法,让您轻......
  • 两个 mybatis insert方法返回自增主键值的方法
    1、使用useGeneratedKeys<insertid="saveReturnId"useGeneratedKeys="true"keyProperty="id"2、使用selectkey,<insertid="saveReturnId"parameterType=""><selectKeyresultType="java.lang.......
  • 成功复制CSDN博客中的代码的几种方法
    背景由于公司有规定,不能直接登陆CSDN,由于工作中时不时会参考一下CSDN的代码(主要是想一键复制),而鼠标放到代码上面则会提示登陆后复制,这就很伤心难过了。CSDN代码要登录才能复制,让这个平台的使用体验极其不太好(仅此吐槽一下而已),小编为大家整理了以下几种方法可以解决。目录1、......
  • python基础(二)-异常处理
    异常是指程序运行时引发的错误,引发错误的原因有很多,如语法错误、逻辑错误等,若这些错误没有进行处理,将会导致程序终止运行python标准异常异常名称描述BaseException所有异常的基类SystemExit解释器请求退出KeyboardInterrupt用户中断执行(通常是输入^C)Exception......
  • python 读书报告
    蒋彬:以下是使用NumPy、SciPy、Pandas和Matplotlib库进行图像处理的一些示例代码。这些库通常与专用的图像处理库(如OpenCV或Pillow)一起使用,以实现更广泛的图像操作和处理。使用Matplotlib显示图像pythonCopycodeimportmatplotlib.pyplotaspltimportmatplotlib.image......