You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求实现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()

代码细节解释:

  1. generate_secret_number():用random.sample确保生成的4位数字没有重复,避免出现比如1123这种重复数字的情况(当然如果想允许重复,把sample改成choices即可)。
  2. calculate_cows_and_bulls()
    • 先通过zip逐位对比,快速统计Bulls的数量;
    • 用字典统计数字出现次数,是为了准确计算两个数字串的共同数字总数,再减去Bulls就得到了位置不对的匹配数(也就是Cows)。
  3. 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

火山引擎 最新活动