Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2021, 14:55   #1
Дмитрий78654
Новичок
Джуниор
 
Регистрация: 05.03.2021
Сообщений: 2
По умолчанию Проблема в проекте на python tkinter

Я совсем недавно стал заниматься с python и написал игру (по туториалу) ping-pong, но игра работает не корректно.

Код игры:
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=HEIG HT,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("", 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("", stop_pad)

main()
root.mainloop()
Дмитрий78654 вне форума Ответить с цитированием
Старый 05.03.2021, 20:26   #2
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Цитата:
Сообщение от Дмитрий78654 Посмотреть сообщение
но игра работает не корректно.
Как это выражается?
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 06.03.2021, 10:01   #3
Дмитрий78654
Новичок
Джуниор
 
Регистрация: 05.03.2021
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Как это выражается?
мяч не отскакивает от ракеток и других поверхностей
Дмитрий78654 вне форума Ответить с цитированием
Старый 06.03.2021, 13:45   #4
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Посмотрите статью Пин-понг на Python, код примерно как в теме. Там же есть ссылка гит с полным текстом кода, для не желающих вникать в механизм.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Python/PyQt5/PostgreSQL/Tkinter C_i_K_a_D_a Python 1 20.06.2019 20:45
Функция y=sin(x) в Python (Tkinter) klyukina2901 Python 0 18.03.2019 13:40
Калькулятор на Python. Библиотека tkinter Bob123 Python 2 29.12.2017 17:20
Python. Tkinter. Диалог выбора файлов БалаШагаЛ Python 0 16.06.2013 13:22