无法在图形中使用方向键移动球



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

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中,我认为没有一种有效的方法可以使用箭头键来移动精灵/对象。

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

您误解了海龟键事件的工作方式,并错误地调用了它们。首先,当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()

主要问题在于:

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)

最新更新