#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. Посмотрите на свои «решения» — вы увидите, что проверка правильности столбца отсутствует; добавьте это.