Lisa Hasler Waters wrote: > My students and I are creating a maze game in tkinter. We are trying to > make the ball disappear when it hits the wall (black lines). We are not > having much luck. The following code has run the best, but still, the ball > does not disappear. Any advice would be appreciated!
You need to consider not just the ball, but the whole trajectory. When you can only move up/down/left/right that is roughly the rectangle spread by the starting and the end position of the ball. I calculate that rectangle as (x0,y0)-(x1,y1) in the checked_move() method below. I recommend that you use pen and paper, draw two rectangular "balls" on a horizontal or vertical line and the rectangle between them to try it yourself before you take a look. I then use that rectangle to find overlapping canvas items. Of course the ball will always overlap with itself, so I have to make sure to rule that out. While dabbling with the code I have also cleaned it up a bit -- but you should still recognize it ;) from tkinter import * import random import time class Ball: def __init__(self, canvas, color): self.canvas = canvas self.id = canvas.create_oval( 15, 15, 30, 30, fill='Blue') def checked_move(self, dx, dy): """Move unless we would hit a wall""" x0, y0, x1, y1 = self.canvas.coords(self.id) if dx > 0: x1 += dx else: x0 += dx if dy > 0: y1 += dy else: y0 += dy for id in self.canvas.find_overlapping(x0, y0, x1, y1): if id != self.id: # we will hit something other than ourselves # jump back to the start instead of # deleting ourselves self.canvas.coords(self.id, 15, 15, 30, 30) # uncomment line below if you insist on deletion # self.canvas.delete(self.id) return self.canvas.move(self.id, dx, dy) def mt(event): STEP = 15 if event.keysym == 'Left': ball.checked_move(-STEP, 0) elif event.keysym == 'Up': ball.checked_move(0, -STEP) elif event.keysym == 'Down': ball.checked_move(0, STEP) elif event.keysym == 'Right': ball.checked_move(STEP, 0) WALLS = [ (0, 0, 0, 300, 20), (0, 300, 300, 300, 10), (80, 240, 80, 0, 10), (160, 300, 160, 60, 10), (240, 240, 240, 0, 10), (300, 300, 300, 150, 10), (300, 150, 600, 150, 10), (80, 0, 2000, 0, 30), (300, 75, 600, 75, 10), (760, 0, 760, 300, 10), (600, 75, 680, 75, 10), ] def main(): global ball # needed for mt() tk = Tk() tk.title("Game") tk.resizable(0, 0) tk.wm_attributes("-topmost", 1) canvas = Canvas(tk, width=1400, height=835, bd=0, highlightthickness=0) canvas.pack() ball = Ball(canvas, 'blue') canvas.bind_all('<KeyPress-Up>', mt) canvas.bind_all('<KeyPress-Down>', mt) canvas.bind_all('<KeyPress-Left>', mt) canvas.bind_all('<KeyPress-Right>', mt) for wall in WALLS: coords = wall[:4] width = wall[4] canvas.create_line(*coords, width=width, tags="wall") tk.mainloop() if __name__ == "__main__": main() _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor