基于Python的简易弹球游戏球不反弹问题求助
弹球游戏反弹失效问题修复
你的代码存在两个关键逻辑错误,导致反弹功能失效:
- 左右墙壁反弹逻辑错误:
Ball类的draw方法中,处理左右边界碰撞时错误反转了y轴速度,应该反转x轴速度。 - Paddle右移逻辑错误:
Paddle类的turn_right方法里,误修改了self.y属性(Paddle仅支持x方向移动),应该修改self.x。
修正后的完整代码:
from tkinter import * import random import time class Ball: def __init__(self, canvas, paddle, color): self.canvas = canvas self.paddle = paddle self.id = canvas.create_oval(10, 10, 25, 25, fill=color) self.canvas.move(self.id, 245, 100) starts = [-3, -2, -1, 1, 2, 3] self.x = random.choice(starts) self.y = -1 self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() self.hit_bottom = False def hit_paddle(self, pos): paddle_pos = self.canvas.coords(self.paddle.id) if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]: if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]: return True return False def draw(self): self.canvas.move(self.id, self.x, self.y) pos = self.canvas.coords(self.id) if pos[1] <= 0: self.y = self.y * -1 if pos[3] >= self.canvas_height: self.hit_bottom = True if self.hit_paddle(pos) == True: self.y = self.y * -1 # 修正左右墙壁反弹逻辑:反转x轴速度 if pos[0] <= 0 or pos[2] >= self.canvas_width: self.x = self.x * -1 class Paddle: def __init__(self, canvas, color): self.canvas = canvas self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) self.canvas.move(self.id, 200, 300) self.x = 0 self.canvas_width = self.canvas.winfo_width() self.canvas.bind_all('<KeyPress-Left>', self.turn_left) self.canvas.bind_all('<KeyPress-Right>', self.turn_right) def draw(self): self.canvas.move(self.id, self.x, 0) pos = self.canvas.coords(self.id) if pos[0] <= 0 or pos[2] >= self.canvas_width: self.x = 0 def turn_left(self, evt): self.x = -2 # 修正Paddle右移逻辑:修改self.x而非self.y def turn_right(self, evt): self.x = 2 tk = Tk() tk.title('Bounce Game') tk.resizable(0, 0) tk.wm_attributes('-topmost', 1) canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) canvas.pack() tk.update() paddle = Paddle(canvas, 'blue') ball = Ball(canvas, paddle, 'red' ) while True: if ball.hit_bottom == False: ball.draw() paddle.draw() tk.update_idletasks() tk.update() time.sleep(0.01) tk.mainloop()
修复后,球会正常从上下左右墙壁反弹,Paddle可正常左右移动,击中球后也能触发反弹。
内容的提问来源于stack exchange,提问作者jinxfx
相关产品推荐
相关产品推荐

