Камень, Ножницы, бумага, Ведение Счета

#python #python-2.7

#python #python-2.7

Вопрос:

Я пытаюсь создать игру камень, ножницы, бумага, которая ведет счет, но когда я запускаю эту программу, оценка сбрасывается каждый раз. Что мне нужно изменить, чтобы я мог правильно вести счет?

 import random

def rockPaperScissors():
    playerScore = 0
    computerScore = 0
    print ""
    p = raw_input("Type 'r' for rock, 'p' for paper or 's' for scissors: ")
    choices = ['r', 'p', 's']
    c = random.choice(choices)
    print ""
    print "Your move:", p
    print "Computer's move:", c
    print ""
    if p == c:
        print "Tie"
    elif p == 'r' and c == 's':
        playerScore  = 1
        print "You win"
    elif p == 'p' and c == 'r':
        playerScore  = 1
        print "You win"
    elif p == 's' and c == 'p':
        playerScore  = 1
        print "You win"
    elif c == 'r' and p == 's':
        computerScore  = 1
        print "You lose"
    elif c == 'p' and p == 'r':
        computerScore  = 1
        print "You lose"
    elif c == 's' and p == 'p':
        computerScore  = 1
        print "You lose"
    else:
        print "Try again"
    print ""
    print "Your score:", str(playerScore)  ", Computer score:", str(computerScore)

while True:
    rockPaperScissors()
  

Комментарии:

1. каждый раз, когда вы запускаете, как при каждом запуске скрипта?

2. Предложение, сделанное, когда я преподавал это задание: закодируйте варианты в виде целых чисел 1, 2, 3. Тогда (r-c)%3 легко указывает на победителя, не имея 7 предложений if / else.

Ответ №1:

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

 import random

def rockPaperScissors():
    playerScore = 0
    computerScore = 0
    ...
    return playerScore, computerScore

player = 0
computer = 0

while True:
    p, c = rockPaperScissors()
    player  = p
    computer  = c
    print "Your score:", str(player)  ", Computer score:", computer
  

Комментарии:

1. Мне это нравится больше, чем global, но я думаю, вам следует передавать совокупные баллы в функцию, чтобы она каждый раз выводила совокупные баллы (и не сбрасывала баллы вверху)

2. @rbierman — Хорошая мысль; убрал print инструкцию из функции.

Ответ №2:

Каждый раз, когда вы запускаете функцию, вы сбрасываете результаты. Определите computerScore и PlayerScore вне функции, тогда она сохранит значения даже при многократном запуске функции. Используйте global для «импорта» глобальной переменной в область действия функции.

 playerScore = 0
computerScore = 0

def rockPaperScissors ():
    global playerScore
    global computerScore
    OTHER CODE
  

Комментарии:

1. global для этого совершенно не нужно и это ужасный костыль для изучения.

2. Я бы рекомендовал использовать его в этом случае, просто потому, что он демонстрирует, как python работает с переменными и областями. Альтернативой было бы возвращение значений, хотя в этом действительно нет необходимости для такого простого проекта, как этот.

3. Я никогда не видел ни одного случая, когда global это правильный способ что-то сделать.

4. Поэтому, пожалуйста, объясните мне, почему в данном конкретном случае глобальный подход — это не тот путь? Это идеальный способ продемонстрировать обработку переменных pythons (правила определения области видимости LEGB, …) и не требует большого внимания. Что касается крупномасштабных приложений, я полностью согласен с вами, но здесь, на мой взгляд, лучше всего действовать глобально

5. @NikxDa Видишь, Почему глобальное государство такое злое?