Déplacer une bille à l'intérieur Tkinter Toile Widget (simple jeu Arkanoid)

Je suis en train d'écrire une simple Arkanoid avec l'aide de Python et Tkinter. L'objectif est de rendre le ballon réfléchir à partir du haut, les côtés droit et gauche. Et si le joueur rate la balle de sorte qu'il touche le bas côté, le jeu s'arrête.

Voici le code:

from Tkinter import *
import time
root = Tk()
canv = Canvas(root, highlightthickness=0)
canv.pack(fill='both', expand=True)
top = canv.create_line(0, 0, 640, 0, fill='green', tags=('top'))
left = canv.create_line(0, 0, 0, 480, fill='green', tags=('left'))
right = canv.create_line(639, 0, 639, 480, fill='green', tags=('right'))
bottom = canv.create_line(0, 478, 640, 478, fill='red', tags=('bottom'))
rect = canv.create_rectangle(270, 468, 365, 478, outline='black', fill='gray40', tags=('rect'))
ball = canv.create_oval(0, 20, 20, 40, outline='black', fill='gray40', tags=('ball'))
delta_x = delta_y = 3
new_x, new_y = delta_x, -delta_y
while True:
time.sleep(0.025)
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 1:
new_x, new_y = delta_x, -delta_y
canv.move(ball, new_x, new_y)
print 'fitst if', new_x, new_y
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 2:
new_x, new_y = delta_x, delta_y
canv.move(ball, new_x, new_y)
print '2nd if', new_x, new_y
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 3:
new_x, new_y = -delta_x, delta_y
canv.move(ball, new_x, new_y)
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 4:
new_x, new_y = delta_x, -delta_y
canv.move(ball, new_x, new_y)
print new_x, new_y
canv.move(ball, new_y, new_y)
canv.update()
def move_right(event):
canv.move(rect, 7, 0)
pass
def move_left(event):
canv.move(rect, -7, 0)
pass
root.bind('<Right>', move_right)
root.bind('<Left>', move_left)
root.geometry('%sx%s+%s+%s' %(640, 480, 100, 100))
root.resizable(0, 0)
root.mainloop()

Pourquoi le ballon qui se reflète dans le mauvais sens?

Déplacer une bille à l'intérieur Tkinter Toile Widget (simple jeu Arkanoid)

Ne pas "réfléchir" impliquent le mouvement? Vous devez déplacer la balle autour de lui d'abord, la mise à jour de sa position périodiquement, en fonction de la vitesse. Après que vous obtenez la balle en mouvement, lors de sa boîte englobante coupe le rectangle, inverser le signe de la vitesse (par exemple, x vitesse de +5 à -5) selon le côté de l'intersection s'est produite. Aussi, si ce n'est un devoir à la maison, s'il vous plaît ajouter les "devoirs" de la balise.
Vous devriez vraiment éviter d'utiliser while True et time.sleep. Aucun de ces travaux, avec une boucle d'événements. Utiliser le code que je vous ai montré où vous mettez à jour l'écran à l'aide after.
votre code ne s'exécute pas. À tous. Il a l'indentation des erreurs, et les références au "soi" qui n'est jamais mis n'importe où.
j'ai juste corrigé le code. il devrait fonctionner maintenant.

OriginalL'auteur SaulTigh | 2011-11-02