Advertisement
Guest User

ping-pong

a guest
Jan 17th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.42 KB | None | 0 0
  1. from tkinter import *
  2. import random
  3.  
  4. # размеры экрана
  5. WIDTH = 900
  6. HEIGHT = 300
  7.  
  8. # параметры ракеток
  9. PAD_W = 10
  10. PAD_H = 100
  11. PAD_SPEED = 20
  12. RIGHT_PAD_SPEED = 0
  13. LEFT_PAD_SPEED = 0
  14.  
  15. # параметры мяча
  16. BALL_RADIUS = 40
  17. X_SPEED = 20
  18. Y_SPEED = 0
  19.  
  20. # параметры мяча после отскока
  21. BALL_SPEED_UP = 1.00
  22. BALL_MAX_SPEED = 30
  23. BALL_X_DEFAULT_SPEED = 20
  24. BALL_Y_DEFAULT_SPEED = 20
  25. RIGHT_LINE_DISTANCE = WIDTH - PAD_W
  26.  
  27. # переменные для подсчёта очков
  28. PLAYER_1_SCORE = 0
  29. PLAYER_2_SCORE = 0
  30.  
  31. # просчёт скорости
  32. INITIAL_SPEED = 20
  33.  
  34. root = Tk()
  35. root.title('Ping-pong ;)')
  36.  
  37. # создаём поле
  38. c = Canvas(root, width=WIDTH, height=HEIGHT, background='#66CDAA')
  39. c.pack()
  40. c.create_line(PAD_W, 0, PAD_W, HEIGHT, fill='white')
  41. c.create_line(WIDTH - PAD_W, 0, WIDTH - PAD_W, HEIGHT, fill='white')
  42. c.create_line(WIDTH / 2, 0, WIDTH / 2, HEIGHT, fill='white')
  43.  
  44. # создаём ракетки и мяч
  45. BALL = c.create_oval(WIDTH / 2 - BALL_RADIUS / 2, HEIGHT / 2 - BALL_RADIUS / 2,
  46. WIDTH / 2 + BALL_RADIUS / 2, HEIGHT / 2 + BALL_RADIUS / 2,
  47. fill='#FF4500')
  48. LEFT_PAD = c.create_line(PAD_W / 2, 0, PAD_W / 2, PAD_H, width=PAD_W, fill='red')
  49. RIGHT_PAD = c.create_line(WIDTH - PAD_W / 2, 0, WIDTH - PAD_W / 2, PAD_H, width=PAD_W, fill='black')
  50.  
  51. # счёт
  52. p_1_text = c.create_text(WIDTH - WIDTH / 6, PAD_H / 4,
  53. text=PLAYER_1_SCORE,
  54. font='Arial 20',
  55. fill='white')
  56. p_2_text = c.create_text(WIDTH / 6, PAD_H / 4,
  57. text=PLAYER_2_SCORE,
  58. font='Arial 20',
  59. fill='white')
  60.  
  61.  
  62. # счёт
  63. def update_score(player):
  64. global PLAYER_1_SCORE, PLAYER_2_SCORE
  65. if player == 'right':
  66. PLAYER_1_SCORE += 1
  67. c.itemconfig(p_1_text, text=PLAYER_1_SCORE)
  68. else:
  69. PLAYER_2_SCORE += 1
  70. c.itemconfig(p_2_text, text=PLAYER_2_SCORE)
  71.  
  72.  
  73. # респаун мяча
  74. def respawn():
  75. global BALL_X_DEFAULT_SPEED
  76. c.coords(BALL, WIDTH / 2 - BALL_RADIUS / 2, HEIGHT / 2 - BALL_RADIUS / 2,
  77. WIDTH / 2 + BALL_RADIUS / 2, HEIGHT / 2 + BALL_RADIUS / 2)
  78. BALL_X_DEFAULT_SPEED = -(BALL_X_DEFAULT_SPEED * -INITIAL_SPEED) / abs(BALL_X_DEFAULT_SPEED)
  79.  
  80.  
  81. # отскок мяча от ракеток
  82. def bounce(action):
  83. global BALL_X_DEFAULT_SPEED, BALL_Y_DEFAULT_SPEED
  84. if action == 'strike':
  85. BALL_Y_DEFAULT_SPEED = random.randrange(-10, 10)
  86. if abs(BALL_X_DEFAULT_SPEED) < BALL_MAX_SPEED:
  87. BALL_X_DEFAULT_SPEED *= -BALL_SPEED_UP
  88. else:
  89. BALL_X_DEFAULT_SPEED = -BALL_SPEED_UP
  90. else:
  91. BALL_Y_DEFAULT_SPEED = -BALL_Y_DEFAULT_SPEED
  92.  
  93.  
  94. # движение мяча
  95. def move_ball():
  96. ball_left, ball_top, ball_right, ball_bottom = c.coords(BALL)
  97. ball_center = (ball_top + ball_bottom) / 2
  98. # вертикальный отскок
  99. if ball_right + BALL_X_DEFAULT_SPEED <= RIGHT_LINE_DISTANCE and ball_left + BALL_X_DEFAULT_SPEED > PAD_W:
  100. c.move(BALL, BALL_X_DEFAULT_SPEED, BALL_Y_DEFAULT_SPEED)
  101. elif ball_right == RIGHT_LINE_DISTANCE or ball_left == PAD_W:
  102. if ball_right > WIDTH / 2:
  103. if c.coords(RIGHT_PAD)[1] < ball_center < c.coords(RIGHT_PAD)[3]:
  104. bounce('strike')
  105. else:
  106. update_score('left')
  107. respawn()
  108. else:
  109. if c.coords(LEFT_PAD)[1] < ball_center < c.coords(LEFT_PAD)[3]:
  110. bounce('strike')
  111. else:
  112. update_score('right')
  113. respawn()
  114. else:
  115. if ball_right > WIDTH /2:
  116. c.move(BALL, RIGHT_LINE_DISTANCE - ball_right, BALL_Y_DEFAULT_SPEED)
  117. else:
  118. c.move(BALL, PAD_W - ball_left, BALL_Y_DEFAULT_SPEED)
  119. # горизонтальный отскок
  120. if ball_top + BALL_Y_DEFAULT_SPEED < 0 or ball_bottom + BALL_Y_DEFAULT_SPEED > HEIGHT:
  121. bounce('ricoshet')
  122.  
  123.  
  124. # движение ракеток
  125. def move_pad():
  126. PADS = {LEFT_PAD: LEFT_PAD_SPEED,
  127. RIGHT_PAD: RIGHT_PAD_SPEED}
  128. for pad in PADS:
  129. c.move(pad, 0, PADS[pad])
  130. if c.coords(pad)[1] < 0:
  131. c.move(pad, 0, -c.coords(pad)[1])
  132. elif c.coords(pad)[3] > HEIGHT:
  133. c.move(pad, 0, -c.coords(pad)[3])
  134.  
  135.  
  136. # главная функция
  137. def main():
  138. move_ball()
  139. move_pad()
  140. # рекурсия
  141. root.after(30, main)
  142.  
  143.  
  144. # фокус на канвас (рекакция на клавиши)
  145. c.focus_set()
  146.  
  147.  
  148. # обработка нажатий
  149. def move_event_handler(event):
  150. global LEFT_PAD_SPEED, RIGHT_PAD_SPEED
  151. if event.keysym == 'w':
  152. LEFT_PAD_SPEED = -PAD_SPEED
  153. elif event.keysym == 's':
  154. LEFT_PAD_SPEED = PAD_SPEED
  155. if event.keysym == 'Up':
  156. RIGHT_PAD_SPEED = -PAD_SPEED
  157. elif event.keysym == 'Down':
  158. RIGHT_PAD_SPEED = PAD_SPEED
  159.  
  160.  
  161. # привязка к канвас
  162. c.bind('<KeyPress>', move_event_handler)
  163.  
  164.  
  165. # клавиши не нажаты
  166. def stop_pad(event):
  167. global LEFT_PAD_SPEED, RIGHT_PAD_SPEED
  168. if event.keysym in 'ws':
  169. LEFT_PAD_SPEED = 0
  170. elif event.keysym in ('Up', 'Down'):
  171. RIGHT_PAD_SPEED = 0
  172.  
  173.  
  174. # привязка к канвас
  175. c.bind('<KeyRelease>', stop_pad)
  176.  
  177. # запуск
  178. main()
  179.  
  180. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement