2015-09-15 3 views
0

Мне нужно сделать игру в кости на Python, но я получаю зависание, чтобы функции работали правильно.Ошибка «Variable not defined in function»

from random import randint 

def rollAll5Die(): 

    dice = [] 
    for c in range(0,5): 
     dice.append(randint(1,6)) 

    return dice 

def outputUpdate(oTitle, diceList): 

    print(oTitle) 
    print(diceList) 
    print('') 

def whichRoll(): 

    rollWhich = input("Enter dice/die you want to roll again--1 2 3 4 or 5: ") 
    lRollAgain = rollWhich.split() 
    print(lRollAgain) 
    print('') 


def rollSelected(): 

    for i in lRollAgain: 
     rolledDice[int(i) - 1] = randint(1,6) 


def dicePokerGame(): 

    keepPlaying = True 

    while keepPlaying: 

     isPlay = input('Please enter "y" if you want to play another round of the dice game or "q" if you want to quit game: ') 
     print('') 

     if isPlay == 'y': 

      rolledDice = rollAll5Die() 

      outputUpdate("Roll of five dice", rolledDice) 

      nRollAgain = whichRoll() 

      rollSelected() 

      outputUpdate("Second Roll", rolledDice) 

      nRollAgain = input("Enter Dice you want to roll for final roll: ") 
      lRollAgain = nRollAgain.split() 
      print(lRollAgain) 
      print('') 

      for i in lRollAgain: 
       rolledDice[int(i) - 1] = randint(1,6) 

      print("Final Roll") 
      print(rolledDice) 
      print('') 


    #Score the hand Function 

     counts = [0] * 7 
     for value in rolledDice: 
      counts[value] = counts[value] + 1 

     if 5 in counts: 
      score = "Five of a Kind", 30 
     elif 4 in counts: 
      score = "Four of a Kind", 25 
     elif (3 in counts) and (2 in counts): 
      score = "Full House", 15 
     elif 3 in counts: 
      score = "Three of a Kind", 10 
     elif not (2 in counts) and (counts[1] == 0 or counts[6] == 0): 
      score = "Straight", 20 
     elif counts.count(2) == 2: 
      score = "Two Pair", 5 
     else: 
      score = "No Winnings", 0 

     print("Score") 
     print(score) 
     print('') 


    else: 

     keepPlaying = False 

def main(): 

    dicePokerGame() 

main() 

Когда я запускаю эту программу, она работает нормально, пока не получит функции rollSelected() и дает мне ошибку. Ошибка говорит о том, что lRollAgain не определен в функции rollSelected.

Может ли кто-нибудь объяснить, почему он говорит, что lRollAgain не определен в функциях rollSelected? Потому что он находится в функции whichRoll. Наверное, я просто не знаю, что он спрашивает.

+2

переменные имеют «область действия». Просто потому, что вы определили переменную в одной функции, она не отображается в других функциях. Вам может потребоваться передать 'lRollAgain' в качестве параметра' rollSelected' (например, вы используете 'oTitle' и' diceList' для функции 'outputUpdate'. – Blorgbeard

ответ

0

В нем говорится, что поскольку IRollAgain - это просто имя переменной. вы объявили его в функцииRoll, что означает, что это только означает что-то в функцииRoll. Поскольку функция rollSelected не находится в функцииRoll, IRollAgain ничего не означает в rollSelected. Вам придется объявить это снова как то, что вы хотите, передавая IRollAgain в качестве аргумента в функции rollSelected. т.е.

rollSelected(thisRoll) 

EDIT:

Я также думаю, что вы имеете в виду вашу функцию whichRoll, чтобы выглядеть следующим образом:

def whichRoll(): 

    return input("Enter.... etc") 

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

2

Вы используете свои переменные так, как будто они global. Хотя ваш синтаксис делает их местными. (Я предлагаю посмотреть эти термины). В результате они существуют только в пределах их узкой области (например, функции, в которой они используются). Установка переменной в одной функции и ее использование в другой функции работает только для глобальных переменных.

Быстрое решение было бы сделать все ваши переменные глобальные так:

lRollAgain = None 

def anyFunction(): 
    global lRollAgain 
    # now use lRollAgain or assign a new value to it ... 

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

Но StackOverflow не является платформой для обучения таким элементарным вещам, извините.

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