Почему это логическое значение неверно, даже если условия соблюдены? - PullRequest
0 голосов
/ 06 августа 2020
print("Tic Tac Toe created by Pher")
row_a = ["□","□","□"]
row_b = ["□","□","□"]
row_c = ["□","□","□"]

def ResetGame():
    row_a = ["□","□","□"]
    row_b = ["□","□","□"]
    row_c = ["□","□","□"]

def DrawBoard():
    print()
    print("  0 1 2")
    print("A "+row_a[0]+" "+row_a[1]+" "+row_a[2])
    print("B "+row_b[0]+" "+row_b[1]+" "+row_b[2])
    print("C "+row_c[0]+" "+row_c[1]+" "+row_c[2])

def VictoryCheck():
    #checking for x wins
    #hortizontal checks
    if row_a[0] == row_a[1] == row_a[2] == "x":
        x_Victory = True
    if row_b[0] == row_b[1] == row_b[2] == "x":
        x_Victory = True
    if row_c[0] == row_c[1] == row_c[2] == "x":
        x_Victory = True
    #vertical checks
    if row_a[0] == row_b[0] == row_c[0] == "x":
        x_Victory = True
    if row_a[1] == row_b[1] == row_c[1] == "x":
        x_Victory = True
    if row_a[2] == row_b[2] == row_c[2] == "x":
        x_Victory = True
    #diagonal checks
    if row_a[0] == row_b[1] == row_c[2] == "x":
        x_Victory = True
    if row_a[2] == row_b[1] == row_c[0] == "x":
        x_Victory = True
    else:
        x_Victory = False
   
    
    #checking for o wins
    #hortizontal checks
    if row_a[0] == row_a[1] == row_a[2] == "o":
        o_Victory = True
    if row_b[0] == row_b[1] == row_b[2] == "o":
        o_Victory = True
    if row_c[0] == row_c[1] == row_c[2] == "o":
        o_Victory = True
    #vertical checks
    if row_a[0] == row_b[0] == row_c[0] == "o":
        o_Victory = True
    if row_a[1] == row_b[1] == row_c[1] == "o":
        o_Victory = True
    if row_a[2] == row_b[2] == row_c[2] == "o":
        o_Victory = True
    #diagonal checks
    if row_a[0] == row_b[1] == row_c[2] == "o":
        o_Victory = True
    if row_a[2] == row_b[1] == row_c[0] == "o":
        o_Victory = True
    else:
        o_Victory = False
    

def x_turn():
    print()
    x_input = input("X PLAYS: ")
    x_input = x_input.upper()
    x_row = str(x_input[0])
    x_col = int(x_input[1])

    if x_row == "A":
        row_a[x_col] = str("x")
        DrawBoard()
    if x_row == "B":
        row_b[x_col] = str("x")
        DrawBoard()
    if x_row == "C":
        row_c[x_col] = str("x")
        DrawBoard()

def o_turn():
    print()
    o_input = input("O PLAYS: ")
    o_input = o_input.upper()
    o_row = str(o_input[0])
    o_col = int(o_input[1])

    if o_row == "A":
        row_a[o_col] = str("o")
        DrawBoard()
    if o_row == "B":
        row_b[o_col] = str("o")
        DrawBoard()
    if o_row == "C":
        row_c[o_col] = str("o")
        DrawBoard()

ResetGame()
DrawBoard()

x_Victory = False
o_Victory = False
 

for x in range(1,10):
    VictoryCheck()
    if x_Victory == True:
        print("X HAS WON")
    if o_Victory == True:
        print("X HAS WON")
    if x % 2 == 0:
        o_turn()
        VictoryCheck()  
    if not x % 2 == 0:
        x_turn()
        VictoryCheck()

Я новичок в python, поэтому не судите о неряшливом коде / терминологии. Вызывается функция VictoryCheck, и критерии удовлетворяются для того, чтобы логическая переменная x_Victory стала истинной, но

if x_Victory == True:
        print("X HAS WON")

не запускает программу типа сидит там Кто-нибудь знает, в чем проблема, возможно, я готов при необходимости предоставьте дополнительную информацию

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

В вашем журнале программирования c вам необходимо сделать x_Victory global:

def VictoryCheck():
    global x_Victory
    # ^^^

    #checking for x wins
    #hortizontal checks
    ...

В противном случае x_Victory существует только в пределах VictoryCheck() (затенено), а ваш глобальный переменная остается нетронутой. Однако глобальные переменные имеют тенденцию «загрязнять» ваше пространство имен. Лучше вернуть переменные или использовать класс.

0 голосов
/ 06 августа 2020

Две вещи:

1- Вам нужно установить x_Victory и o_Victory как глобальные переменные.

2- Когда вы используете условные выражения и проверяете несколько возможных экземпляров, вам нужно вместо этого использовать elif нескольких if или удалите условие else. Когда вы выполняете диагональные проверки:

    if row_a[0] == row_b[1] == row_c[2] == "x":
        x_Victory = True
    if row_a[2] == row_b[1] == row_c[0] == "x":
        x_Victory = True
    else:
        x_Victory = False

Это еще не учитывает, что произойдет, если ни один из вышеперечисленных случаев не сработает, а только если последнее условие (A2, B1 и C0) окажется X, поэтому, если он не считается True, он переопределит все другие возможности того, что он был ранее True.

Самый чистый способ - удалить строку else. То же правило применяется к o_Victory.

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