проблема с Tic-Tac-Toe игрок в питоне - PullRequest
0 голосов
/ 06 июля 2019

Я пишу программу для крестики-нолики в качестве задания для класса, который я посещаю.В данный момент я пытаюсь создать игру в крестики-нолики с использованием черепахи в пичарме.Мое намерение состоит в том, чтобы у меня была игра, в которой я запускаю программу, и она начинается со случайного выбора игрока для запуска, а затем показывает черепаху выбранного игрока. Как только этот игрок начинает, они могут использовать клавиши со стрелками для перемещения черепахи вокругдоска, и нажмите пробел, чтобы нарисовать X или O, а затем он автоматически заканчивает свой ход и начинает следующий ход игроков.Это должно продолжаться до тех пор, пока один или другой не получат 3 подряд, в которых будет объявлен победитель.До сих пор я создал доску 3x3 в черепахе, сделал черепаху игрока и дал ей возможность двигаться в центр любого из 9 квадратов, а затем в пространстве он рисует x или o.

Моя проблема начинается с переключения игрока, я собираюсь создать цикл for, который будет выполняться 5 раз (это даст 10 ходов и будет только 9 пробелов), и в рамках цикла for я хотел иметь два цикла while (по одному для каждогоигрок).Я определил черепах игрока, так что мне нужно только вызвать player_1 в цикле while, и он создает черепаху, которой можно управлять в моей программе.Затем я планировал установить циклы while на переменную true или false, и всякий раз, когда нажимали пробел, чтобы поставить отметку игроков на доске, переменная изменялась так, чтобы цикл while заканчивался и переходил к следующему игроку.Но вскоре я обнаружил, что проблема с этим методом заключается в том, что моя черепаха игрока бесконечно воссоздается, когда команда while повторяется, поэтому, когда игрок пытается переместить фигуру, вскоре после этого он возвращается в исходное состояние.

Я вижу, что должно произойти, мне нужно найти способ удержать оператор while, пока он ждет, пока игрок примет решение, но я не знаю, какая команда это сделает,Кто-нибудь знает, как я мог бы сказать программе, чтобы она подождала выполнения оператора while, пока в черепахе не будет сделан выбор?

import turtle


Window = turtle.Screen()
Window.bgcolor()
Window.title("Tic Tac Toe")

# Drawing the Board
def border():
    border_outer = turtle.Turtle()
    border_outer.speed(0)
    border_outer.penup()
    border_outer.setposition(-375, -375)
    border_outer.pendown()
    border_outer.pensize(3)
    for num in range(4):
        border_outer.forward(750)
        border_outer.left(90)
        border_outer.hideturtle()

        # inside border
        border_inner1 = turtle.Turtle()
        # border_inner1.color("red")
        border_inner1.speed(0)
        border_inner1.penup()
        border_inner1.setposition(-125, 375)
        border_inner1.pendown()
        border_inner1.pensize(3)
        border_inner1.right(90)
        border_inner1.forward(750)
        border_inner1.left(90)
        border_inner1.forward(250)
        border_inner1.left(90)
        border_inner1.forward(750)
        border_inner1.hideturtle()

        border_inner2 = turtle.Turtle()
        # border_inner2.color("red")
        border_inner2.speed(0)
        border_inner2.penup()
        border_inner2.setposition(-375, 125)
        border_inner2.pendown()
        border_inner2.pensize(3)
        border_inner2.forward(750)
        border_inner2.right(90)
        border_inner2.forward(250)
        border_inner2.right(90)
        border_inner2.forward(750)
        border_inner2.hideturtle()

# Player 1 Turtle
def player_1():
    # Player 1
    global player
    player = turtle.Turtle()
    player.shape("circle")
    player.penup()
    player.color("blue")
    player.speed()

playerspeed = 250

# Moving the player #1
def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -375:
        x = -250
        player.setx(x)

def move_right():
    x = player.xcor()
    x += playerspeed
    if x > 375:
        x = 250
        player.setx(x)

