如何让Python版RPSLS游戏输出对应获胜逻辑的描述信息?
解决RPSLS游戏动作描述与胜负关联的问题
核心思路是用字典替代原来的两个独立列表,直接将「获胜动作组合」与「对应描述信息」建立映射,这样能快速查找并生成符合需求的输出,同时提升效率。
具体实现步骤
- 重构数据结构:将
winningPairs和actionPairs合并为一个字典,键是「胜者动作,败者动作」的元组,值是对应的动作描述:
win_descriptions = { ("scissors", "paper"): "Scissors cuts paper", ("scissors", "lizard"): "Scissors decapitates lizard", ("spock", "scissors"): "Spock smashes scissors", ("spock", "rock"): "Spock vaporizes rock", ("lizard", "spock"): "Lizard poisons Spock", ("lizard", "paper"): "Lizard eats paper", ("rock", "lizard"): "Rock crushes lizard", ("rock", "scissors"): "Rock crushes scissors", ("paper", "rock"): "Paper covers rock", ("paper", "spock"): "Paper disproves Spock" }
修改胜负判断逻辑,同时获取动作描述:
- 平局时保持原有逻辑
- 玩家1获胜:直接通过
(playerOneOption, playerTwoOption)从字典中取出描述,拼接获胜信息 - 玩家2获胜:需要用
(playerTwoOption, playerOneOption)作为键查找描述,再拼接获胜信息
调整输出部分,将动作描述和胜负结果合并输出
修改后的完整代码
# 重构为字典:键是(胜者动作, 败者动作),值是对应描述 win_descriptions = { ("scissors", "paper"): "Scissors cuts paper", ("scissors", "lizard"): "Scissors decapitates lizard", ("spock", "scissors"): "Spock smashes scissors", ("spock", "rock"): "Spock vaporizes rock", ("lizard", "spock"): "Lizard poisons Spock", ("lizard", "paper"): "Lizard eats paper", ("rock", "lizard"): "Rock crushes lizard", ("rock", "scissors"): "Rock crushes scissors", ("paper", "rock"): "Paper covers rock", ("paper", "spock"): "Paper disproves Spock" } # 询问玩家姓名 print() namePlayerOne = input("Player 1, enter your name: ") namePlayerTwo = input("Player 2, enter your name: ") print() # 初始化分数 playerOneScore = 0 playerTwoScore = 0 # 显示获胜规则选项 instructions = input("Would you like to see instructions for winning (y/n)?") if instructions == "y": for desc in win_descriptions.values(): print(f" - {desc}") print() while True: # 获取玩家选择(统一转为小写) playerOneOption = input(f"{namePlayerOne} select your option (Rock, Paper, Scissors, Lizard, Spock): ").lower() playerTwoOption = input(f"{namePlayerTwo} select your option (Rock, Paper, Scissors, Lizard, Spock): ").lower() results = "" if playerOneOption == playerTwoOption: results = "Draw" elif (playerOneOption, playerTwoOption) in win_descriptions: # 玩家1获胜,获取对应描述并拼接结果 action_desc = win_descriptions[(playerOneOption, playerTwoOption)] results = f"{action_desc}, {namePlayerOne} wins" playerOneScore += 1 else: # 玩家2获胜,反转动作组合查找描述 action_desc = win_descriptions[(playerTwoOption, playerOneOption)] results = f"{action_desc}, {namePlayerTwo} wins" playerTwoScore += 1 # 输出对局信息 print("-"*20) print(f"{namePlayerOne} chose {playerOneOption}\n{namePlayerTwo} chose {playerTwoOption}") print(results) print() print(f"{namePlayerOne} score: {playerOneScore}\n{namePlayerTwo} score: {playerTwoScore}") print("-"*20) # 询问是否继续游戏 playAgain = input("Play again? (y/n): ") if playAgain.lower() != "y": break
效果示例
当玩家1选Rock、玩家2选Spock时,输出会变成:
-------------------- name1 chose rock name2 chose spock Spock vaporizes rock, name2 wins name1 score: 0 name2 score: 1 --------------------
额外优化说明
- 字典的查找时间复杂度为O(1),比原来列表查找的O(n)效率更高,尤其当规则扩展时优势更明显
- 数据结构更直观,避免了两个列表索引对应可能出现的错位问题
内容的提问来源于stack exchange,提问作者wiro
相关产品推荐
相关产品推荐

