2013-07-26 2 views
1

Я очень новичок в программировании, поэтому решил начать с Python около 4 или 5 дней назад. Я наткнулся на вызов, который попросил меня создать игру «Угадай номер». После завершения «сложной задачей» было создание угадывания номера игры, которую пользователь создает для числа и оценки (ИИ) компьютера.Угадайте число оптимизации игры (пользователь создает число, компьютерные догадки)

До сих пор я придумал это, и он работает, но это может быть лучше, и я объясню.

from random import randint 

print ("In this program you will enter a number between 1 - 100." 
     "\nAfter the computer will try to guess your number!") 

number = 0 

while number < 1 or number >100: 
    number = int(input("\n\nEnter a number for the computer to guess: ")) 
    if number > 100: 
     print ("Number must be lower than or equal to 100!") 
    if number < 1: 
     print ("Number must be greater than or equal to 1!") 

guess = randint(1, 100) 

print ("The computer takes a guess...", guess) 

while guess != number: 
    if guess > number: 
     guess -= 1 
     guess = randint(1, guess) 
    else: 
     guess += 1 
     guess = randint(guess, 100) 
    print ("The computer takes a guess...", guess) 

print ("The computer guessed", guess, "and it was correct!") 

Это то, что случилось на моем последнем прогоне:

Введите номер для компьютера, чтобы догадаться: 78

Компьютер принимает догадку ... 74

Компьютер принимает догадка ... 89

Компьютер берет догадки ... 55

Компьютер берет догадки ... 78

Компьютер угадал 78, и все было правильно!

Обратите внимание, что, хотя компьютер угадал 74, он затем угадал большее число до 89. Это число слишком велико, поэтому компьютер угадывает меньшее число, однако выбранное число равно 55. Есть ли способ, который Я могу вычислить компьютер числом ниже 89, но выше 74? Будет ли это требовать дополнительных переменных или более сложных if, elif, else statement?

Спасибо Райана Haining

Я использовал код от вашего ответа и изменил его немного, так что догадка всегда случайна. Если вы видите это, сообщите мне, если это лучший способ сделать это.

from random import randint 

def computer_guess(num): 
    low = 1 
    high = 100 
    # This will make the computer's first guess random 
    guess = randint(1,100) 
    while guess != num: 
     print("The computer takes a guess...", guess) 
     if guess > num: 
      high = guess 
     elif guess < num: 
      low = guess + 1 
     # having the next guess be after the elif statement 
     # will allow for the random guess to take place 
     # instead of the first guess being 50 each time 
     # or whatever the outcome of your low+high division 
     guess = (low+high)//2  

    print("The computer guessed", guess, "and it was correct!") 


def main(): 
    num = int(input("Enter a number: ")) 
    if num < 1 or num > 100: 
     print("Must be in range [1, 100]") 
    else: 
     computer_guess(num) 

if __name__ == '__main__': 
    main() 
+0

Разве это не должно работать наоборот? Компьютер выбирает номер, пользователь догадывается? – hivert

+0

Как правило, «сложная задача» заключалась в том, чтобы переключить этот аспект программы. Предоставление пользователю возможности выбрать номер и компьютер (AI) для угадывания. – mccdlibby

+0

Привет @mccdlibby. Вышеупомянутая задача имеет решение python на Code Rosetta здесь: http://rosettacode.org/wiki/Guess_the_number/With_feedback_(player)#Python Если вам понравилось, вы можете взглянуть на задача «Быки и коровы», которая является продолжением этой задачи. – Paddy3118

ответ

3

то, что вы ищете классический binary search algorithm

def computer_guess(num): 
    low = 1 
    high = 100 
    guess = 50 
    while guess != num: 
     guess = (low+high)//2 
     print("The computer takes a guess...", guess) 
     if guess > num: 
      high = guess 
     elif guess < num: 
      low = guess + 1 

    print("The computer guessed", guess, "and it was correct!") 


def main(): 
    num = int(input("Enter a number: ")) 
    if num < 1 or num > 100: 
     print("Must be in range [1, 100]") 
    else: 
     computer_guess(num) 

if __name__ == '__main__': 
    main() 

Алгоритм работы, выбрав низкий и высокий предел, чтобы начать с (в вашем случае низкий = 1 и высокий = 100). Затем он проверяет середину между ними.

Если средняя точка меньше числа, то средняя точка становится новой нижней границей. Если средняя точка выше, она становится новой верхней границей.После этого создается новая средняя точка между верхней и нижней границей.

Чтобы проиллюстрировать пример допустим, что вы ищете 82.

Вот пример запуска

Enter a number: 82 
The computer takes a guess... 50 
The computer takes a guess... 75 
The computer takes a guess... 88 
The computer takes a guess... 82 
The computer guessed 82 and it was correct! 

Так что здесь происходит на каждом шагу?

  1. low = 1, high = 100 => 82 так low = 51
  2. low = 51, high = 100 => 82 так low = 76
  3. low = 76, high = 100 =>guess = 88 88> 82 так high = 88
  4. low = 76, high = 88 =>guess = 82 82 == 82 и все готово.

Обратите внимание, что временная сложность этого O(lg(N))

+0

Ничего себе, спасибо! Это довольно удивительно. Цените помощь, очень. – mccdlibby

+0

Я немного изменил его, чтобы компьютеры сначала предполагали случайным, а не всегда 50. Я импортировал функцию randint(). , где у вас есть случайный = 50 Я изменил случайный = randint (1,100) Я переехал guess = (низкий + высокий) // 2 после утверждения elif - таким образом, компьютер всегда будет угадывать случайное число и те же ограничения остаются к следующей догадке. – mccdlibby

