-
Notifications
You must be signed in to change notification settings - Fork 0
/
Bounce_game.py
141 lines (123 loc) · 5.83 KB
/
Bounce_game.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
from tkinter import *
import random
import time
class Ball:
def __init__(self, canvas, paddle, score, color):
self.canvas = canvas
#определение доски чтоб шарик понимал что она есть
self.paddle = paddle
self.score = score
#в self.id будет хранится индекс созданого кружка
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]
random.shuffle(starts)
#кружок движется в рандомном направлении и рандомной скоростью по x
self.x=starts[0]
#но по у вверх
self.y=-3
#winfo_heingt возвращает высоту окна чтоб знать где потолок и пол
self.canvas_height=self.canvas.winfo_height()
#canvas_width определяет где стены
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]:
self.score.hit()
return True
return False
def draw(self):
self.canvas.move(self.id,self.x,self.y)
#возвращает координаты объекта self.id в переменную pos в виде 4 цифр:
#х,у верхней левой точки и х,у нижней правой [255.0, 29.0, 270.0, 44.0]
pos=self.canvas.coords(self.id)
#проверяем не уперся ли верх кружка в потолок.
if pos[1] <=0:
#если уперся то двигаемся вниз
self.y=3
#проверяем не уперлся ли кружок в пол
if pos[3] >= self.canvas_height:
#если уперся то всё.
self.hit_bottom = True
self.game_over(canvas)
#вызов функции hit_paddle чтоб проверить не коснулся ли шарик доски
if self.hit_paddle(pos)==True:
self.y=-3
#такая же проверка и на координаты х, чтобы он отскакивал от стен
if pos[0] <=0:
self.x=3
if pos[2]>=self.canvas_width:
self.x=-3
def game_over(self,canvas):
time.sleep(1)
canvas.create_text(250,200,text="Game Over", fill='red',font=('Courier',30))
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.started = False
#захват нажатия клавишь для управления доской
self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
self.canvas.bind_all('<Button-1>',self.game_start)
def draw(self):
#по игрeку не двигаемся поэтому только x
self.canvas.move(self.id,self.x,0)
pos=self.canvas.coords(self.id)
#доска не отскакивает от стен. она просто упирается и прекращает движение
if pos[0]<=0:
#касание левой стены левым верхним углом
self.x=0
elif pos[2] >= self.canvas_width:
#касание правой стены правым нижним углом
self.x=0
#эти 2 функции отвечают за движение доски
def turn_left(self,evt):
self.x=-2
def turn_right(self,evt):
self.x=2
def game_start(self,evt):
self.started = True
class Score:
def __init__(self, canvas, color):
self.score = 0
self.canvas = canvas
self.id = canvas.create_text(450, 10, text=self.score, fill=color)
def hit(self):
self.score += 1
self.canvas.itemconfig(self.id, text=self.score)
tk = Tk()
#имя открытого окна
tk.title("Bounce")
#запрет на растягивание окна
tk.resizable(0,0)
#сделать окно поверх всех окон
tk.wm_attributes("-topmost",1)
#bd=0 - толщина рамки окна 0 пикселей (делаем окно без рамки)
#highlightthickness=0 - подстведка при выбора окна 0 пикселей
canvas=Canvas(tk,width=500,height=400, bd=0,highlightthickness=0)
canvas.pack()
tk.update()
#теперь создадим объект класса Ball - кружок. ball
score = Score(canvas, 'green')
paddle=Paddle(canvas,'blue')
ball=Ball(canvas, paddle, score, 'red')
while 1:
#проверка касается ли шарик дна.
if ball.hit_bottom == False and paddle.started == True:
#вызов функции draw из классов шарика и доски чтоб они нарисовались.
ball.draw()
paddle.draw()
#update и update_idletasks выводят изображения в tkinter на экран
tk.update_idletasks()
tk.update()
time.sleep(0.01)