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

如何让Python版RPSLS游戏输出对应获胜逻辑的描述信息?

解决RPSLS游戏动作描述与胜负关联的问题

核心思路是用字典替代原来的两个独立列表,直接将「获胜动作组合」与「对应描述信息」建立映射,这样能快速查找并生成符合需求的输出,同时提升效率。

具体实现步骤

  1. 重构数据结构:将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. 修改胜负判断逻辑,同时获取动作描述:

    • 平局时保持原有逻辑
    • 玩家1获胜:直接通过(playerOneOption, playerTwoOption)从字典中取出描述,拼接获胜信息
    • 玩家2获胜:需要用(playerTwoOption, playerOneOption)作为键查找描述,再拼接获胜信息
  2. 调整输出部分,将动作描述和胜负结果合并输出

修改后的完整代码

# 重构为字典:键是(胜者动作, 败者动作),值是对应描述
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:15:38