def move_down():
    y = player.ycor()
    y -= playerspeed
    if y < -375:
        y = -250
        player.sety(y)

def move_up():
    y = player.ycor()
    y += playerspeed
    if y > 375:
        y = 250
        player.sety(y)

def set_position():
    x = player.xcor()
    y = player.ycor()
    player.goto(x, y - 50)
    player.pendown()
    player.pensize(10)
    player.circle(50, None, None)
    player.penup()
    player.goto(x, y)
    global flag
    flag = False


# Keyboard Bindings for player 1
turtle.listen()
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
turtle.onkey(move_up, "Up")
turtle.onkey(move_down, "Down")
turtle.onkey(set_position, "space")

flag = 'false'

border()

while flag == True:
    player_1


turtle.mainloop()

1 Ответ

0 голосов
/ 06 июля 2019

Я создаю игроков только один раз и присваиваю переменные p1, p2.

Позже я назначаю p1 или p2 переменной player и использую ее в качестве текущего игрока.

Я не использую while цикл, потому что я считаю ход (изменения игрока) внутри set_positon(). Я также меняю игрока внутри set_positon().

Он не проверяет 3 в строке / столбце, но он должен делать это также в set_positon()

import turtle

window = turtle.Screen()
window.bgcolor()
window.title("Tic Tac Toe")

# Drawing the Board
def draw_border():
    t = turtle.Turtle()
    t.speed(0)
    t.pensize(3)

    t.penup()
    t.home()   
    t.setposition(-375, -375)
    t.pendown()

    for num in range(4):
        t.forward(750)
        t.left(90)
        t.hideturtle()

    t.penup()
    t.home()   
    t.setposition(-125, 375)
    t.pendown()

    t.right(90)
    t.forward(750)
    t.left(90)
    t.forward(250)
    t.left(90)
    t.forward(750)
    t.hideturtle()

    t.penup()
    t.home()   
    t.setposition(-375, 125)
    t.pendown()

    t.forward(750)
    t.right(90)
    t.forward(250)
    t.right(90)
    t.forward(750)
    t.hideturtle()

def create_player(color):
    p = turtle.Turtle()

    p.shape("circle")
    p.penup()
    p.color(color)
    p.speed()
    p.hideturtle()

    return p

# Moving the player

def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -375:
        x = -250
    player.setx(x)

def move_right():
    x = player.xcor()
    x += playerspeed
    if x > 375:
        x = 250
    player.setx(x)

def move_down():
    y = player.ycor()
    y -= playerspeed
    if y < -375:
        y = -250
    player.sety(y)

def move_up():
    y = player.ycor()
    y += playerspeed
    if y > 375:
        y = 250
    player.sety(y)

def set_position():
    global player
    global count_changes

    x = player.xcor()
    y = player.ycor()

    if (x,y) in occupied_places:
        print("Can't put here")
        return

    occupied_places.append( (x,y) )

    #TODO: check board if place is empty (using list with occupied places)        
    player.goto(x, y - 50)
    player.pendown()
    player.pensize(10)
    player.circle(50, None, None)
    player.penup()
    player.goto(x, y)

    #TODO: check board if player win (using list with occupied places)

    # change player
    if player == p1:
        player.hideturtle()
        player = p2
        player.showturtle()
    else:
        player.hideturtle()
        player = p1
        player.showturtle()

    # count changes
    count_changes += 1
    if count_changes >= 9:
        print("END")
        #exit()

# Keyboard Bindings for active player 
turtle.listen()
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
turtle.onkey(move_up, "Up")
turtle.onkey(move_down, "Down")
turtle.onkey(set_position, "space")

draw_border()

# create players
p1 = create_player('blue')
p2 = create_player('red')
playerspeed = 250

# select first player
player = p1
player.showturtle()

occupied_places = []

# count how many times player was changed
count_changes = 0

turtle.mainloop()
...