📜  Python - 牛和公牛游戏

📅  最后修改于: 2022-05-13 01:55:39.811000             🧑  作者: Mango

Python - 牛和公牛游戏

Cows and Bulls 是一种纸笔密码破解游戏,通常在 2 名玩家之间进行。在这种情况下,玩家试图猜测第二个玩家选择的密码号码。规则如下:

  • 玩家将创建一个密码,通常是一个 4 位数字。该号码不应有重复的数字。
  • 另一位玩家猜测(4 位数字)来破解秘密数字。进行猜测后,将提供 2 个提示 - 母牛和公牛。
  • 公牛表示正确位置的正确位数,母牛表示错误位置的正确位数。例如,如果密码是 1234,猜测的数字是 1246,那么我们有 2 个 BULLS(用于数字 1 和 2 的精确匹配)和 1 个 COW(用于数字 4 在错误位置的匹配)
  • 玩家不断猜测,直到密码被破解。猜出最少次数的玩家获胜。

解释:

让我们看一个示例运行以便更好地理解。

Secret Code: 3768

Guess: 1234
Response: 0 bulls, 1 cow
Guess: 5678
Response: 1 bull, 2 cows
Guess: 1678
Response: 1 bull, 2 cows
Guess: 3678
Response: 2 bulls, 2 cows
Guess: 3148
Response: 2 bulls, 0 cows
Guess: 3768
You guessed right!

方法:

要在Python中创建这个游戏,计算机会生成一个密码,用户必须猜测密码。把它分解成这些块:

  • 生成密码——生成一个随机的 4 位数字并检查它是否没有任何重复的数字。
  • 生成提示或响应 - 获取生成的 4 位密码和猜测的数字(输入)。找到完全匹配的公共数字(公牛)和错误位置的公共数字(母牛)。重复每个猜测,直到您有 4 只公牛(完全匹配)或尝试用完为止。

约束条件:密码和猜出的密码应该是4位数字(1000到9999之间)并且没有重复的数字。

程序:

Python
# Import required module
import random 
  
# Returns list of digits 
# of a number
def getDigits(num):
    return [int(i) for i in str(num)]
      
  
# Returns True if number has 
# no duplicate digits 
# otherwise False      
def noDuplicates(num):
    num_li = getDigits(num)
    if len(num_li) == len(set(num_li)):
        return True
    else:
        return False
  
  
# Generates a 4 digit number 
# with no repeated digits    
def generateNum():
    while True:
        num = random.randint(1000,9999)
        if noDuplicates(num):
            return num
  
  
# Returns common digits with exact 
# matches (bulls) and the common 
# digits in wrong position (cows)
def numOfBullsCows(num,guess):
    bull_cow = [0,0]
    num_li = getDigits(num)
    guess_li = getDigits(guess)
      
    for i,j in zip(num_li,guess_li):
          
        # common digit present
        if j in num_li:
          
            # common digit exact match
            if j == i:
                bull_cow[0] += 1
              
            # common digit match but in wrong position
            else:
                bull_cow[1] += 1
                  
    return bull_cow
      
      
# Secret Code
num = generateNum()
tries =int(input('Enter number of tries: '))
  
# Play game until correct guess 
# or till no tries left
while tries > 0:
    guess = int(input("Enter your guess: "))
      
    if not noDuplicates(guess):
        print("Number should not have repeated digits. Try again.")
        continue
    if guess < 1000 or guess > 9999:
        print("Enter 4 digit number only. Try again.")
        continue
      
    bull_cow = numOfBullsCows(num,guess)
    print(f"{bull_cow[0]} bulls, {bull_cow[1]} cows")
    tries -=1
      
    if bull_cow[0] == 4:
        print("You guessed right!")
        break
else:
    print(f"You ran out of tries. Number was {num}")


输出: