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

如何基于列表顺序编写if语句并设置循环实现石头剪刀布游戏

石头剪刀布游戏逻辑实现方案

你提供的初始代码存在几个语法和逻辑问题:

  • 函数参数语法错误:Python定义函数时列表类型参数不需要后缀加[]
  • 对opponentchoices的判断逻辑错误:opponentchoices[1, 3, 3, 3,]不是合法的列表取值/判断写法,应该取列表对应切片和目标序列做比对
  • 缺少循环控制、出拳克制逻辑、返回值定义

修正后的完整可运行代码如下:

import random

# 统一定义出拳常量,方便后续维护
ROCK = 1
PAPER = 2
SCISSORS = 3
# 克制关系:key对应的出拳可以打赢value对应的出拳
BEAT_RULE = {
    ROCK: SCISSORS,
    PAPER: ROCK,
    SCISSORS: PAPER
}

def RockPaperScissorsFunction4(roundnumberforcurrentpairing, mychoices, opponentchoices):
    # 前2轮固定出石头,和你原代码逻辑保持一致
    if roundnumberforcurrentpairing < 3:
        mynextmove = ROCK
    else:
        # 取对手最近4轮出拳记录,匹配你原代码的判断维度
        recent_opponent_moves = opponentchoices[-4:]
        # 基于列表顺序的if判断逻辑
        if recent_opponent_moves == [ROCK, SCISSORS, SCISSORS, SCISSORS]:
            # 对手最近4轮为石头、剪刀、剪刀、剪刀,默认预判下一轮出剪刀,我方出石头克制
            mynextmove = ROCK
        elif recent_opponent_moves == [PAPER, SCISSORS, SCISSORS, SCISSORS]:
            # 对手最近4轮为布、剪刀、剪刀、剪刀,预判下一轮出剪刀,我方出石头
            mynextmove = ROCK
        elif recent_opponent_moves == [SCISSORS, SCISSORS, SCISSORS, SCISSORS]:
            # 对手连续4轮出剪刀,预判下一轮出剪刀,我方出石头
            mynextmove = ROCK
        else:
            # 未匹配到固定模式时,默认出拳克制对手上一轮的选择
            last_opponent_move = opponentchoices[-1]
            # 遍历克制规则匹配最优出拳
            for move, beaten_move in BEAT_RULE.items():
                if beaten_move == last_opponent_move:
                    mynextmove = move
                    break
    # 记录我方当前出拳,方便后续轮次调用
    mychoices.append(mynextmove)
    return mynextmove

# 游戏主循环,控制总轮次和胜负判断
def run_game(total_rounds):
    my_choices = []
    opponent_choices = []
    my_score = 0
    opponent_score = 0
    for round_num in range(1, total_rounds + 1):
        # 模拟对手随机出拳,可替换为其他对手逻辑
        opponent_move = random.randint(1, 3)
        opponent_choices.append(opponent_move)
        # 调用逻辑函数获取我方出拳
        my_move = RockPaperScissorsFunction4(round_num, my_choices, opponent_choices)
        # 单轮胜负判定
        if BEAT_RULE[my_move] == opponent_move:
            my_score += 1
            round_result = "我方胜"
        elif BEAT_RULE[opponent_move] == my_move:
            opponent_score += 1
            round_result = "对方胜"
        else:
            round_result = "平局"
        # 打印单轮结果
        print(f"第{round_num}轮:我方出{my_move},对方出{opponent_move},{round_result},当前比分 {my_score}:{opponent_score}")

# 运行5轮测试,可修改参数调整总轮次
if __name__ == "__main__":
    run_game(5)

核心逻辑说明

1. 基于列表顺序的if判断写法

要匹配对手的出拳序列,直接取列表的对应切片和目标列表做相等判断即可,比如opponentchoices[-4:] == [1,3,3,3]就是判断对手最近4轮的出拳是否为「石头、剪刀、剪刀、剪刀」的序列,完全匹配你原代码的设计意图。

2. 循环设置

  • 函数内部循环:用于遍历克制规则,自动匹配能打赢对手上一轮的出拳,不需要硬写所有if分支
  • 主游戏循环:控制总轮数,每轮依次调用出拳函数、生成对手出拳、判断胜负、统计比分,修改run_game的入参即可调整总轮数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:45:05