2014-07-16 9 views
0

Я действительно новичок в программировании и только начал делать игру из камня, бумаги, ножниц. Но я повесил трубку на присвоение randint объекту, я сделал смелый комментарий, где у меня возникла проблема. Я предполагаю, что когда я буду звонить по компьютеру = randint (0,2), он будет каждый раз менять компьютер, так как я могу это исправить? Извините, если это глупый вопрос.Назначение значений randint для объектов [Python]

import random 
from random import randint 
import time 
import sys 

def choice(): 
    print("Rock, paper, scissors, or quit?") 
    answer = input('> ').lower() 

    if answer in('rock'): 
     print("\nYou have chosen {}".format(answer)) 

    elif answer in('paper'): 
     print("\nYou have chosen {}".format(answer)) 

    elif answer in('scissors'): 
     print("\nYou have chosen {}".format(answer)) 

    elif answer in('quit'): 
     sys.exit(0) 
    else: 
     print("Could not recognize your answer. Please try again.") 
     choice() 

    print("Rock") 
    time.sleep(0.5) 
    print("Paper") 
    time.sleep(0.5) 
    print("Scissors") 
    time.sleep(0.5) 

    options = ('Rock', 'Paper', 'Scissors')*3 
    print("\nI have chosen: " + random.choice(options)) 
    print('\n') 

    new_answer = answer 
    #THIS IS WHERE IM HAVING TROUBLE ASSIGNING OBJECT TO THE RANDINT 
    computer = randint(0,2) 

    if new_answer == 'rock': 
     if computer == 0: #paper 
      print("1") 
     elif computer == 1: #scissors 
      print("2") 
     elif computer == 2: # 
      print("3") 
    if new_answer == 'paper': 
     if computer == 0: # 
      print("Paper covers rock. You win.") 
     elif computer == 1: 
      print("It's a draw. We suck.") 
     elif computer == 2: 
      print("Scissors cuts paper. I win") 
    if new_answer == 'scissors': 
     if computer == 0: 
      print("Rock crushes scissors. I win.") 
     if computer == 1: 
      print("Scissors cut paper. You win.") 
     if computer == 2: 
      print("It's a draw. We suck.") 
+0

Что неприятности вы с? Выбросьте некоторые '' 'print''' и покажите нам фактический результат по сравнению с тем, что вы ожидаете. Также включайте любые соответствующие сообщения об ошибках, которые вы получаете – wnnmaw

+1

Кроме того, нет причин для '' 'import random''', затем' '' from random import randint'''. Вы можете либо сделать первый, и обратиться к функции как '' 'random.randint''', либо второй, и ссылаться на нее как на' '' randint'''. Но это не огромная сделка. – wnnmaw

ответ

2
print("\nI have chosen: " + random.choice(options)) 
#... 
computer = randint(0,2) 

Вы делаете компьютер выбрать дважды. Вы должны выбрать (случайно) один раз, назначить результат переменной, а затем распечатать его.

Как только вы присвоите значение вызова функции переменной (как в computer = randint(0,2)), значение переменной (computer) не изменится, если вы не назначили ей еще раз.

Еще пара замечаний:

  • Как wnnmaw упоминалось, что вам не нужно импортировать random
  • Вам не нужно импортировать exit из sys, это изначально доступно
  • Вы можете импортировать time.sleep
  • Вы должны поддерживать связь между числами и выборами (камень, бумага, ножница) только один раз в коде, чтобы предотвратить ошибки, и использовать соответствующую функцию списка s, чтобы получить их (SUC ч, как list.index
  • Вы использовали in innapropriately вместо == оператора
  • После того, как вы держите ассоциации в одном месте, вам не нужно, чтобы проверить их по отдельности: использовать in
  • ('Rock', 'Paper', 'Scissors')*3: Это создает кортеж с 9 элементов, что, вероятно, не то, что вы хотели
  • переменной new_answer кажется излишним
  • функции становится очень долго, так что вы можете реорганизовать его часть к новым функциям, поэтому она становится Больше читаемый
  • Будьте осторожны, вызывая функцию внутри самой функции. Как правило, вы должны использовать цикл (поиск «рекурсия» и «переполнение стека»)
  • Вы можете использовать порядок выбора (камень, бумага, ножницы), чтобы проверить результат матча элегантно, так как каждый выбор выигрывает, когда снова появляется выбор сразу перед ним . Вы можете сделать это, используя оператор модуля (%)

Вот переписана версия принимая эти советы во внимание:

from random import choice 
from time import sleep 

CHOICES=('rock','paper','scissors') 

def print_animation(): 
    print("Rock") 
    sleep(0.5) 
    print("Paper") 
    sleep(0.5) 
    print("Scissors") 
    sleep(0.5) 


def rock_paper_scissors(): 
    while(True): 
     print("Rock, paper, scissors, or quit?") 
     answer = input('> ').lower() 
     if answer in CHOICES: 
      print("\nYou have chosen {}\n".format(answer)) 
      break 
     elif answer=='quit': 
      sys.exit(0) 
     else: 
      print("Could not recognize your answer. Please try again.") 

    print_animation() 

    computer= choice(CHOICES) 
    print("\nI have chosen: " + computer + "\n") 

    player_answer_index= CHOICES.index(answer) 
    computer_answer_index= CHOICES.index(computer) 

    if player_answer_index==computer_answer_index: 
     print("draw") 
    elif (player_answer_index+1)%3==computer_answer_index: 
     print("computer wins") 
    else: 
     print("player wins") 


rock_paper_scissors() 
+0

Да, я знаю, много избыточности и неэффективности кода из предыдущих изменений или вариаций, которые я пробовал, таких как «in» и new_answer.Я ценю пересмотр, поскольку он делает вещи намного более ясными. Я определенно буду использовать порядок выбора больше, поскольку это имеет наибольший смысл. – MoawingWizard

Смежные вопросы