【问题标题】:Can't move the ball with directional keys in turtle-graphics无法在海龟图形中使用方向键移动球
【发布时间】:2020-12-22 19:14:31
【问题描述】:

我应该为一个项目编写一个逃脱游戏,但我无法移动角色。这是我的代码,如果看起来不太好,请见谅,我是新手。

import turtle


def lire_matrice(fichier):
    with open(fichier) as firstf:
        lecteur = firstf.read()
        list_base = lecteur.split('\n')
        matrice = []
        for i in list_base:
            list_dans_matrice = (i.split())
            matrice.append(list_dans_matrice)
        return matrice

def calculer_pas(matrice):
    pas1 = (440//len(matrice))
    pas2 = (330//len(matrice[0]))
    if pas1 > pas2:
        pas = pas2
    else:
        pas = pas1
    return pas


def coordonne_case(case, pas):
    case_0 = (-240, 200)
    x = case_0[0] + case[1] * pas
    y = case_0[1] - case[0] * pas
    coordonne = (x, y)
    return coordonne

def coordonne_balle(case, pas):
    case_0 = (-240 + pas/2, 200 - pas/2)
    x = case_0[0] + case[1] * pas
    y = case_0[1] - case[0] * pas
    coordonne = (x, y)
    return coordonne


def tracer_carre(dimension):
    for i in range(4):
        turtle.fd(dimension)
        turtle.rt(90)


def tracer_case(case,couleur, pas):
    turtle.penup()
    turtle.goto(case[0], case[1])
    turtle.pendown()
    turtle.color(couleur)
    turtle.begin_fill()
    tracer_carre(pas)
    turtle.end_fill()
    turtle.penup()


def afficher_plan(matrice, pas):
    for ligne in range(len(matrice)):
        for index in range(len(matrice[ligne])):
            if matrice[ligne][index] == '0':
                tracer_case(coordonne_case((ligne, index), pas), 'white', pas)
                liste_all.append(coordonne_case((ligne, index), pas))

            elif matrice[ligne][index] == '1':
                tracer_case(coordonne_case((ligne, index), pas), 'grey', pas)
                liste_mur.append(coordonne_case((ligne, index), pas))
                liste_all.append(coordonne_case((ligne, index), pas))

            elif matrice[ligne][index] == '2':
                tracer_case(coordonne_case((ligne, index), pas), 'yellow', pas)
                liste_fin.append(coordonne_case((ligne, index), pas))
                liste_all.append(coordonne_case((ligne, index), pas))

            elif matrice[ligne][index] == '3':
                tracer_case(coordonne_case((ligne, index), pas), 'orange', pas)
                liste_porte.append(coordonne_case((ligne, index), pas))
                liste_all.append(coordonne_case((ligne, index), pas))

            elif matrice[ligne][index] == '4':
                tracer_case(coordonne_case((ligne, index), pas), 'green', pas)
                liste_objet.append(coordonne_case((ligne, index), pas))
                liste_all.append(coordonne_case((ligne, index), pas))

    return liste_porte, liste_fin, liste_objet, liste_mur, liste_all

"""Deplacement"""


def deplacer_gauche():
    global position
    mouve = position[0], position[1] - 1
    return mouve


def deplacer_droite():
    global position
    mouve = position[0], position[1] + 1
    return mouve


def deplacer_bas():
    global position
    mouve = position[0] + 1, position[1]
    return mouve


def deplacer_haut():
    global position
    mouve = position[0] - 1, position[1]
    return mouve
def deplacement(mouvement, turtle_used, pas):
    turtle_used.clear()
    turtle_used.goto(coordonne_balle(mouvement, pas))
    turtle_used.pendown()
    turtle_used.begin_fill()
    turtle_used.dot(10)
    turtle_used.end_fill()
    turtle_used.penup()


""" Variables
"""
position = 0, 1
liste_mur = []
liste_porte = []
liste_objet = []
liste_fin = []
liste_all = []
lp = liste_porte
lf = liste_fin
lo = liste_objet
lm = liste_mur
lall = liste_all
d_fin = {'fin': lf}
d_porte = {'porte': lp}
d_objet = {'objet': lo}
d_mur = {'mur': lm}
d_all = {'all': lall}
matrice = lire_matrice('plan_chateau.txt')
pas = calculer_pas(matrice)

""" Main code
"""
"""carte"""
turtle.tracer(0, 0)
afficher_plan(matrice, pas)
"""Deplacement"""
balle = turtle.Turtle()
balle.fillcolor('red')
balle.penup()
balle.goto(coordonne_balle((0, 1),pas))
balle.pendown()
balle.dot(10)
balle.end_fill()

turtle.listen()    # Déclenche l’écoute du clavier
turtle.onkeypress(deplacer_gauche, "Left")   # Associe à la touche Left une fonction appelée deplacer_gauche
turtle.onkeypress(deplacer_droite, "Right")
turtle.onkeypress(deplacer_haut, "Up")
turtle.onkeypress(deplacer_bas, "Down")
turtle.mainloop()
mouvement_gauche = deplacer_gauche()
mouvement_droite = deplacer_droite()
mouvement_bas = deplacer_bas()
mouvement_haut = deplacer_haut()
while True:
    if position != mouvement_haut:
        deplacement(mouvement_haut, balle, pas)
        position = mouvement_haut
    elif position != mouvement_bas:
        deplacement(mouvement_bas, balle, pas)
        position = mouvement_bas
    elif position != mouvement_droite:
        deplacement(mouvement_droite, balle, pas)
        position = mouvement_droite
    elif position != mouvement_gauche:
        deplacement(mouvement_gauche, balle, pas)
        position = mouvement_gauche

我得到的错误是:

Traceback (most recent call last):
  File , line 172, in <module>
    deplacement(mouvement_haut, balle, pas)
  File , line 112, in deplacement
    turtle_used.clear()
  File , line 2643, in clear
    self._clear()
  File , line 2621, in _clear
    self.screen._delete(item)
  File , line 558, in _delete
    self.cv.delete(item)
  File "<string>", line 1, in delete
  File  line 2820, in delete
    self.tk.call((self._w, 'delete') + args)
_tkinter.TclError: invalid command name ".!canvas"

【问题讨论】:

    标签: python python-3.x turtle-graphics python-turtle


    【解决方案1】:

    在 python 中,我不相信有一种有效的方法可以使用箭头键来移动精灵/对象。

    如果您知道如何设置键,我建议您使用 w、a、s 和 d 来移动它。如果使用箭头键是某个类或其他东西的某种要求,我要么等待更高级的 Python 程序员回答,要么只是在线查找。

    【讨论】:

    • 从turtle的角度来看,方向键和其他键是一样的。
    【解决方案2】:

    您误解了海龟键事件的工作原理,并错误地调用了它们。首先,mainloop() 后面不应该有任何东西,因为它会将控制权交给 tkinter 事件处理程序,并且在整个海龟世界被拆除之前,它后面的任何代码都不会被执行。

    其次,事件处理程序不返回任何东西。他们可以事情,但他们不会返回结果。

    由于您的“plan_chateau.txt”文件不包括在内,并且没有太多关于您的代码功能的描述,以下是我对您的程序应该如何操作的最佳猜测,包括上面未提及的更改:

    from turtle import Screen, Turtle
    
    CURSOR_SIZE = 20
    
    def read_matrix(filename):
        matrix = []
    
        with open(filename) as file:
            player = file.read()
            list_base = player.split('\n')
    
            for i in list_base:
                list_in_matrix = i.split()
                matrix.append(list_in_matrix)
    
        return matrix
    
    def calculate_scale(matrix):
        scale1 = 440 // len(matrix)
        scale2 = 330 // len(matrix[0])
    
        return scale2 if scale1 > scale2 else scale1
    
    def coordinates_box(box, scale):
        box_0 = (-240, 200)
        x = box_0[0] + box[1] * scale
        y = box_0[1] - box[0] * scale
    
        return (x, y)
    
    def coordinates_ball(box, scale):
        box_0 = (-240 + scale/2, 200 - scale/2)
        x = box_0[0] + box[1] * scale
        y = box_0[1] - box[0] * scale
    
        return (x, y)
    
    def draw_square(dimension):
        for _ in range(4):
            turtle.forward(dimension)
            turtle.right(90)
    
    def draw_box(box, color, scale):
        turtle.penup()
        turtle.goto(box)
        turtle.pendown()
        turtle.color(color)
        turtle.begin_fill()
        draw_square(scale)
        turtle.end_fill()
        turtle.penup()
    
    def view_plan(matrix, scale):
        for line in range(len(matrix)):
            for index in range(len(matrix[line])):
                if matrix[line][index] == '0':
                    draw_box(coordinates_box((line, index), scale), 'white', scale)
                    all_list.append(coordinates_box((line, index), scale))
                elif matrix[line][index] == '1':
                    draw_box(coordinates_box((line, index), scale), 'grey', scale)
                    wall_list.append(coordinates_box((line, index), scale))
                    all_list.append(coordinates_box((line, index), scale))
                elif matrix[line][index] == '2':
                    draw_box(coordinates_box((line, index), scale), 'yellow', scale)
                    exit_list.append(coordinates_box((line, index), scale))
                    all_list.append(coordinates_box((line, index), scale))
                elif matrix[line][index] == '3':
                    draw_box(coordinates_box((line, index), scale), 'orange', scale)
                    door_list.append(coordinates_box((line, index), scale))
                    all_list.append(coordinates_box((line, index), scale))
                elif matrix[line][index] == '4':
                    draw_box(coordinates_box((line, index), scale), 'green', scale)
                    object_list.append(coordinates_box((line, index), scale))
                    all_list.append(coordinates_box((line, index), scale))
    
    ### Displacement
    
    position = [0, 1]
    
    def move_left():
        global position
    
        movement_left = position[0], position[1] - 1
        displacement(movement_left, ball, scale)
        position = movement_left
    
    def move_right():
        global position
    
        movement_right = position[0], position[1] + 1
        displacement(movement_right, ball, scale)
        position = movement_right
    
    def move_down():
        global position
    
        movement_down = position[0] + 1, position[1]
        displacement(movement_down, ball, scale)
        position = movement_down
    
    def move_up():
        global position
    
        movement_up = position[0] - 1, position[1]
        displacement(movement_up, ball, scale)
        position = movement_up
    
    def displacement(movement, turtle_used, scale):
        turtle_used.goto(coordinates_ball(movement, scale))
    
    ### Variables
    
    wall_list = []
    door_list = []
    object_list = []
    exit_list = []
    all_list = []
    
    matrix = read_matrix('plan_chateau.txt')
    scale = calculate_scale(matrix)
    
    ### Main code
    
    screen = Screen()
    
    turtle = Turtle()
    turtle.hideturtle()
    
    # map
    view_plan(matrix, scale)
    
    # Displacement
    ball = Turtle()
    ball.shape('circle')
    ball.shapesize(10 / CURSOR_SIZE)
    ball.fillcolor('red')
    ball.penup()
    ball.goto(coordinates_ball((0, 1), scale))
    
    # Associe à la touche Left une fonction appelée move_left
    screen.onkeypress(move_left, 'Left')
    screen.onkeypress(move_right, 'Right')
    screen.onkeypress(move_up, 'Up')
    screen.onkeypress(move_down, 'Down')
    screen.listen()  # Déclenche l’écoute du clavier
    
    screen.mainloop()
    

    【讨论】:

      【解决方案3】:

      主要问题在这里:

      def deplacer_gauche():
          global position
          mouve = position[0], position[1] - 1
          return mouve
      
      
      def deplacer_droite():
          global position
          mouve = position[0], position[1] + 1
          return mouve
      
      
      def deplacer_bas():
          global position
          mouve = position[0] + 1, position[1]
          return mouve
      
      
      def deplacer_haut():
          global position
          mouve = position[0] - 1, position[1]
          return mouve
      

      这里:

      turtle.onkeypress(deplacer_gauche, "Left")
      turtle.onkeypress(deplacer_droite, "Right")
      turtle.onkeypress(deplacer_haut, "Up")
      turtle.onkeypress(deplacer_bas, "Down")
      

      您的函数每个都返回一个值,但是当您调用 turtle.onkeypress 中的函数时,这些值不会分配给任何变量,因此函数不会做任何事情。

      试试类似的东西

      def deplacer_gauche():
          gballe.setx(balle.xcor() - 1)
      
      
      def deplacer_droite():
          gballe.setx(balle.xcor() + 1)
      
      
      def deplacer_bas():
          gballe.setx(balle.ycor() - 1)
      
      
      def deplacer_haut():
          gballe.setx(balle.ycor() + 1)
      

      【讨论】:

        猜你喜欢
        • 2018-05-30
        • 2018-09-04
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2019-11-14
        • 1970-01-01
        相关资源
        最近更新 更多