Как связать ключ ввода с функцией черепахой - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь сделать игру в крестики-нолики, в которой вы используете клавиши со стрелками для перемещения черепахи по доске, а когда вы нажимаете клавишу ввода, она рисует круг (ноль в коде) или крестик.

Я пытался использовать код, аналогичный тому, который я использовал для клавиш перемещения, но заменил его для клавиши ввода и клавиши C (для крестика), но они не работают и автоматически рисуют крестик при запуске. Я также пытался использовать обезьяну, но это не сработало.

import turtle

sc = turtle.Screen()
bo = turtle.Turtle()

#screen

sc.bgcolor("black")
sc.title("tic tac toe")

#board

bo.color("white")
bo.penup()
bo.speed(0)
bo.setposition(-100, -300)
bo.pendown()
bo.setposition(-100, 300)
bo.penup()
bo.setposition(100, 300)
bo.pendown()
bo.setposition(100, -300)
bo.penup()
bo.setposition(-300, 100)
bo.pendown()
bo.setposition(300, 100)
bo.penup()
bo.setposition(300, -100)
bo.pendown()
bo.setposition(-300,-100)
bo.penup()
bo.setposition(0,0)

#naught and cross function

def c()  :
    bo.pendown()
    x = bo.xcor()-80
    y = bo.ycor()+80
    bo.penup()
    bo.setposition(x,y)
    bo.pendown()
    x = bo.xcor()+160
    y = bo.ycor()-160
    bo.setposition(x,y)
    bo.penup()
    x = bo.xcor()-160
    bo.setposition(x,y)
    bo.pendown()
    x = bo.xcor()+160
    y = bo.ycor()+160
    bo.setposition(x,y)
    bo.penup()
    bo.setposition(0,0)

def n() :
    y = bo.ycor()-80
    x = bo.xcor()
    bo.setposition(x, y)
    bo.pendown()
    bo.circle(80)
    bo.penup()
    bo.setposition(0,0)

#movment
def move_left(event):
    x = bo.xcor()
    x -= 200
    if x < -300:
        x = -200
    bo.setx(x)

def move_right(event):
    x = bo.xcor()
    x += 200
    if x > 300:
        x = 200
    bo.setx(x)

def move_down(event):
    y = bo.ycor()
    y -= 200
    if y < -300:
        y = -200
    bo.sety(y)

def move_up(event):
    y = bo.ycor()
    y += 200
    if y > 300:
        y = 200
    bo.sety(y)

#Keybinding

turtle.listen()

turtle.getcanvas().bind("<Left>", move_left)
turtle.getcanvas().bind("<Right>", move_right)
turtle.getcanvas().bind("<Up>", move_up)
turtle.getcanvas().bind("<Down>", move_down)

Мне бы в конечном итоге хотелось бы иметь ее там, где, когда вы рисуете крест и нажимаете ввод, он рисует круг там, где его нет. т крест.

1 Ответ

0 голосов
/ 10 ноября 2019

Нет необходимости опускаться до Tk Canvas, чтобы настроить ключевые события:

turtle.getcanvas().bind("<Left>", move_left)

Вы можете сделать то же самое с самой черепахой:

sc.onkey(move_left, "Left")

I 'Мы переработали ваш код ниже, добавив ключевое событие для "Return", которое рисует крестики и нолики. Поскольку у вас нет базовой структуры данных для вашей игры, я настроил ее так, чтобы она просто чередовалась между двумя:

from turtle import Screen, Turtle

# naught and cross functions

def cross():
    x, y = board.position()
    board.penup()
    board.setposition(x - 80, y - 80)
    board.pendown()
    board.setposition(x + 80, y + 80)
    board.penup()
    board.setx(x - 80)
    board.pendown()
    board.setposition(x + 80, y - 80)
    board.penup()
    board.home()

def naught():
    board.sety(board.ycor() - 80)
    board.pendown()
    board.circle(80)
    board.penup()
    board.home()

first_player = True

def choose():
    global first_player

    if first_player:
        naught()
    else:
        cross()

    first_player = not first_player

# movement
def move_left():
    x = board.xcor() - 200

    if x < -300:
        x = -200

    board.setx(x)

def move_right():
    x = board.xcor() + 200

    if x > 300:
        x = 200

    board.setx(x)

def move_down():
    y = board.ycor() - 200

    if y < -300:
        y = -200

    board.sety(y)

def move_up():
    y = board.ycor() + 200

    if y > 300:
        y = 200

    board.sety(y)

# screen

screen = Screen()
screen.bgcolor("black")
screen.title("tic tac toe")

# board

board = Turtle()
board.color("white")
board.speed('fastest')

# vertical lines
board.penup()
board.setposition(-100, -300)
board.pendown()
board.sety(300)
board.penup()
board.setx(100)
board.pendown()
board.sety(-300)
board.penup()

# horizontal lines
board.setposition(-300, 100)
board.pendown()
board.setx(300)
board.penup()
board.sety(-100)
board.pendown()
board.setx(-300)
board.penup()
board.home()

# Keybinding

screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
screen.onkey(move_up, "Up")
screen.onkey(move_down, "Down")

screen.onkey(choose, "Return")

screen.listen()
screen.mainloop()

Это позволяет двум людям играть в игру и должно быть чем-то, на чем вы можете построить.

...