如何判断代码哪些部分应封装为函数?以猜数字游戏代码为例
猜数字游戏代码的函数优化方案
原代码存在大量重复逻辑(简单/困难模式的流程几乎一致,仅次数不同),结构冗余且难以维护。我们可以按照单一职责原则,把不同功能模块封装成独立函数,让代码更清晰、易扩展。
可封装的核心模块
- 获取合法难度选择:处理用户输入,确保只能选择"easy"或"hard",拦截无效输入
- 生成目标随机数:封装1-100的随机数生成逻辑
- 获取有效猜测值:确保用户输入的是整数,处理非数字输入的异常
- 判断猜测结果并给出反馈:对比用户猜测和目标数,返回对应的提示信息
- 游戏核心循环:接收目标数和剩余次数,处理完整的猜测流程
优化后的代码
import random def generate_random_number(): """生成1到100之间的随机整数""" return random.randint(1, 100) def get_valid_difficulty(): """获取用户合法的难度选择,直到输入正确为止""" while True: difficulty = input("选择难度:输入'easy'(简单,10次机会)或'hard'(困难,5次机会):").lower() if difficulty in ["easy", "hard"]: return difficulty print("输入无效,请重新选择!") def get_valid_guess(): """获取用户有效的数字猜测,处理非数字输入""" while True: try: guess = int(input("请输入你的猜测:")) return guess except ValueError: print("请输入有效的整数!") def check_guess(guess, target): """对比猜测值和目标数,返回结果提示""" if guess == target: return f"{guess} 猜对了!你赢了!" elif guess > target: return f"{guess} 太大了!" else: return f"{guess} 太小了!" def play_game(target, attempts): """执行游戏的核心循环,接收目标数和剩余次数""" print(f"你有 {attempts} 次机会猜数字!") for attempt in range(attempts, 0, -1): if attempt != attempts: print(f"你还剩 {attempt} 次机会!") guess = get_valid_guess() result = check_guess(guess, target) print(result) if "猜对了" in result: return print(f"机会用完了!正确数字是 {target},你输了!") # 游戏启动流程 if __name__ == "__main__": target_number = generate_random_number() # 调试用:打印目标数 # print(f"调试:目标数是 {target_number}") difficulty = get_valid_difficulty() total_attempts = 10 if difficulty == "easy" else 5 play_game(target_number, total_attempts)
优化说明
- 消除重复代码:把原代码中easy和hard模式的重复逻辑全部整合到
play_game函数中,通过传入不同的次数参数实现模式区分 - 职责单一:每个函数只做一件事,比如
get_valid_guess只负责获取合法的数字输入,check_guess只负责判断猜测结果 - 容错性提升:新增了无效难度输入的处理,确保用户必须输入合法选项才能继续游戏
- 可读性增强:函数名和注释清晰表达了每个模块的功能,代码逻辑一目了然
内容的提问来源于stack exchange,提问作者Rotang Daniels
相关产品推荐
相关产品推荐

