IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python负数过过过小游戏源代码,参考名侦探学院游戏规则 -> 正文阅读

[Python知识库]python负数过过过小游戏源代码,参考名侦探学院游戏规则

“负数过过过” 小游戏说明

游戏玩法

  1. 游戏开始时,桌面上有-3到-35共33张负数卡。每个玩家手里有9张Pass卡,Pass卡不可转交他人。
  2. 游戏开始后,玩家轮流随机从桌面上抽取负数卡。并选择是否接受该负数卡。如果选择不接受,则需放置一张 Pass 卡到桌面上。
  3. 当一位玩家选择放置 Pass 卡后,选择权自动移交到下一位玩家手中,由他来决定是否接受该负数卡,以此类推。如果玩家手中没有 Pass 卡,则他必须接受该负数卡。
  4. 当一位玩家选择接受负数卡后,可以收走当时桌面上所有的 Pass 卡,由下一玩家继续从桌面上抽取负数卡。
  5. 当桌面上所有负数卡都被拿走后,游戏结束,进行结算。

结算规则

  1. 玩家手中的 Pass 卡,每张按数值 1 计算。
  2. 玩家手中如果有两张或两张以上连续的牌,则只计算连续的牌中数值最小的。例如:-15,-16,-17 三张卡,只计算 -15。
  3. 将上述 Pass 卡和负数牌的数值累加,作为玩家的得分,得分最高的玩家获胜。请注意最高分的判断,因为得分一般为负数。
    [Python代码大全,海量代码任你下载]
    支持2-8个玩家,程序运行截图:
    在这里插入图片描述
    完整程序代码
"""
v1.0
小游戏“负数过过过”,参考名侦探学院游戏规则
教孩子学编程用版本,所以没有采用面向对象的写法,也没有拆分模块,并且选择字符界面库rich,简单友好。
"""
import random

from rich.columns import Columns
from rich.console import Console
from rich.markdown import Markdown
from rich.panel import Panel
from rich.prompt import Confirm, IntPrompt, Prompt

readme = """
# “负数过过过” 小游戏说明  
## 游戏玩法
1. 游戏开始时,桌面上有-3到-35共33张负数卡。每个玩家手里有9张Pass卡,Pass卡不可转交他人。
2. 游戏开始后,玩家轮流随机从桌面上抽取负数卡。并选择是否接受该负数卡。如果选择不接受,则需放置一张 Pass 卡到桌面上。
3. 当一位玩家选择放置 Pass 卡后,选择权自动移交到下一位玩家手中,由他来决定是否接受该负数卡,以此类推。如果玩家手中没有 Pass 卡,则他必须接受该负数卡。
4. 当一位玩家选择接受负数卡后,可以收走当时桌面上所有的 Pass 卡,由下一玩家继续从桌面上抽取负数卡。
5. 当桌面上所有负数卡都被拿走后,游戏结束,进行结算。
## 结算规则
1. 玩家手中的 Pass 卡,每张按数值 1 计算。
2. 玩家手中如果有两张或两张以上连续的牌,则只计算连续的牌中数值最小的。例如:-15,-16,-17 三张卡,只计算 -15。
3. 将上述 Pass 卡和负数牌的数值累加,作为玩家的得分,得分最高的玩家获胜。请注意最高分的判断,因为得分一般为负数。
"""


def display_readme():
    """显示游戏说明"""
    console.print(Panel(Markdown(readme), style="white on blue"))


def get_card_value(card):
    return card["value"]


def get_content(card):
    s = ""
    owner_no = card["owner"]
    if(owner_no >= 0):
        player = players[owner_no]
        s = f"\n[yellow]{player['name']}"
    return f"[b][red]{card['value']}[/b]" + s


def generate_panels():
    return Columns([Panel(get_content(card), border_style="red", expand=True) for card in cards])


def display_cards():
    """显示负数卡片列表"""
    console.print(generate_panels())


def get_player_content(player):
    values = []
    previous = 0
    result = player["pass"]
    for card in player["cards"]:
        value = card["value"]
        if value == previous-1:
            s = "[white]" + str(value) + "[/white]"
        else:
            s = str(value)
            result = result + value
        values.append(s)
        previous = value
    s = ",".join(values)
    return f"[b]{player['name']}  [green]{player['pass']}\n[red]{s}\n\n[yellow on red]得分:{result}"


def get_desktop_content():
    values = []
    for card in desktop_cards:
        values.append(str(card["value"]))
    s = ",".join(values)
    return f"[b]桌面  [green]{desktop_pass_count}\n[red]{s}"


def display_players():
    """显示玩家列表"""
    console.print(
        Columns([Panel(get_player_content(player), style="yellow") for player in players]))


def display_desktop():
    """显示桌面数据"""
    console.print(Panel(get_desktop_content(), style="white"))


def convert(n):
    """card 序号(cards下标)与 card value 转换函数"""
    return -n-3


def draw_card():
    """抽卡片"""
    global current_card
    l = len(desktop_cards)
    i = random.randint(0, l-1)
    current_card = desktop_cards[i]
    desktop_cards.remove(current_card)  # 从桌面移除该负数卡片
    """显示抽中的卡片"""
    console.print("玩家 [yellow]%s[/yellow] 正在抽卡片……" % current_player["name"], Panel.fit(
        str(current_card["value"]), title="抽出的卡片", style="yellow on red"))


def next_player():
    """切换下一个玩家"""
    global current_player_no, current_player
    i = current_player_no + 1
    current_player_no = i % player_count
    current_player = players[current_player_no]


def on_accepted():
    """接受后的处理"""
    global desktop_pass_count, current_card
    current_player["cards"].append(current_card)
    current_player["cards"].sort(key=get_card_value, reverse=True)
    current_card["owner"] = current_player_no
    current_player["pass"] = current_player["pass"] + desktop_pass_count
    desktop_pass_count = 0
    current_card = None
    console.print("玩家 [yellow]%s[/yellow] 接受这张卡片" % current_player["name"])


def on_passed():
    """pass 处理"""
    global desktop_pass_count
    current_player["pass"] = current_player["pass"] - 1
    desktop_pass_count = desktop_pass_count + 1
    console.print("玩家 [yellow]%s[/yellow] 使用[red][b]Pass[/b][/red]卡" %
                  current_player["name"])


console = Console()

"""
打印游戏说明
"""
display_readme()

"""
输入玩家数量
player_count: 玩家数量
"""
player_count = 0
while(player_count < 2 or player_count > 8):
    player_count = IntPrompt.ask("请输入玩家数量[violet][2~8]")

"""
输入玩家昵称
players: 玩家集合,每个玩家有三个属性: name,pass,cards
    name: 玩家昵称
    pass: 玩家拥有的 pass 卡片数量
    cards: 玩家拥有的负数卡片集合
"""
players = []
for i in range(player_count):
    name = Prompt.ask("请输入玩家 [yellow]%d[/yellow] 的昵称" % (i+1))
    players.append({"name": name, "pass": 9, "cards": []})

"""
cards: 负数卡片集合, 每张卡片有两个属性: value 和 owner
    value: 卡片值,取值范围是 -35 ~ -3
    owner: 卡片的拥有者序号,无拥有者时 owner=-1
    card 序号(cards下标)与 card value 的换算关系:n=-v-3, v=-n-3
"""
cards = []


"""
初始化 cards
"""
for i in range(33):
    cards.append({"value": convert(i), "owner": -1})

"""
desktop_cards: 桌面负数卡片集合
"""
desktop_cards = []
for card in cards:
    desktop_cards.append(card)

"""
desktop_pass_count: 桌面 pass 卡片数量
"""
desktop_pass_count = 0

"""
current_player_no: 当前玩家序号,该序号等于该玩家在 players 集合中的下标
current_player: 当前玩家
"""
current_player_no = 0
current_player = players[current_player_no]

"""
current_card: 当前抽到的负数卡片
"""
current_card = None


"""
开始游戏
"""
while(len(desktop_cards) > 0):

    console.clear()
    display_readme()
    display_cards()
    display_players()
    display_desktop()

    """抽卡片"""
    draw_card()
    accepted = False
    while(not accepted):
        """"判断当前玩家是否具备 pass 资格"""
        if current_player["pass"] > 0:
            """请当前玩家做出选择"""
            accepted = Confirm.ask(
                "玩家 [yellow]%s[/yellow] 是否接受这张卡片" % current_player["name"])
        else:
            accepted = True
            console.print("玩家 [yellow]%s[/yellow] 自动接受这张卡片" %
                          current_player["name"])
            console.input("[yellow][i]输入任意字符继续……")

        if accepted:
            on_accepted()
        else:
            on_passed()
            display_players()
            display_desktop()

        next_player()

console.clear()
display_readme()
display_cards()
display_players()

"""游戏结束"""

Python代码大全,海量代码任你下载

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:24:34  更:2022-09-21 00:26:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:13:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码