#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 — Хорошая мысль; убрал
Ответ №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 Видишь, Почему глобальное государство такое злое?