Repository navigation
Expand file tree
/
Copy pathPingPong
More file actions
229 lines (172 loc) · 7.39 KB
/
Copy pathPingPong
File metadata and controls
229 lines (172 loc) · 7.39 KB
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
http://www.codeskulptor.org/#user40_8httGn2lrS_5.py
# Implementation of classic arcade game Pong @ K.L
import simplegui
import random
import math
# initialize globals - pos and vel encode vertical info for paddles
WIDTH = 600
HEIGHT = 400
BALL_RADIUS = 20
PAD_WIDTH = 8
PAD_HEIGHT = 80
HALF_PAD_WIDTH = PAD_WIDTH / 2
HALF_PAD_HEIGHT = PAD_HEIGHT / 2
# i don't use them two date i did that easy
LEFT = False
RIGHT = True
ball_pos = [WIDTH /2 , HEIGHT /2]
ball_vel = [0,0]
score1 = 0
score2 = 0
paddle1_pos = HEIGHT /2
paddle2_pos = HEIGHT /2
paddle1_vel = 0
paddle2_vel = 0
acc = 4
# is only one sound fx
sound_file = "http:///www.tafelrunde.net/hlds/sound/ambience/3dm_bik_ball.wav"
# initialize ball_pos and ball_vel for new bal in middle of table
# if direction is RIGHT, the ball's velocity is upper right, else upper left
def spawn_ball(direction):
global ball_pos, ball_vel # these are vectors stored as lists
ball_pos = [WIDTH /2 , HEIGHT /2]
horizontal = random.randrange(2, 4)
vertical = random.randrange(1, 3)
if direction : #Right
ball_vel = [horizontal,vertical]
ball_vel[0] *= 1
ball_vel[1] *= -1
else: #Left
ball_vel = [horizontal,vertical]
ball_vel[0] *= -1
ball_vel[1] *= -1
# define event handlers
def new_game():
global paddle1_pos, paddle2_pos, paddle1_vel, paddle2_vel # these are numbers
global score1, score2 # these are ints
score1 = 0
score2 = 0
paddle1_pos = HEIGHT /2
paddle2_pos = HEIGHT /2
paddle1_vel = 0
paddle2_vel = 0
ball_vel[0] = 1
ball_vel[1] = 1
spawn_ball(random.randint(0,1))
def reset_button():
new_game()
def draw(canvas):
# draw handler
global score1, score2, paddle1_pos, paddle2_pos, ball_pos, ball_vel, paddle1_vel, paddle2_vel
# draw mid line and gutters
#------------------------------------
canvas.draw_line([WIDTH / 2, 0],[WIDTH / 2, HEIGHT], 1, "White")
canvas.draw_line([PAD_WIDTH, 0],[PAD_WIDTH, HEIGHT], 1, "White")
canvas.draw_line([WIDTH - PAD_WIDTH, 0],[WIDTH - PAD_WIDTH, HEIGHT], 1, "White")
#------------------------------------
# Update ball position
ball_pos[0] += ball_vel[0]
ball_pos[1] += ball_vel[1]
# ball reflect top and bottom
if ball_pos[1] <= BALL_RADIUS:
ball_vel[1] = - ball_vel[1]
if ball_pos[1] >= HEIGHT - BALL_RADIUS:
ball_vel[1] = - ball_vel[1]
# draw ball
canvas.draw_circle(ball_pos,BALL_RADIUS, 1,"White","White")
#--------------------------------------------------------------
# update paddle's vertical position, keep paddle on the screen
if paddle1_pos + paddle1_vel >= HALF_PAD_HEIGHT and paddle1_pos + paddle1_vel <= HEIGHT -HALF_PAD_HEIGHT:
paddle1_pos += paddle1_vel
if paddle2_pos + paddle2_vel >= HALF_PAD_HEIGHT and paddle2_pos + paddle2_vel <= HEIGHT -HALF_PAD_HEIGHT:
paddle2_pos += paddle2_vel
# draw paddles
canvas.draw_line([HALF_PAD_WIDTH, paddle1_pos-HALF_PAD_HEIGHT], [HALF_PAD_WIDTH, paddle1_pos+HALF_PAD_HEIGHT], PAD_WIDTH, 'Blue')
canvas.draw_line([WIDTH-HALF_PAD_WIDTH, paddle2_pos-HALF_PAD_HEIGHT], [WIDTH-HALF_PAD_WIDTH, paddle2_pos+HALF_PAD_HEIGHT], PAD_WIDTH , 'Blue')
# determine whether paddle and ball collide
# reflect from left side
if (ball_pos[0]+ ball_vel[0] <= BALL_RADIUS + PAD_WIDTH+ abs(ball_vel[0])) and (ball_pos[1] >= paddle1_pos - HALF_PAD_HEIGHT) and (ball_pos[1] <= paddle1_pos + HALF_PAD_HEIGHT):
ball_vel[0] *= - 1.1
ball_vel[1] *= 1.1
sound.rewind()
sound.play()
# print "paddle1 hit :", paddle1_pos ,ball_pos
# check the ball if is out the guttere
elif ball_pos[0]+ball_vel[0] <= BALL_RADIUS + HALF_PAD_WIDTH :
## print "miss the paddle", paddle1_pos ,paddle1_pos -40,paddle1_pos+40,ball_pos
if ball_pos[0]<=0 :
ball_vel[0] = ball_vel[0]
ball_vel = [0,0]
score1 +=1
spawn_ball(RIGHT)
# reflect from right side
if (ball_pos[0] + ball_vel[0] >= WIDTH - (BALL_RADIUS + PAD_WIDTH + abs(ball_vel[0])) ) and (ball_pos[1] >= paddle2_pos - HALF_PAD_HEIGHT ) and (ball_pos[1] <= paddle2_pos + HALF_PAD_HEIGHT):
ball_vel[0] *= -1.1
ball_vel[1] *= 1.1
sound.rewind()
sound.play()
# print "paddle1 hit :", paddle2_pos ,ball_pos
elif ball_pos[0]+ ball_vel[0] >= WIDTH - (BALL_RADIUS + HALF_PAD_WIDTH):
# print "miss the paddle", paddle2_pos ,paddle2_pos -40,paddle2_pos+40,ball_pos
if ball_pos[0]>=WIDTH :
ball_vel[0] = - ball_vel[0]
ball_vel = [0,0]
score2 +=1
spawn_ball(LEFT)
## extra function if you remove ## you can see
# info(canvas)
# draw scores
canvas.draw_text(str(score1), [130, 100], 70, 'White')
canvas.draw_text(str(score2), [420, 100], 70, 'White')
def keydown(key):
global paddle1_vel, paddle2_vel, ball_vel, acc
# acceleration
if ball_vel[0] > 5 and ball_vel[0] < 10:
acc +=1
else:
acc = 4
#---------------
if key == simplegui.KEY_MAP["down"]:
paddle2_vel = acc
elif key == simplegui.KEY_MAP["up"]:
paddle2_vel = -acc
if key == simplegui.KEY_MAP["s"]:
paddle1_vel = acc
elif key == simplegui.KEY_MAP["w"]:
paddle1_vel = - acc
def keyup(key):
global paddle1_vel, paddle2_vel
acc = 0
if key == simplegui.KEY_MAP["down"]or key == simplegui.KEY_MAP["up"]:
paddle2_vel = acc
if key == simplegui.KEY_MAP["s"] or key == simplegui.KEY_MAP["w"]:
paddle1_vel = acc
#------------------------------------------------------------------------------
def info(canvas):
# display extra information
##################################################################
#ball_pos[600,400]
#ball_pos = [WIDTH , HEIGHT]
canvas.draw_line([0,ball_pos[1]], [600,ball_pos[1]], 2 , 'Red')
canvas.draw_line([ball_pos[0],0], [ball_pos[0],400], 2 , 'Red')
canvas.draw_line( [(ball_pos[0]+(ball_vel[0]*100)),(ball_pos[1]+(ball_vel[1]*100))],ball_pos, 2 , 'Orange')
canvas.draw_text("Ball pos x : " + str(ball_pos[0]), [100, 305], 15, 'Yellow')
canvas.draw_text("Ball pos y : " + str(ball_pos[1]), [100, 320], 15, 'Yellow')
canvas.draw_text("Ball vel " + str(ball_vel), [100, 335], 15, 'Yellow')
canvas.draw_text("Paddle1 pos : " + str(paddle1_pos), [400, 320], 15, 'Yellow')
canvas.draw_text("Paddle1 vel " + str(paddle1_vel), [400, 335], 15, 'Yellow')
canvas.draw_text("Paddle2 pos : " + str(paddle2_pos), [400, 350], 15, 'Yellow')
canvas.draw_text("Paddle2 vel " + str(paddle2_vel), [400, 365], 15, 'Yellow')
# print "Paddle pos:", paddle2_pos ,paddle2_pos -40,paddle2_pos+40,"Ball pos:",ball_pos
###################################################################
# create frame
frame = simplegui.create_frame("The Pong Game", WIDTH, HEIGHT)
frame.set_draw_handler(draw)
frame.set_keydown_handler(keydown)
frame.set_keyup_handler(keyup)
frame.add_button("Reset",reset_button,100)
sound = simplegui.load_sound(sound_file)
sound.set_volume(0.7)
# start frame
new_game()
frame.start()