Connect4 в Python — Фишки не попадают на доску

#python #python-3.x #connect-four

Вопрос:

Я пишу Connect4 на Python. Моя проблема в том, что функции player_one и player_two, похоже, не работают, поэтому фигура » нет » выпадает на доску после того, как игрока попросили ввести данные. Мне также интересно, верен ли мой код для возврата доски после того, как игрок упал; Я подозреваю, что мой нынешний код не возвращает доску, обновленную фигурой игрока, но, будучи новым, я не уверен, что делать.

Пожалуйста, взгляните!

 def field(field):
    for w in range(14):
        if w % 2 == 0:
            usable_w = int(w/2)
            for h in range(15):
                if h % 2 == 0:
                    usable_h = int(h/2)
                    if h != 14:
                        print(field[usable_h][usable_w], end="")
                    else:
                        print(" ")
                else:
                    print("|", end="")
        else:
            print("_"*13)


PlayField = [[" ", " ", " ", " ", " ", " ", " "],
             [" ", " ", " ", " ", " ", " ", " "],
             [" ", " ", " ", " ", " ", " ", " "],
             [" ", " ", " ", " ", " ", " ", " "],
             [" ", " ", " ", " ", " ", " ", " "],
             [" ", " ", " ", " ", " ", " ", " "],
             [" ", " ", " ", " ", " ", " ", " "]]
field(PlayField)


def player_one(field):
    MoveColumn = int(input("Enter the column 1 - 7n"))
    MoveRow = 6
    for row in PlayField:
        if MoveColumn >= 1 and MoveColumn <= 7:
            if PlayField[MoveColumn-1][MoveRow] == " ":
                    PlayField[MoveColumn-1][MoveRow] = "X"
                    break
            MoveRow -= 1
            return field(PlayField)
        else:
            print("Column outside range, please enter valid move")

def player_two(field):
    MoveColumn = int(input("Enter the column 1 - 7n"))
    MoveRow = 6
    for row in PlayField:
        if MoveColumn >= 1 and MoveColumn <= 7:
            if PlayField[MoveColumn-1][MoveRow] == " ":
                    PlayField[MoveColumn-1][MoveRow] = "O"
                    break
            MoveRow -= 1
            return field(PlayField)
        else:
            print("Column outside range, please enter valid move")

def launch_play():
    while True:
        Player = 1
        print("Player's turn", Player)
        player_one(field)
        player_two(field)

launch_play()

 

Ответ №1:

Ну, ваши player_... функции содержат подходящие операторы, но в неподходящем порядке; и поскольку они работают на глобальном PlayField уровне , возвращать их бессмысленно. Кроме того, уродливо иметь две почти идентичные функции. Перестроенный вариант, в котором единственное различие между первым и вторым игроками передается в качестве аргумента (вместо бесполезного field ), работает так, как вы ожидаете:

 def player(xo):
    while (MoveColumn := int(input("Enter the column 1 - 7n"))) < 1 or 
                                                      MoveColumn > 7:
        print("Column outside range, please enter valid move")
    MoveRow = 6
    for row in PlayField:
        if PlayField[MoveColumn-1][MoveRow] == " ":
            PlayField[MoveColumn-1][MoveRow] = xo
            field(PlayField)
            break
        MoveRow -= 1
 

В своем launch_play цикле вы теперь можете позвонить

         player('X')
        player('O')
 

Теперь вам предстоит завершить программу, проверив, когда игра закончится.

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

1. Привет, Армали, что, если я не хочу, чтобы ход игроков менялся, если они не сделают правильный ход?

2. Есть более чем один способ. Я соответствующим образом изменил функцию. Конечно, вы могли бы придумать что-то подобное.

3. Привет, большое спасибо за ваш ответ, но я пытаюсь понять, как, просто поместив переменную MoveRow в цикл while, решить все проблемы. Буду признателен, если вы объясните.

4. Я был бы готов объяснить, но я не понимаю, что вы хотели бы услышать. Если под переменной MoveRow вы подразумеваете назначение MoveRow = 6 : это не в while цикле (который повторяется до тех пор, пока не будет введен допустимый ход), а только после этого цикла. И что вы подразумеваете под всеми этими проблемами ?

5. Да, я имею в виду, что назначение MoveRow = 6 изначально было перед циклом for. Ваша модификация поместила его через некоторое время в цикл, и это решает две очень важные для меня проблемы: 1. фигуры падают на доску, 2. фигуры складываются друг на друга. Это почему?

Ответ №2:

Я придумал два решения (до того, как вы изменили коды), чтобы предотвратить изменение хода игроков, но это не сработало:

 def player(xo):
    while MoveColumn := int(input("Enter the column 1 - 7n")):
    MoveRow = 6
    for row in PlayField:
        if PlayField[MoveColumn-1][MoveRow] == " ":
            PlayField[MoveColumn-1][MoveRow] = xo
            field(PlayField)
            break
            Return True
        MoveRow -= 1
    else:
       print("Column outside range, please enter valid move")
       Return False

def launch_play():
    while True:
        Player = 'X'
        print("Player's turn", Player)
        player('X')
        Player = '0'
        print("Player's turn", Player)
        player('0')

launch_play()

 

Другое решение-ввести переменные игрока в функции игрока (также не сработало). :

  def player(xo):
    while MoveColumn := int(input("Enter the column 1 - 7n")):
    MoveRow = 6
    Player = 'X'
    for row in PlayField:
        if PlayField[MoveColumn-1][MoveRow] == " ":
            PlayField[MoveColumn-1][MoveRow] = xo
            field(PlayField)
            break
        MoveRow -= 1
        Player = '0'
    else:
       print("Column outside range, please enter valid move")
 

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

1. Посмотрите на свои «решения» — вы увидите, что проверка правильности столбца отсутствует; добавьте это.