2016-12-16 118 views
1

所以我一直在这个问题上待了一段时间,并且在搜索多个其他问题之后找不到我需要的答案。检查列表中的某些元素是否相同

我已经设置了一个任务来创建一个4位数的随机数发生器,然后用户必须尝试猜测数字。每次尝试他们都会说明他们有多少号码,他们是在哪个位置。 此外,号码需要处于正确的位置。

这是我当前的代码。

import random as r 
def GetNumber(): 
    number = [r.randint(0, 9), r.randint(0, 9), r.randint(0, 9), r.randint(0, 9)] 
    return number 

def Choices(): 
    randomNumber = GetNumber() 
    userChoice = list(input("Enter 4 numbers\n")) #Allows the user to input a number 4 digits long 
    userChoice = [int(i) for i in userChoice] 
    if userChoice == randomNumber: 
     print("Congratulations! You chose the right number") 

感谢提前:)

+2

为什么不'r.randint(1000,9999)'如果你想要一个4位数的随机数? –

+0

所以你正在尝试编码的主脑游戏..到目前为止您的代码是非常好的。你也可以单独做。 –

+0

@Chris_Rands我也希望第一个数字的机会是0 – Jake

回答

1

这是我的承担。

import random as r 


def GetNumber(): 
    return [r.randint(0, 9) for i in range(4)] 


def Choices(): 
    randomNumber = GetNumber() 
    userChoice = [int(i) for i in list(input("Enter 4 numbers\n"))] 
    n = 0 
    while userChoice != randomNumber: 
     hits = [str(i+1) for i in range(4) if userChoice[i] == randomNumber[i]] 
     if hits: 
      print('You got position(s) {} correct'.format(', '.join(hits))) 
     else: 
      print('You got all of them wrong!') 
     userChoice = [int(i) for i in list(input("Enter 4 numbers\n"))] 
     n += 1 
    print("Congratulations! You found the right number in {} turns!!".format(n)) 

Choices() 

该代码已重构了一下循环,直到用户实际找到密码。这只是一个框架,您可以尝试一下,并尝试根据用户交互或其他方面进一步优化它。

如果有什么不清楚的地方,请告诉我。干杯!

+0

感谢您的快速回复,给它一个测试,它完美的工作 – Jake

+0

@ Tobias_k的回答也非常有趣。您可能需要将两者融合,向用户提供错误位置的正确数字提示 –

1

可以zip随机数和用户的选择和比较对:无论

>>> number = [4, 3, 9, 1] 
>>> choice = [1, 3, 4, 1] 
>>> [n == c for n, c in zip(number, choice)] 
[False, True, False, True] 
>>> sum(n == c for n, c in zip(number, choice)) 
2 

要获得匹配的号码的总数,其位置,您可以通过Counter提供号码和用户的选择,并与&交叉:

>>> from collections import Counter 
>>> Counter(number) & Counter(choice) 
Counter({1: 1, 3: 1, 4: 1}) 
>>> sum((Counter(number) & Counter(choice)).values()) 
3 
+0

'sum(n == c for n,c in zip(number,choice))'returned 2 is beautiful –

-1
import random as r 
def GetNumber(): 
    number = r.randint(0000, 9999) 
    return str(number).zfill(4) 

def Choices(): 
    randomNumber = GetNumber() 
    print type(randomNumber),randomNumber 
    userChoice = str(input("Enter 4 numbers\n")).strip("\n") #Allows the user to input a number 4 digits long 
    for a,b in zip(userChoice,randomNumber): 
     if not a==b: 
     print "{0} not match {1}".format(a,b) 
    if userChoice==randomNumber: 
     print "Congratulations! You chose the right number" 

Choices() 
+3

好吧,它不会做问题的问题,它是一个纯粹的代码答案,没有任何解释,它在Python 3中将无法正常工作,并且无理由地创建一个元素列表。 – interjay

+0

@interjay thx,我解决了这个问题,但我一直在寻找问题并解决当前问题,我的意思是这不是代码复习 –

+2

你在这里发布的代码应该是很好的代码,因为这是人们从中学到的东西。无论如何,你已经修复了我列出的其中一个问题,但是这仍然没有实际做问题的要求(检查哪些数字是正确的)。 – interjay

0

我认为这个关键是使用一串数字而不是数字数据类型。这是一个工作示例。你可以通过比较数字来做到这一点,但在这种情况下,我们并不在乎数字的价值,就像字符的模式一样。

from random import choice 
from string import digits 


def is_digits(string): 
    """Return true if all characters are digits, otherwise false""" 

    return all([char.isdigit() for char in string]) 


def get_number(length): 
    """Return a string of digits with the number of characters equal to length""" 

    return ''.join(choice(digits) for i in range(length)) 


def guess(): 
    """Receive and evaluate guesses for match to randomly generated number""" 

    guess = '' 
    miss_char = '-' 
    miss_message = 'Try again.' 
    win_message = 'Congratulations! You chose the right number.' 
    answer_length = 4 
    answer = get_number(answer_length) 
    while guess != answer: 
     guess = raw_input('Enter {0} numbers: '.format(len(answer))) 
     if len(guess) != len(answer) or is_digits(guess) is False: 
      continue 
     matches = [answer[i] 
        if answer[i] == guess[i] 
        else miss_char 
        for i in range(len(answer))] 
     matches_string = ''.join(matches) 
     message_base = 'Matched digits: {0}.'.format(matches_string) 
     if guess != answer: 
      print(' '.join([message_base, miss_message])) 
      guess = '' 
     else: 
      print(' '.join([message_base, win_message])) 

guess() 
相关问题