Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- import random
- # размеры экрана
- WIDTH = 900
- HEIGHT = 300
- # параметры ракеток
- PAD_W = 10
- PAD_H = 100
- PAD_SPEED = 20
- RIGHT_PAD_SPEED = 0
- LEFT_PAD_SPEED = 0
- # параметры мяча
- BALL_RADIUS = 40
- X_SPEED = 20
- Y_SPEED = 0
- # параметры мяча после отскока
- BALL_SPEED_UP = 1.00
- BALL_MAX_SPEED = 30
- BALL_X_DEFAULT_SPEED = 20
- BALL_Y_DEFAULT_SPEED = 20
- RIGHT_LINE_DISTANCE = WIDTH - PAD_W
- # переменные для подсчёта очков
- PLAYER_1_SCORE = 0
- PLAYER_2_SCORE = 0
- # просчёт скорости
- INITIAL_SPEED = 20
- root = Tk()
- root.title('Ping-pong ;)')
- # создаём поле
- c = Canvas(root, width=WIDTH, height=HEIGHT, background='#66CDAA')
- c.pack()
- c.create_line(PAD_W, 0, PAD_W, HEIGHT, fill='white')
- c.create_line(WIDTH - PAD_W, 0, WIDTH - PAD_W, HEIGHT, fill='white')
- c.create_line(WIDTH / 2, 0, WIDTH / 2, HEIGHT, fill='white')
- # создаём ракетки и мяч
- BALL = c.create_oval(WIDTH / 2 - BALL_RADIUS / 2, HEIGHT / 2 - BALL_RADIUS / 2,
- WIDTH / 2 + BALL_RADIUS / 2, HEIGHT / 2 + BALL_RADIUS / 2,
- fill='#FF4500')
- LEFT_PAD = c.create_line(PAD_W / 2, 0, PAD_W / 2, PAD_H, width=PAD_W, fill='red')
- RIGHT_PAD = c.create_line(WIDTH - PAD_W / 2, 0, WIDTH - PAD_W / 2, PAD_H, width=PAD_W, fill='black')
- # счёт
- p_1_text = c.create_text(WIDTH - WIDTH / 6, PAD_H / 4,
- text=PLAYER_1_SCORE,
- font='Arial 20',
- fill='white')
- p_2_text = c.create_text(WIDTH / 6, PAD_H / 4,
- text=PLAYER_2_SCORE,
- font='Arial 20',
- fill='white')
- # счёт
- def update_score(player):
- global PLAYER_1_SCORE, PLAYER_2_SCORE
- if player == 'right':
- PLAYER_1_SCORE += 1
- c.itemconfig(p_1_text, text=PLAYER_1_SCORE)
- else:
- PLAYER_2_SCORE += 1
- c.itemconfig(p_2_text, text=PLAYER_2_SCORE)
- # респаун мяча
- def respawn():
- global BALL_X_DEFAULT_SPEED
- c.coords(BALL, WIDTH / 2 - BALL_RADIUS / 2, HEIGHT / 2 - BALL_RADIUS / 2,
- WIDTH / 2 + BALL_RADIUS / 2, HEIGHT / 2 + BALL_RADIUS / 2)
- BALL_X_DEFAULT_SPEED = -(BALL_X_DEFAULT_SPEED * -INITIAL_SPEED) / abs(BALL_X_DEFAULT_SPEED)
- # отскок мяча от ракеток
- def bounce(action):
- global BALL_X_DEFAULT_SPEED, BALL_Y_DEFAULT_SPEED
- if action == 'strike':
- BALL_Y_DEFAULT_SPEED = random.randrange(-10, 10)
- if abs(BALL_X_DEFAULT_SPEED) < BALL_MAX_SPEED:
- BALL_X_DEFAULT_SPEED *= -BALL_SPEED_UP
- else:
- BALL_X_DEFAULT_SPEED = -BALL_SPEED_UP
- else:
- BALL_Y_DEFAULT_SPEED = -BALL_Y_DEFAULT_SPEED
- # движение мяча
- def move_ball():
- ball_left, ball_top, ball_right, ball_bottom = c.coords(BALL)
- ball_center = (ball_top + ball_bottom) / 2
- # вертикальный отскок
- if ball_right + BALL_X_DEFAULT_SPEED <= RIGHT_LINE_DISTANCE and ball_left + BALL_X_DEFAULT_SPEED > PAD_W:
- c.move(BALL, BALL_X_DEFAULT_SPEED, BALL_Y_DEFAULT_SPEED)
- elif ball_right == RIGHT_LINE_DISTANCE or ball_left == PAD_W:
- if ball_right > WIDTH / 2:
- if c.coords(RIGHT_PAD)[1] < ball_center < c.coords(RIGHT_PAD)[3]:
- bounce('strike')
- else:
- update_score('left')
- respawn()
- else:
- if c.coords(LEFT_PAD)[1] < ball_center < c.coords(LEFT_PAD)[3]:
- bounce('strike')
- else:
- update_score('right')
- respawn()
- else:
- if ball_right > WIDTH /2:
- c.move(BALL, RIGHT_LINE_DISTANCE - ball_right, BALL_Y_DEFAULT_SPEED)
- else:
- c.move(BALL, PAD_W - ball_left, BALL_Y_DEFAULT_SPEED)
- # горизонтальный отскок
- if ball_top + BALL_Y_DEFAULT_SPEED < 0 or ball_bottom + BALL_Y_DEFAULT_SPEED > HEIGHT:
- bounce('ricoshet')
- # движение ракеток
- def move_pad():
- PADS = {LEFT_PAD: LEFT_PAD_SPEED,
- RIGHT_PAD: RIGHT_PAD_SPEED}
- for pad in PADS:
- c.move(pad, 0, PADS[pad])
- if c.coords(pad)[1] < 0:
- c.move(pad, 0, -c.coords(pad)[1])
- elif c.coords(pad)[3] > HEIGHT:
- c.move(pad, 0, -c.coords(pad)[3])
- # главная функция
- def main():
- move_ball()
- move_pad()
- # рекурсия
- root.after(30, main)
- # фокус на канвас (рекакция на клавиши)
- c.focus_set()
- # обработка нажатий
- def move_event_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
- if event.keysym == 'Up':
- RIGHT_PAD_SPEED = -PAD_SPEED
- elif event.keysym == 'Down':
- RIGHT_PAD_SPEED = PAD_SPEED
- # привязка к канвас
- c.bind('<KeyPress>', move_event_handler)
- # клавиши не нажаты
- def stop_pad(event):
- global LEFT_PAD_SPEED, RIGHT_PAD_SPEED
- if event.keysym in 'ws':
- LEFT_PAD_SPEED = 0
- elif event.keysym in ('Up', 'Down'):
- RIGHT_PAD_SPEED = 0
- # привязка к канвас
- c.bind('<KeyRelease>', stop_pad)
- # запуск
- main()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement