2015-03-20 3 views
1

Я пытаюсь написать программу для задания, в которой вы вводите определенную команду, и вы можете играть в Rock-Paper-Scissors-Lizard-Spock против компьютера. Это было сделано и работало, пока я не понял, что инструкции по назначению хотели, чтобы я сделал это так, чтобы вы продолжали играть в игру, пока один человек не получил пять побед.Новичок для Python - почему черт мой мой цикл не работает?

Так что я думал, никаких больших сделок, давайте бросим петлю while и некоторые переменные, чтобы отслеживать выигрыши. Но когда я запускаю программу, она работает только один раз. Я не знаю, что я делаю неправильно, так как это должно сработать. Это мой первый опыт работы с Python (версия 3.3) и этой IDE, поэтому мне действительно нужна помощь. Обычно я просто отлаживаю, но я не могу понять, как работать в этой среде IDE.

Вот мой код. Тревога во время цикла находится на дне. Я почти уверен, что все внутри класса работает. Я хотел бы отметить, что я уже пробовал пока (computerWins < 5 и userWins < 5), поэтому я не думаю, что это проблема.

import random 

computerWins = 0 
userWins = 0 
print ('SELECTION KEY:\nRock = r\nPaper = p\nScissors = sc\nLizard = l\nSpock = sp') 

class rockPaperScissorsLizardSpock: 
#Two methods for converting from strings to numbers 

    #convert name to number using if/elif/else 
    #also converts abbreviated versions of the name 
    def convertName(name): 
     if(name == 'rock' or name == 'r'): 
      return 0 
     elif(name == 'Spock' or name == 'sp'): 
      return 1 
     elif(name == 'paper' or name == 'p'): 
      return 2 
     elif(name == 'lizard' or name == 'l'): 
      return 3 
     elif(name == 'scissors' or name == 'sc'): 
      return 4 
     else: 
      print ('Error: Invalid name') 

    #convert number to a name using if/elif/else 
    def convertNum(number): 
     if(number == 0): 
      return 'rock' 
     elif(number == 1): 
      return 'Spock' 
     elif(number == 2): 
      return 'paper' 
     elif(number == 3): 
      return 'lizard' 
     elif(number == 4): 
      return 'scissors' 
     else: 
      print ('Error: Invalid number') 

    #User selects an option, and their selection is saved in the 'choice' variable  
    #Using a while loop so that the user cannot input something other than one of the legal options 
    prompt = True 
    while(prompt): 
     i = input('\nEnter your selection: ') 
     if(i=='r' or i=='p' or i=='sc' or i=='l' or i=='sp'): 
      prompt = False 
     else: 
      print('Invalid input.') 
    prompt = True 

    #Convert the user's selection first to a number and then to its full string 
    userNum = convertName(i) 
    userChoice = convertNum(userNum) 

    #Generate random guess for the computer's choice using random.randrange() 
    compNum = random.randrange(0, 4) 

    #Convert the computer's choice to a string 
    compChoice = convertNum(compNum) 

    print ('You chose', userChoice) 
    print ('The computer has chosen', compChoice) 

    #Determine the difference between the players' number selections 
    difference = (compNum - userNum) % 5 

    #Use 'difference' to determine who the winner of the round is 
    if(difference == 1 or difference == 2): 
     print ('The computer wins this round.') 
     computerWins = computerWins+1 
    elif (difference == 4 or difference == 3): 
     print ('You win this round!') 
     userWins = userWins+1 
    elif(difference == 0): 
     print ('This round ended up being a tie.') 

#Plays the game until someone has won five times 
while(computerWins != 5 and userWins != 5): 
    rockPaperScissorsLizardSpock() 

if(computerWins == 5 and userWins != 5): 
    print ('The computer wins.') 
elif(computerWins != 5 and userWins == 5): 
    print ('You win!') 
+0

Код является очень сложным для чего-то так просто. –

+1

что в мире «класс rockPaperScissorsLizardSpock:» должен делать. И да, путь к сложному для чего-то настолько простого. – letsc

+0

Я должен сделать, чтобы пользователь вводил эти буквы, а использование чисел в соответствии со значениями казалось самым простым способом сделать это. Если бы это был java, или я не должен был делать такие конкретные вещи, это было бы проще. У вас есть предложения по этому вопросу? – lovechicken

ответ

3

Важнейшей проблемой является то, что rockpaperscissorslizardspock является классом , где вы ожидаете, что это будет функция. Код внутри него запускает ровно один раз, когда все определение класса анализируется, а не каждый раз, когда вы вызываете класс, как вы, кажется, ожидаете.

