如何根据值移除变量?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
相关产品推荐
相关产品推荐

