You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据值移除变量?Farkle游戏骰子暂存实现技术问询

搞定Farkle游戏里的得分骰子移除问题

嘿,我看你在做类似Farkle的游戏,遇到了投掷后不知道怎么暂时移除得分骰子的问题对吧?别担心,咱们一步步来解决这个事儿~

首先得说,你当前的代码每次都直接生成6个全新的骰子,完全没跟踪哪些骰子已经贡献了分数需要移除,所以核心是要换个方式来管理当前可用的骰子,而不是用单独的dice1到dice6变量。

核心思路调整

  • 用一个整数记录当前剩余的骰子数量,而不是单独的变量,这样每次投掷就生成对应数量的骰子就行。
  • 把得分计算和“哪些骰子要移除”的逻辑绑定在一起:计算得分的同时,算出这次投掷后还剩下多少没得分的骰子,下一次就投这么多。
  • 别忘了Farkle的规则:如果所有骰子都得分了(比如掷出六个1),玩家可以重新投6个骰子。

改进后的完整代码

from random import randint

def calculate_round_score(rolled_dice):
    """计算单次投掷的得分,同时返回剩下的未得分骰子数量"""
    total_score = 0
    # 用数组统计每个点数出现的次数,索引对应点数(比如counts[1]是1的数量)
    counts = [0] * 7  

    for die in rolled_dice:
        counts[die] += 1

    # 处理1的得分:单个1得100,三个1得1000,超过三个的每三个再加1000
    if counts[1] >= 3:
        total_score += 1000 * (counts[1] // 3)
        counts[1] %= 3  # 剩下的单个1单独算分
    total_score += counts[1] * 100

    # 处理5的得分:单个5得50,三个5得500,超过三个的每三个再加500
    if counts[5] >= 3:
        total_score += 500 * (counts[5] // 3)
        counts[5] %= 3
    total_score += counts[5] * 50

    # 处理2、3、4、6的三个及以上得分:三个得点数*100,每多三个再加一次
    for num in [2,3,4,6]:
        if counts[num] >= 3:
            total_score += num * 100 * (counts[num] // 3)
            counts[num] %= 3

    # 计算剩下的未得分骰子:统计还有哪些点数的数量大于0,加起来就是剩余数
    remaining = sum(1 for i in range(1,7) if counts[i] > 0)
    return total_score, remaining

def play_single_turn():
    turn_total = 0
    remaining_dice = 6  # 开始时6个骰子全可用

    while True:
        # 投掷当前剩余的骰子
        rolled = [randint(1,6) for _ in range(remaining_dice)]
        print(f"掷出的骰子: {rolled}")

        # 算分+获取剩余骰子数
        round_score, new_remaining = calculate_round_score(rolled)

        if round_score == 0:
            print("Farkle!这回合白玩了,得0分")
            return 0

        turn_total += round_score
        print(f"现在回合得分: {turn_total}")

        # 所有骰子都得分了?那可以重新投6个
        if new_remaining == 0:
            print("牛啊!所有骰子都得分了,再来一次6个骰子!")
            remaining_dice = 6
        else:
            remaining_dice = new_remaining

        # 问玩家要不要继续投
        choice = input("继续投掷吗?(y/n): ").strip().lower()
        if choice != 'y':
            return turn_total

# 简单的游戏流程示例(获胜分数设为10000,你可以自己改)
player_score = 0
print("欢迎玩Farkle!先到10000分获胜~")
while player_score < 10000:
    print(f"\n你的当前总得分: {player_score}")
    turn_points = play_single_turn()
    player_score += turn_points
    print(f"回合结束,总得分更新为: {player_score}")

print("\n恭喜!你赢了游戏🎉")

为啥这么改?

  • 不用单独的骰子变量:用remaining_dice数字跟踪剩下的骰子数,每次投掷生成对应数量的列表,比一个个变量好管理太多了。
  • 得分和移除逻辑绑定:calculate_round_score函数不仅给你这次投的分数,还告诉你剩下多少骰子没得分,直接用来下一次投掷就行。
  • 符合Farkle规则:处理了全得分重投的情况,也正确判断了Farkle(没得分的情况)。
  • 更易扩展:以后要加其他规则(比如顺子、三对得分),直接在calculate_round_score里加逻辑就行,不用动其他部分。

这样调整后,你就能实现“投完移除得分骰子,剩下的继续投”的核心功能啦~

内容的提问来源于stack exchange,提问作者Smallcat45

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:09:26