+1

@mccdlibby, но угадав, что случайное число сначала является субоптимальным, вы всегда хотите вырезать половину возможных результатов с каждой догадкой. Если вы хотите оптимизировать, оставьте исходное предположение равным 50. Miklos Aubert опубликовал нижеприведенное решение, в котором все время используются рандомы. Оба наших имеют наилучший случай «O (1)». но мой имеет худший случай «O (lg (N))», а его худший случай «O (N)». почему вы хотите сначала догадаться? –

0

Вам нужно всего лишь две новые переменные, чтобы следить за низких и высоких лимитах:

low = 1 
high = 100 
while guess != number: 
    if guess > number: 
     high = guess - 1 
    else: 
     low = guess + 1 
    guess = randint(low, high) 
    print ("The computer takes a guess...", guess) 
+1

На самом деле, не нужны переменные с низким и высоким предельными значениями ... в коде вопроса просто измените 'guess = randint (1, 100)' на 'guess = number', и программа внезапно станет намного короче и проще. –

+0

@ jwpat7 это 'O (1)', довольно хорошо. –

1

Я кратко сделал игру, которую вам нужно с следующим образом:

    import random 

        guess=int(input("Choose a number you want the computer to guess from 1-100: ")) 

        turns=0 
        a=None 

        compguess=random.randint(1,100) 

       while turns<10 and 100>guess>=1 and compguess!=guess: #computer has 10 turns to guess number, you can change it to what you want 
        print("The computer's guess is: ", compguess) 
        if compguess>guess: 
        a=compguess 
        compguess=random.randint(1,compguess) 

       elif compguess<guess: 
        compguess=random.randint(compguess,a) 
        turns+=1 


       if compguess==guess and turns<10: 
       print("The computer guessed your number of:" , guess) 
       turns+=1 

       elif turns>=10 and compguess!=guess: 
       print("The computer couldn't guess your number, well done.") 


      input("") 

Это немного ржавый, но вы можете улучшить его, фактически сужая выбор, чтобы компьютер имел больше шансов угадать правильное число. Но где было бы весело в этом? Обратите внимание, как в моем коде, если компьютер угадывает число, которое больше, чем номер, введенный пользователем, он заменит 100 из функции randint этим номером. Поэтому, если он догадывается о 70, и он слишком высок, после этого он не будет выбирать число, большее 70. Надеюсь, это поможет, просто спросите, нужна ли вам дополнительная информация. И скажите мне, если это немного Glitchy

+0

Этот ответ просто ... не работает, даже если вы попытаетесь разобраться в проблемах форматирования. – TZHX

1

Это, как я ходил мой ...

 __author__ = 'Ghengis Yan' 

    print("\t This is the age of the computer") 
    print("\n The computer should impress us... the Man") 

    import random 

    #User chooses the number 
    the_number = int(input("Human Choose a number between 0 and 100 ")) 
    tries = 1 
    computer = random.randint(0,100) 
    # User choose again loop 
    while the_number > 100: 
     the_number = int(input("I thought Humans are smarter than that... \nRetype the number... ")) 
    if the_number <= 100: 
     print("Good") 

    # Guessing Loop 
    while computer != the_number: 
     if computer > the_number: 
      print(computer, "lower... Mr. Computer") 
     else: 
      print(computer, "higher... Mr. Computer") 
     computer = int(random.randint(0,100)) 
     tries += 1 

    print("Computer Congratulations... You beat the human! The Number was ", the_number) 
    print("It only took a computer such as yourself", tries, "tries to guess it right...   pathetic") 
    input("\nPress the enter key to exit.") 
0

Попробуйте это:

import random 


player = int(input("tap any number: ")) 
comp = random.randint(1, 100) 
print(comp) 

comp_down = 1 
comp_up = 100 

raw_input("Press Enter to continue...") 


while comp != player: 
    if comp > player: 
    comp_up = comp - 1 
    comp = random.randint(comp_down, comp_up) 
    print(comp) 
    if comp < player: 
    comp_down = comp + 1 
    comp = random.randint(comp_down, comp_up) 
    print(comp) 
    if comp == player: 
     break 
0

Если вы используете (в предположении, что это из книги Доусона), вы можете сделать это так.

import random 
#program allows computer to guess my number 
#initial values 
user_input1=int(input("Enter number between 1 and 100: ")) 
tries=1 
compguess=random.randint(1, 100) 

#guessing loop 
while compguess != user_input1: 
    if compguess > user_input1: 
     print("Lower Guess") 
     compguess=random.randint(1, 100) 
     print(compguess) 
    elif compguess < user_input1: 
     print("Higher Guess") 
     compguess=random.randint(1, 100) 
     print(compguess) 

     tries += 1 #to have program add up amount of tries it takes place it in the while block 

print("Good job Computer! You guessed it! The number was,", user_input1, \ 
     " and it only took you", tries, " tries!") 
+1

Вопрос запрашивает помощь с поиском. Ваш код регрессирует от этого до чистого угадывания, метод, который уже описан в предыдущих сообщениях. – Prune

+0

Правда. Но я дошел до этой темы, задав вопрос. Если кто-то другой сделает то же самое - я хотел бы помочь этому человеку. –

+0

@EugenioMParages Но как вы помогаете этому человеку? Вопрос начинается с кода, который лучше, чем чистое угадывание. Каков ваш ответ? – Teepeemm