2015-09-23 4 views
0

Итак, я делаю игру Xs и Os, как побочный проект в Python 3.4, и я столкнулся с проблемой. Несмотря на то, что работает, это не спасает доску, так как я должен определить интервалы в def game():переменная, на которую ссылается до определения при создании игры Noughts and Crosses/Tic Tac Toe

Если я определяю слоты вне def game():, даже если я глобализовать их, он приходит с ошибкой, slot 1 (и т.д.) referenced before definition или что угодно. Это мой код до сих пор, и, так как я хочу цикл оборотов, я должен поставить игру в def game():

from time import sleep 


gameboard = """ 
[1] 
    [2] 
     [3] 
[4] 
    [5] 
     [6] 
[7] 
    [8] 
     [9] 
""" 
print ("Welcome to Noughts and Crosses") 
print ("The gameboard looks like this") 
print (gameboard) 


turn = (0) 

def globalvar(): 
    global slot1 
    global slot2 
    global slot3 
    global slot4 
    global slot5 
    global slot6 
    global slot7 
    global slot8 
    global slot9 
    global slotkeeper 
    global slotkeeper1 

globalvar() 


global slotkeeper1 
slotkeeper = (1) 

def game(): 
    print ("Turn" ,turn + 1) 
    xturn = input("X, please type a number where you want to place your marker") 
    if xturn == ("1"): 
     slot1 = """ 
[X] 
    """ 
    elif xturn == ("2"): 
     slot2 = """ 
    [X] 
    """ 
    elif xturn == ("3"): 
     slot3 = """ 
     [X] 
    """ 
    elif xturn == ("4"): 
     slot4 = """ 
[X] 
""" 
    elif xturn == ("5"): 
     slot5 = """ 
    [X] 
    """ 
    elif xturn == ("6"): 
     slot6 = """ 
     [X] 
    """ 
    elif xturn == ("7"): 
     slot7 = """ 
[X] 
    """ 
    elif xturn == ("8"): 
     slot8 = """ 
    [X] 
    """ 
    elif xturn == ("9"): 
     slot9 = """ 
     [X] 
    """ 
    oturn = input("O, please type a number where you want to place your marker") 
    if oturn == ("1"): 
     slot1 = """ 
[O] 
    """ 
    elif oturn == ("2"): 
     slot2 = """ 
    [O] 
    """ 
    elif oturn == ("3"): 
     slot3 = """ 
     [O] 
    """ 
    elif oturn == ("4"): 
     slot4 = """ 
[O] 
    """ 
    elif oturn == ("5"): 
     slot5 = """ 
    [O] 
    """ 
    elif oturn == ("6"): 
     slot6 = """ 
     [O] 
    """ 
    elif oturn == ("7"): 
     slot7 = """ 
[O] 
    """ 
    elif oturn == ("8"): 
     slot8 = """ 
    [O] 
    """ 
    elif oturn == ("9"): 
     slot9 = """ 
     [O] 
    """ 

    while slotkeeper == (1): 
     slot1 = """ 
[1] 
""" 
     slot2 = """ 
    [2] 
""" 
     slot3 = """ 
     [3] 
""" 
     slot4 = """ 
[4] 
""" 
     slot5 = """ 
    [5] 
""" 
     slot6 = """ 
     [6] 
""" 
     slot7 = """ 
[7] 
""" 
     slot8 = """ 
    [8] 
""" 
     slot9 = """ 
     [9] 
""" 
     slotkeeper = (0) 

    sleep (0.6)  
    print (slot1, slot2, slot3) 
    print (slot4, slot5, slot6) 
    print (slot7, slot8, slot9) 



def game2(): 
    sleep (0.6) 
    slotkeeper = (0) 
    game() 

def gamefinal(): 
    game() 
    game2() 


gamefinal() 

Если вы запустите ее, вы увидите, что моя проблема, так как мне нужно чтобы сделать петлю while, внутри основного определения game(), то есть while cond1 == (1) , так что в основном слоты остаются таким образом, пока условие истинно, в противном случае он не сохранит плату между поворотами, и я не могу определить cond1 за пределами основной def game(): или даже слоты без ошибки, на которые ссылаются перед определением, даже если я их глобализую.

Если я ставлю главные определяющие прорези вне def game():

 slot1 = """ 
[1] 
""" 
     slot2 = """ 
    [2] 
""" 
     slot3 = """ 
     [3] 
""" 
     slot4 = """ 
[4] 
""" 
     slot5 = """ 
    [5] 
""" 
     slot6 = """ 
     [6] 
""" 
     slot7 = """ 
[7] 
""" 
     slot8 = """ 
    [8] 
""" 
     slot9 = """ 
     [9] 
""" 

