Skip to content

Latest commit

 

History

History
453 lines (373 loc) · 12.3 KB

File metadata and controls

453 lines (373 loc) · 12.3 KB
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` 
---

逻辑或 or

回忆

  • 这次了解的是优先级
  • 每个运算符都有自己的优先级位置
  • 逻辑运算符的优先级从高到低
    • 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")
  • 两对看起来情况很复杂啊
  • 先去游乐场找找思路

游乐场

图片描述

  • 这个思路看起来可行

获得 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)
  • 结果

图片描述

准备两对 和 一对

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

举例

  • 试举例,如双方均为葫芦
    • 一人为三个五带对二
    • 另一人为三个四带对六
    • 前者胜
  • 又若双方均为两对,同有对二、对六
    • 但一方散牌为五
    • 另一方为一
    • 则后者胜
  • 这真的有点复杂
    • 有兴趣的同学
    • 试试 完成

交给ai

图片描述

分析代码

  • 把 下面三个重复过程 封装成 函数
    • 生成 随机骰子
    • 得到骰子等级
    • 输出骰子
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 即可。