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

Fox, Chicken and Grain游戏变量切换实现及代码优化咨询

问题解决与代码优化方案

1. 实现变量状态切换(0/1互转)

当前代码仅处理单次输入,要支持多次输入并灵活切换状态,核心是集中管理角色位置:

  • 用字典存储所有角色的位置状态,替代单独变量:state = {"farmer": 1, "fox": 1, "chicken": 1, "grain": 1}(1代表左岸,0代表右岸,符合游戏初始设定)
  • 切换位置时直接用state[item] = 1 - state[item],无需判断当前状态,自动在0和1之间反转

同时要遵守游戏规则:农民必须和要移动的物品在同一岸,才能带它过河;单独移动农民时直接切换农民状态即可。

2. 用循环实现连续输入

用while True循环持续接收用户输入,直到游戏胜利或失败,解决单次输入的局限。

3. 代码优化与match case的使用

用match case替代if-elif

处理用户输入时,match case比嵌套if-elif更简洁易读,分支逻辑一目了然:

match choice:
    case "farmer":
        state["farmer"] = 1 - state["farmer"]
    case "fox":
        if state["farmer"] == state["fox"]:
            state["farmer"] = 1 - state["farmer"]
            state["fox"] = 1 - state["fox"]
        else:
            print("狐狸和农民不在同一岸,无法移动!")
    # 鸡、谷物的处理逻辑类似

其他优化点

  • 提取输出逻辑:统一打印所有角色位置,避免重复的条件判断
  • 完善胜负判定:增加胜利条件(所有角色到达对岸),优化失败判定逻辑
  • 模块化拆分:将状态打印、游戏检查、移动处理拆分为独立函数,提升代码可读性和可维护性

优化后的完整代码

import sys

def print_state(state):
    """打印当前所有角色的位置"""
    print("\n" + "-"*30)
    for name, pos in state.items():
        bank = "左岸" if pos == 1 else "右岸"
        print(f"{name.capitalize()} 在 {bank}")
    print("-"*30 + "\n")

def check_game_over(state):
    """检查游戏是否胜利或失败"""
    # 胜利条件:所有角色到达右岸(状态全为0)
    if all(pos == 0 for pos in state.values()):
        print("恭喜你!所有物品都成功运到对岸,游戏胜利!")
        sys.exit()
    
    farmer_pos = state["farmer"]
    other_pos = 1 - farmer_pos
    # 检查危险组合:农民不在时,狐狸+鸡、鸡+谷物不能在同一岸
    if state["fox"] == other_pos and state["chicken"] == other_pos:
        print("狐狸吃掉了鸡!游戏失败!")
        sys.exit()
    if state["chicken"] == other_pos and state["grain"] == other_pos:
        print("鸡吃掉了谷物!游戏失败!")
        sys.exit()

def process_move(state, choice):
    """处理用户的移动选择"""
    choice = choice.strip().lower()
    match choice:
        case "farmer":
            state["farmer"] = 1 - state["farmer"]
        case "fox":
            if state["farmer"] == state["fox"]:
                state["farmer"] = 1 - state["farmer"]
                state["fox"] = 1 - state["fox"]
            else:
                print("狐狸和农民不在同一岸,无法移动!")
        case "chicken":
            if state["farmer"] == state["chicken"]:
                state["farmer"] = 1 - state["farmer"]
                state["chicken"] = 1 - state["chicken"]
            else:
                print("鸡和农民不在同一岸,无法移动!")
        case "grain":
            if state["farmer"] == state["grain"]:
                state["farmer"] = 1 - state["farmer"]
                state["grain"] = 1 - state["grain"]
            else:
                print("谷物和农民不在同一岸,无法移动!")
        case _:
            print("无效输入!请选择 fox, chicken, grain 或 farmer")

def main():
    # 初始状态:所有角色在左岸(1=左岸,0=右岸)
    state = {"farmer": 1, "fox": 1, "chicken": 1, "grain": 1}
    print("狐狸、鸡和一袋谷物在河边等待。你需要用小船把它们都运到对岸,注意:")
    print("- 农民每次只能带一个物品过河")
    print("- 农民不在时,狐狸会吃鸡,鸡会吃谷物\n")
    
    while True:
        print_state(state)
        choice = input("你要带什么过河?(fox, chicken, grain 或 farmer):")
        process_move(state, choice)
        check_game_over(state)

if __name__ == "__main__":
    main()

关键说明

  1. 状态切换逻辑:1 - state[item]是实现0/1互转的极简方式,无需额外条件判断
  2. match case的优势:替代冗长的if-elif链,代码结构更清晰,分支处理更直观
  3. 循环机制:while True确保游戏持续进行,直到触发胜负条件
  4. 模块化设计:拆分独立函数后,代码更易调试、修改和扩展

内容的提问来源于stack exchange,提问作者W.Dem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:35:03