, когда он печатает слоты, чтобы показать текущее состояние игрового поля, он идет к переменной ошибке ссылочным перед определением, как Я сказал, даже если я буду глобализовать их, даже не глобализируя их в def globalvar():, как обычно, я все еще получаю эту проблему! Если я определяю слоты в начале def game():, он не сохраняет плату (потому что она явно переопределяет слоты, как эти), и если я нахожу цикл while в начале, она просто останавливается и остается как она есть, после print (gameboard), он ничего не делает, и, по-видимому, программа все еще работает, поскольку это так, потому что цикл while должен быть истинным или иметь после него else заявление, которое не работает, и просто ломает его!

EDIT: Я попытался использовать котировки вокруг slotkeeper = ("1") в квадратных скобках и сменить while slotkeeper == (1): на while slotkeeper == ("1"), по-прежнему без изменений. D: РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЯ: Это имеет значение, но вместо получения сообщения об ошибке он просто застревает, хотя я глобализовал переменную slotkeeper и установил ее в ("1"), а в def game2(): я установил ее в ("0") потом!

+1

Функция 'globalvar' не делает то, что вы, вероятно, думаете. Это бесполезно, вы можете удалить его. –

+0

@CristianCiupitu попытался использовать его без 'globalvar()', но он все равно не имеет значения, я сказал, что в конце! (Без обид), я пытался глобализовать его без него, и это не имеет никакого значения, поэтому я попытался определить его с помощью 'globalvar' и не могу потрудиться, чтобы удалить его! : P – ClownBrains

+1

Ick это страшный способ попробовать это организовать. Я бы посмотрел на некоторые другие реалии tic-tac-toac на Python и имитировал это! –

ответ

2

Вы плохо неправильно понимаете, как работает инструкция P. Вы не используете его для объявления глобальной переменной. Не нужно ничего объявлять, любое присвоение, сделанное на верхнем уровне вашего модуля, создает глобальную переменную.

Скорее вы используете его в функции, в которой вы хотите изменить переменную, определенную вне функции. Итак, переместите операторы global, которые у вас есть в вашей функции globalvar (где они ничего не полезят) в вашу функцию game. Это позволит вашему коду в game изменить глобальные переменные (и избежать исключений, которые вы получаете).

Обратите внимание, что использование глобальных переменных обычно является симптомом плохого дизайна. Это особенно актуально, когда у вас их много, как и в вашей программе. В качестве начала для лучшего дизайна я настоятельно рекомендую использовать список или другую структуру данных для хранения данных вашей платы, а не кучу отдельных переменных.

+0

СПАСИБО! Однако, как получилось, что он мог получить доступ к переменной 'turn', но не к другим из-за пределов функции' game'? – ClownBrains

+0

Вы всегда можете * получить доступ к глобальным переменным, только если вы также хотите назначить их из функции, для которой вам нужен оператор 'global'. Подробнее о переменных и их областях можно прочитать в [Учебник по Python] (https: //docs.python.org/2/tutorial/classes.html#python-scopes-and-namespaces). – Blckknght

0

Ключевое слово global используется для доступа к глобальной переменной, а не для ее объявления. Python - динамический язык, объявление переменных в любом случае не имеет большого смысла.

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

В-третьих, пожалуйста, не используйте так много, если заявления/Элиф, использовать Dict вместо этого, что было бы гораздо более вещий -

slot_options = { 
    "1": """ 
    [X] 
    """, 
    "2": """ 
     [X] 
    """ 
    ... 
} 

slots = {} 
slots[xturn] = slot_options[xturn] 

что-то на этих линиях.

В-четвертых, что со всеми этими «чертежами», представляющими положение «Х».

Я рекомендую, проверяя код некоторых текущих реализаций, а затем создавайте свои собственные. Это может дать вам несколько указателей.Вы можете проверить это: Sample tic tac toe gist

+0

СПАСИБО СМОТРЕТЬ! Тем не менее, после запуска я получаю ошибку при загрузке, говоря, что он был определен до того, как он стал глобальным .... Подождите .. нет. Все еще застрял :( – ClownBrains

+0

Umm (Комментирование вашего редактирования) Они должны быть отдельными, поэтому они может быть правильно взаимодействовать, когда X и O нажимают номера, чтобы выбрать их слот. – ClownBrains

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