Вы могли поместить соответствующий код в __init__ метод - это довольно прямой аналог конструктора Java, и, следовательно, является запуска каждый раз, когда вы вызываете класс. Но в этом случае вам, вероятно, не нужно, чтобы он был в классе вообще - вызов класса создает новый экземпляр (например, делает new MyClass() в Java), который вы не используете. Вы также в этом случае (или если бы вы включили его в функцию) должны были внести некоторые дополнительные изменения, чтобы убедиться, что состояние игры сохраняется правильно.

Самый простой фактическое решение заключается в следующем:

  1. удалить строку class rockpaperscissorslizardspock: (и Unindent все под ним)
  2. Возьмите весь код, который находился под классом, но не в функции - все от игрока делает выбор для определения победителя раунда - и вставляет его вместо вызова в rockpaperscissorslizardspock() в нижнем цикле.
+0

спасибо !! Это все! Хотел бы я проголосовать за тебя. Спасибо. Мне нужно будет больше узнать об использовании классов. – lovechicken

1

Первое, что вы используете в классе, где вы, вероятно, должны использовать функцию.

Ваш код изначально запускается, потому что python загружает класс.

Однако строка rockPaperScissorsLizardSpock() создает новые анонимные экземпляры вашего класса, который вызывает конструктор, который вы не определили, чтобы он ничего не делал.

Одна из интересных вещей о python заключается в том, что он позволяет вложенные функции, поэтому, если вы меняете class на def, вы почти там.

После этого у вас возникнут проблемы с глобальными переменными в локальном контексте. Эта проблема уже объясняется в другом вопросе StackOverflow: Using global variables in a function other than the one that created them.

1

Вот мое предложение для скелета к более простому решению. Используйте некоторые идеи здесь, если хотите.

import random 

legal_shapes = ['r', 'p', 'sc', 'sp', 'l'] 
scoreboard = [0, 0] 
print('SELECTION KEY:\nRock = r\nPaper = p\nScissors = sc\nLizard = l\n' 
     'Spock = sp') 

while(max(scoreboard) < 5): 

    print("\nScore is {}-{}".format(*scoreboard)) 

    # pick shapes 
    p1_shape = input('Enter your selection: ') 
    if p1_shape not in legal_shapes: 
     print('Not legal selection!') 
     continue 
    p2_shape = random.choice(legal_shapes) 
    print('\np1 plays {} and p2 plays {}'.format(
     p1_shape.upper(), p2_shape.upper())) 

    # determine int values and result indicator 
    p1_shape_int = legal_shapes.index(p1_shape) 
    p2_shape_int = legal_shapes.index(p2_shape) 
    res = (p1_shape_int - p2_shape_int) % 5 
    if res != 0: 
     res = abs((res % 2) - 2) 

    # Print winner 
    if res == 0: 
     print(' -> Draw!!') 
    else: 
     print(' -> p{} wins'.format(res)) 
     scoreboard[res-1] += 1 

print("\nThe game is over!!") 
print("p{} won with score {}-{}".format(res, *scoreboard)) 

Он выдает что-то вроде

(env)➜ tmp python3 rsp.py 
SELECTION KEY: 
Rock = r 
Paper = p 
Scissors = sc 
Lizard = l 
Spock = sp 

Score is 0-0 
Enter your selection: T 
Not legal selection! 

Score is 0-0 
Enter your selection: l 

p1 plays L and p2 plays SP 
-> p2 wins 

Score is 0-1 
Enter your selection: l 

p1 plays L and p2 plays SC 
-> p2 wins 

... 

The game is over!! 
p2 won with score 2-5 
+0

Это превосходно - и я кое-что узнал здесь наверняка. К сожалению, я думаю, мне пришлось идти так, как я. вот что задание захотело мне сделать: – lovechicken

+0

(10 баллов) rockPaperScissorsLizardSpock() Написать функцию Python , чтобы играть в игру Rock, Paper, Scissors, Lizard Spock. Имя ваша функция RockPaperScissorsLizardSpock.Он должен работать следующим образом: Компьютер выбирает камень, бумагу, ножницы, ящерицу или спок. Пользователь вводит свой выбор. Программа печатает варианты и государства, которые выиграли. – lovechicken

+0

Пример вывода из прогона будет выглядеть примерно так: Введите свой выбор (r) ock, (p) aper, (sc) cissors, (l) izard, (sp) pock): p Компьютер выбрал ящерицу. Вы выбрали бумагу. Компьютер побеждает. Ваша программа должна продолжать играть в игру, пока одна из сторон не выиграет пять раз. Обратите внимание, что для определения победителя можно использовать большой условный оператор, но более естественным способом является использование словаря – lovechicken

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