如何基于列表顺序编写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
相关产品推荐
相关产品推荐

