Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0163
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在:
- 个人网站: `https://oeasy.org`
- 蓝桥云课: `https://www.lanqiao.cn/courses/3584`
- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
- Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 这次了解的是优先级
- 每个运算符都有自己的优先级位置
- 逻辑运算符的优先级从高到低
- not
- and
- or
- 有什么比较复杂的逻辑运算么???🤔
- 每人五个骰子,摇出后,依其点数牌形可分为:
- 散牌(五个骰子点数各不一样)
- 一对(五个骰子中仅有两个骰子点数一样,其余皆不一样)
- 两对(两个对子加一个其他点数,如一对二加一对四加一个三)
- 三条(三个骰子的点数一致,余下两个骰子点数各不相同,如三个四加一个二和一个六)
- 葫芦(也就是扑克牌中的三条带一对:三个骰子点数同为某数,余下两个骰子点数同为另一数,如三个三加一对二)
- 炸弹(其中四个骰子的点数一致,如四个一加一个五)
- 顺子(五个骰子点数呈连续分布,如 12345 和 23456)
- 豹子(五个骰子点数全一样)
- 第一步就是
- 通过五个随机的色子
- 得到相应的级别
- 动手吧!
from random import randint
dices = []
for num in range(5):
dices.append(randint(1,6))
print(dices)
- 结果
- 投了骰子之后
- 需要整理
from random import randint
dices = []
for num in range(5):
dices.append(randint(1,6))
dices.sort()
print(dices)
- 结果
- 散牌(五个骰子点数各不一样)
- 一对(五个骰子中仅有两个骰子点数一样,其余皆不一样)
- 两对(两个对子加一个其他点数,如一对二加一对四加一个三)
- 三条(三个骰子的点数一致,余下两个骰子点数各不相同,如三个四加一个二和一个六)
- 葫芦(也就是扑克牌中的三条带一对:三个骰子点数同为某数,余下两个骰子点数同为另一数,如三个三加一对二)
- 炸弹(其中四个骰子的点数一致,如四个一加一个五)
- 顺子(五个骰子点数呈连续分布,如 12345 和 23456)
- 豹子(五个骰子点数全一样)
if (dices[0]==dices[4]):
level = 8
print("baozi")
elif (dices[4]==dices[3]+1==dices[2]+2==dices[1]+3==dices[0]+4):
level = 7
print("shunzi")
elif (dices[0]==dices[3] or dices[1]==dices[4]):
level = 6
print("zhadan")
elif ((dices[0]==dices[2]) and (dices[3]==dices[4])) or\
((dices[0]==dices[1]) and (dices[2]==dices[4])):
level = 5
print("hulu")
elif (dices[0]==dices[2] or dices[1]==dices[3] or dices[2]==dices[4]):
level = 4
print("santiao")- 两对看起来情况很复杂啊
- 先去游乐场找找思路
- 这个思路看起来可行
from random import randint
dices = []
for num in range(5):
dices.append(randint(1,6))
dices.sort()
c = []
for num in range(1,7):
c.append(dices.count(num))
print(dices)
print(c)
- 结果
elif (c.count(2)==2):
level = 3
print("liangdui")
elif (c.count(2)==1):
level = 2
print("yidui")
else:
level = 1
print("sanpai")
- 当获得了 counts 之后
- 其实原来的代码也可以简化
from random import randint
dices = []
for num in range(5):
dices.append(randint(1,6))
dices.sort()
c = []
for num in range(1,7):
c.append(dices.count(num))
print(dices)
print(c)
if (dices[0]==dices[4]):
level = 8
print("baozi")
elif (dices[4]==dices[3]+1==dices[2]+2==dices[1]+3==dices[0]+4):
level = 7
print("shunzi")
elif (c.count(4)==1):
level = 6
print("zhadan")
elif (c.count(3)==1 and c.count(2)==1) :
level = 5
print("hulu")
elif (c.count(3)==1):
level = 4
print("santiao")
elif (c.count(2)==2):
level = 3
print("liangdui")
elif (c.count(2)==1):
level = 2
print("yidui")
else:
level = 1
print("sanpai")
- 这样就有了等级的基本规则
- 同级的也可以比大小
for dice in dices:
s = chr( 9855 + dice )
print(s,end=" ")
print()
- 可以控制颜色吗?
- 1、4可以是红的
for dice in dices:
s = chr( 9855 + dice )
if dice == 1 or dice == 4:
s = "\33[31m" + s + "\33[0m"
print(s,end=" ")
print()
from random import randint
dices = []
for num in range(5):
dices.append(randint(1,6))
dices.sort()
c = []
for num in range(1,7):
c.append(dices.count(num))
print(dices)
for dice in dices:
s = chr( 9855 + dice )
if dice == 1 or dice == 4:
s = "\33[31m" + s + "\33[0m"
print(s,end=" ")
print()
print(c)
if (dices[0]==dices[4]):
level = 8
print("baozi")
elif (dices[4]==dices[3]+1==dices[2]+2==dices[1]+3==dices[0]+4):
level = 7
print("shunzi")
elif (c.count(4)==1):
level = 6
print("zhadan")
elif (c.count(3)==1 and c.count(2)==1) :
level = 5
print("hulu")
elif (c.count(3)==1):
level = 4
print("santiao")
elif (c.count(2)==2):
level = 3
print("liangdui")
elif (c.count(2)==1):
level = 2
print("yidui")
else:
level = 1
print("sanpai")
- 胜负规则为豹子>顺子>炸弹>葫芦>三条>两对>对子>散牌
- 若属于同一类型,则依次比较类型构成主次要成分的骰子点数大小
- 如炸弹先比较四个相同骰子的点数,再比较散牌
- 葫芦先比较三个相同骰子再比较对牌
- 两对先比较较大的对,再比较稍小的对,最后比较散牌
- 如此类推
- 比较点数时 1 > 6 > 5 > 4 > 3 > 2
- 试举例,如双方均为葫芦
- 一人为三个五带对二
- 另一人为三个四带对六
- 前者胜
- 又若双方均为两对,同有对二、对六
- 但一方散牌为五
- 另一方为一
- 则后者胜
- 这真的有点复杂
- 有兴趣的同学
- 试试 完成
- 把 下面三个重复过程 封装成 函数
- 生成 随机骰子
- 得到骰子等级
- 输出骰子
from random import randint
# 等级名称映射(新增)
LEVEL_NAMES = {
8: "豹子(五同)",
7: "顺子(连续五张)",
6: "炸弹(四同带一单)",
5: "葫芦(三同带二同)",
4: "三条(三同带两单)",
3: "两对(两二同带一单)",
2: "一对(一二同带三单)", # 原代码中等级2未正确标记,此处修正
1: "散牌(无对子)"
}
def generate_dices():
"""生成5个随机骰子(已排序)"""
dices = [randint(1, 6) for _ in range(5)]
dices.sort()
return dices
def get_level(dices):
"""计算骰子组合的等级(返回等级值、关键比较值、关键值描述)"""
c = [dices.count(num) for num in range(1, 7)] # 统计1-6的出现次数
key_desc = "" # 关键值描述(新增)
# 豹子(五同)
if dices[0] == dices[4]:
return (8, dices[0], f"五同点数:{dices[0]}")
# 顺子(连续5个)
if dices == [dices[0]+i for i in range(5)]:
return (7, dices[-1], f"最大点数:{dices[-1]}")
# 炸弹(四个同)
if c.count(4) == 1:
main_num = [i+1 for i, cnt in enumerate(c) if cnt == 4][0]
single_num = max([i+1 for i, cnt in enumerate(c) if cnt == 1])
key_desc = f"四同点数:{main_num},单张点数:{single_num}"
return (6, (main_num, single_num), key_desc)
# 葫芦(三带二)
if c.count(3) == 1 and c.count(2) == 1:
three_num = [i+1 for i, cnt in enumerate(c) if cnt == 3][0]
two_num = [i+1 for i, cnt in enumerate(c) if cnt == 2][0]
key_desc = f"三同点数:{three_num},二同点数:{two_num}"
return (5, (three_num, two_num), key_desc)
# 三条(三个同)
if c.count(3) == 1:
three_num = [i+1 for i, cnt in enumerate(c) if cnt == 3][0]
singles = sorted([i+1 for i, cnt in enumerate(c) if cnt == 1], reverse=True)
key_desc = f"三同点数:{three_num},剩余单张:{singles}"
return (4, (three_num, *singles), key_desc)
# 两对(两个二同)
if c.count(2) == 2:
pairs = sorted([i+1 for i, cnt in enumerate(c) if cnt == 2], reverse=True)
single = [i+1 for i, cnt in enumerate(c) if cnt == 1][0]
key_desc = f"对子:{pairs[0]}和{pairs[1]},剩余单张:{single}"
return (3, (*pairs, single), key_desc)
# 一对(一个二同)(原等级值错误修正为2)
if c.count(2) == 1:
pair_num = [i+1 for i, cnt in enumerate(c) if cnt == 2][0]
singles = sorted([i+1 for i, cnt in enumerate(c) if cnt == 1], reverse=True)
key_desc = f"对子点数:{pair_num},剩余单张:{singles}"
return (2, (pair_num, *singles), key_desc) # 等级值修正为2
# 散牌(无对子)
sorted_dices = tuple(sorted(dices, reverse=True))
key_desc = f"降序点数:{list(sorted_dices)}"
return (1, sorted_dices, key_desc)
def print_dices(dices, player):
"""美观打印骰子(带颜色)"""
print(f"{player}的骰子:", end="")
for dice in dices:
s = chr(9855 + dice) # 骰子符号(♠-♦)
if dice == 1 or dice == 4: # 1和4用红色显示
s = f"\33[31m{s}\33[0m"
print(s, end=" ")
print()
# 生成甲乙两组骰子
dices_a = generate_dices()
dices_b = generate_dices()
# 计算等级值、关键值、关键值描述(新增关键值描述)
level_a, key_a, key_desc_a = get_level(dices_a)
level_b, key_b, key_desc_b = get_level(dices_b)
# 打印结果
print_dices(dices_a, "甲")
print_dices(dices_b, "乙")
print(f"甲的等级:{LEVEL_NAMES[level_a]}({key_desc_a})") # 显示等级名称+关键值描述
print(f"乙的等级:{LEVEL_NAMES[level_b]}({key_desc_b})")
# 比较胜负(详细化比较逻辑)
if level_a > level_b:
print(f"甲获胜!({LEVEL_NAMES[level_a]} > {LEVEL_NAMES[level_b]})")
elif level_a < level_b:
print(f"乙获胜!({LEVEL_NAMES[level_b]} > {LEVEL_NAMES[level_a]})")
else:
# 等级相同,比较关键值
print(f"等级相同({LEVEL_NAMES[level_a]}),比较关键值:")
print(f"甲关键值:{key_a}")
print(f"乙关键值:{key_b}")
if key_a > key_b:
print("甲(相同等级)获胜!")
elif key_a < key_b:
print("乙(相同等级)获胜!")
else:
# 关键值也相同(仅可能出现在散牌)
if level_a == 1:
print("关键值完全相同,逐位比较散牌:")
for a, b in zip(sorted(dices_a, reverse=True), sorted(dices_b, reverse=True)):
print(f"甲:{a} vs 乙:{b} → {'甲大' if a > b else '乙大' if b > a else '相等'}")
print("最终结果:平局!")
else:
print("关键值完全相同,平局!")
- 等级不同 直出结果
- 等级相同 比较关键骰子大小
- 关键骰子大小也相同
- 比较散牌
- 这次做了一个比较复杂的骰子的例子
- 真的是很复杂
- 综合运用逻辑类的与或非
- 为什么要强调逻辑类的与或非
- 难道说除了逻辑类
- 还有其他类的与或非???🤔
- 下次再说 👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。











