请求实现Cows and Bulls游戏:生成4位随机数并实现猜数逻辑
嘿,我懂你卡在这里的抓狂感——Cows and Bulls的核心逻辑一开始确实容易绕晕。咱们一步步把你的代码补全,实现你想要的游戏效果!
完整实现Cows and Bulls游戏
首先明确我们需要完成的核心步骤:
- 生成一个4位不重复的随机数字串(符合游戏常规规则,避免重复数字干扰判断)
- 接收用户的4位数字输入,做合法性校验(确保输入是有效的4位数)
- 编写计算Cows和Bulls的逻辑:
- Bulls:数字和位置都完全匹配的数量
- Cows:数字存在但位置不匹配的数量
- 循环接收输入,直到用户猜对,统计尝试次数并给出恭喜信息
下面是补全后的完整代码:
import random def generate_secret_number(): # 从0-9中选4个不重复的数字,拼接成字符串方便逐位对比 digits = random.sample('0123456789', 4) return ''.join(digits) def calculate_cows_and_bulls(secret, guess): bulls = 0 cows = 0 # 先统计Bulls:逐位对比,数字和位置都匹配的计数 for secret_digit, guess_digit in zip(secret, guess): if secret_digit == guess_digit: bulls += 1 # 统计Cows:先算两个数字串的共同数字总数,再减去Bulls(排除位置正确的部分) secret_digit_counts = {} guess_digit_counts = {} # 统计秘密数字中每个数字的出现次数 for digit in secret: secret_digit_counts[digit] = secret_digit_counts.get(digit, 0) + 1 # 统计猜测数字中每个数字的出现次数 for digit in guess: guess_digit_counts[digit] = guess_digit_counts.get(digit, 0) + 1 # 计算共同数字的总数量 common_digits_total = 0 for digit in secret_digit_counts: if digit in guess_digit_counts: common_digits_total += min(secret_digit_counts[digit], guess_digit_counts[digit]) # Cows = 共同数字总数 - Bulls(因为Bulls已经是位置正确的,剩下的就是位置不对的) cows = common_digits_total - bulls return cows, bulls def play_game(): print("Welcome to Cows and Bulls game.") secret_number = generate_secret_number() attempts = 0 while True: guess = input("Enter a number: >> ").strip() # 输入合法性校验:必须是4位纯数字 if not guess.isdigit() or len(guess) != 4: print("Oops, please enter a valid 4-digit number!") continue attempts += 1 cows, bulls = calculate_cows_and_bulls(secret_number, guess) if bulls == 4: print(f"Congrats, you got it in {attempts} tries.") break print(f"{cows} Cows, {bulls} Bulls.") if __name__ == "__main__": play_game()
代码细节解释:
generate_secret_number():用random.sample确保生成的4位数字没有重复,避免出现比如1123这种重复数字的情况(当然如果想允许重复,把sample改成choices即可)。calculate_cows_and_bulls():- 先通过
zip逐位对比,快速统计Bulls的数量; - 用字典统计数字出现次数,是为了准确计算两个数字串的共同数字总数,再减去Bulls就得到了位置不对的匹配数(也就是Cows)。
- 先通过
play_game():游戏主流程,负责初始化秘密数字、循环接收输入、校验合法性、输出结果,直到用户猜对所有数字。
测试效果(和你给出的示例完全匹配):
Welcome to Cows and Bulls game.
Enter a number: >> 1234
2 Cows, 0 Bulls.
Enter a number: >> 1286
1 Cows, 1 Bulls.
Enter a number: >> 1038
Congrats, you got it in 3 tries.
这样就能完美实现你想要的功能啦!如果有其他调整需求(比如允许重复数字、修改位数),随时改对应部分就行~
内容的提问来源于stack exchange,提问作者Crystal Knight




