Форум сайта python.su
Привет. Начал изучать python и появилось желание написать игру, пишу по гайду, но с небольшими изменениям, но столкнулся с проблемой - отскок мяча от ракетки. Не могу понять где ошибка и почему он не меняет свою скорость на противоположную и не двигается в обратную сторону.
Привожу код:
from tkinter import * WIDTH = 900 #ширина HEIGHT = 300 #высота # по горизонтали BALL_X_CHANGE = 20 # по вертикали BALL_Y_CHANGE = 0 PAD_SPEED = 15 #скорость движения ракетки LEFT_PAD_SPEED = 0 #скорость левой ракетки RIGHT_PAD_SPEED = 0 #скорость правой ракетки INITIAL_SPEED = 20 BALL_MAX_SPEED = 40 # Начальная скорость по горизонтали BALL_X_SPEED = INITIAL_SPEED # Начальная скорость по вертикали BALL_Y_SPEED = 0 # Добавим глобальную переменную отвечающую за расстояние right_line_distance = WIDTH-30 # до правого края игрового поля root = Tk() c = Canvas(root,width=WIDTH,height=HEIGHT,background="#003300") #игровая область c.pack() c.create_line(WIDTH/2,0,WIDTH/2,HEIGHT,fill="white") #центральная линия c.create_line(30,0,30,HEIGHT,fill="white") #левая линия c.create_line(WIDTH-30,0,WIDTH-30,HEIGHT,fill="white") #правая линия BALL = c.create_oval(WIDTH/2-15,HEIGHT/2-15,WIDTH/2+15,HEIGHT/2+15,fill="white") #создаем мяч LEFT_PAD = c.create_line(15,0,15,100,width=30,fill="blue") #создаем левую ракетку RIGHT_PAD = c.create_line(WIDTH-15,0,WIDTH-15,100,width=30,fill="blue") #создаем правую ракетку def move_ball(): #функция движения мяча ball_left, ball_top, ball_right, ball_bot = c.coords(BALL) #получил координаты мяча ball_center = (ball_top + ball_bot) / 2 #нашел координату центра мяча if ball_right < right_line_distance and ball_left > 30: #проверяем не достиг ли шмяч границ поля, если нет то просто двигаем c.move(BALL, BALL_X_SPEED, BALL_Y_SPEED) elif ball_right == right_line_distance or ball_left == 30: #если шар достигает границ левого или правого полей то if ball_right > WIDTH/2: #проверяем находится ли он на правой стороне if c.coords(LEFT_PAD)[1] < ball_center < c.coords(LEFT_PAD)[3]: #проверяем находится ли мяч в пределах правой ракетки c.move(BALL,-BALL_X_SPEED,BALL_Y_SPEED) #то меняем скорость на противоположную def move_pads(): #функция движения ракеток c.move(LEFT_PAD, 0, LEFT_PAD_SPEED) if c.coords(LEFT_PAD)[1] < 0: c.move(LEFT_PAD, 0, -c.coords(LEFT_PAD)[1]) elif c.coords(LEFT_PAD)[3] > HEIGHT: c.move(LEFT_PAD, 0, HEIGHT-c.coords(LEFT_PAD)[3]) c.move(RIGHT_PAD, 0, RIGHT_PAD_SPEED) if c.coords(RIGHT_PAD)[1] < 0: c.move(RIGHT_PAD, 0, -c.coords(RIGHT_PAD)[1]) elif c.coords(RIGHT_PAD)[3] > HEIGHT: c.move(RIGHT_PAD, 0, HEIGHT-c.coords(RIGHT_PAD)[3]) def main(): move_ball() move_pads() root.after(30, main) c.focus_set() def movement_handler(event): #функция считывания нажатий клавиш global LEFT_PAD_SPEED,RIGHT_PAD_SPEED if event.keysym == 'w': LEFT_PAD_SPEED = -PAD_SPEED elif event.keysym == 's': LEFT_PAD_SPEED = PAD_SPEED elif event.keysym == 'Up': RIGHT_PAD_SPEED = -PAD_SPEED elif event.keysym == 'Down': RIGHT_PAD_SPEED = PAD_SPEED c.bind("<KeyPress>", movement_handler) def stop_pad(event): #функция считывания отпускания клавиш global RIGHT_PAD_SPEED,LEFT_PAD_SPEED if event.keysym == 'w': LEFT_PAD_SPEED = 0 elif event.keysym == 's': LEFT_PAD_SPEED = 0 elif event.keysym == 'Up': RIGHT_PAD_SPEED = 0 elif event.keysym == 'Down': RIGHT_PAD_SPEED = 0 c.bind("<KeyRelease>", stop_pad) main() root.mainloop()
Офлайн