1
+ # THE DUALITY SHOOTER GAME --> first pygame proj.
2
+
3
+ import os # to access the files
4
+ import pygame
5
+ pygame .font .init () # To use the fonts lib
6
+ pygame .mixer .init () # To be able to use music
7
+
8
+
9
+ WIDTH ,HEIGHT = 900 , 500 # vars for window width and height
10
+ WIN = pygame .display .set_mode ((WIDTH ,HEIGHT )) # set up the window
11
+ pygame .display .set_caption ("First Game" ) # set the title bar caption
12
+
13
+ # defining the colors
14
+ WHITE = (255 ,255 ,255 )
15
+ BLACK = (0 ,0 ,0 )
16
+ RED = (255 ,0 ,0 )
17
+ YELLOW = (255 ,255 ,0 )
18
+
19
+ BORDER = pygame .Rect (WIDTH // 2 - 5 ,0 ,10 ,HEIGHT ) # the rect for the center line
20
+
21
+ # Moosick
22
+ BULLET_HIT_SOUND = pygame .mixer .Sound (os .path .join ('Assets' ,'Grenade+1.mp3' ))
23
+ BULLET_FIRE_SOUND = pygame .mixer .Sound (os .path .join ('Assets' ,'Gun+Silencer.mp3' ))
24
+ BACKROUND_MUSIC = pygame .mixer .Sound (os .path .join ('Assets' ,'bensound-epic.mp3' ))
25
+
26
+ # Setting up fonts
27
+ HEALTH_FONT = pygame .font .SysFont ('comicsans' ,40 )
28
+ WINNER_FONT = pygame .font .SysFont ('comicsans' ,100 )
29
+
30
+ FPS = 60
31
+ VEL = 5
32
+ BULLET_VEL = 7
33
+ MAX_BULLETS = 3
34
+ SPACESHIP_WIDTH ,SPACESHIP_HEIGHT = 55 ,40
35
+
36
+ # creating user events
37
+ YELLOW_HIT = pygame .USEREVENT + 1
38
+ RED_HIT = pygame .USEREVENT + 2
39
+
40
+ # loading the images
41
+ YELLOW_S = pygame .image .load (os .path .join ('Assets' ,'spaceship_yellow.png' ))
42
+ YELLOW_S = pygame .transform .rotate (pygame .transform .scale (YELLOW_S ,(SPACESHIP_WIDTH ,SPACESHIP_HEIGHT )), 90 ) # rotating by 90 and rescaling
43
+
44
+
45
+ RED_S = pygame .image .load (os .path .join ('Assets' ,'spaceship_red.png' ))
46
+ RED_S = pygame .transform .rotate (pygame .transform .scale (RED_S ,(SPACESHIP_WIDTH ,SPACESHIP_HEIGHT )), 270 )
47
+
48
+ SPACE = pygame .image .load (os .path .join ('Assets' ,'space.png' ))
49
+ SPACE = pygame .transform .scale (SPACE ,(WIDTH ,HEIGHT ))
50
+
51
+ # The drawing func.
52
+ def draw_window (red ,yellow ,red_bullets ,yellow_bullets ,red_health ,yellow_health ):
53
+ WIN .blit (SPACE ,(0 ,0 )) # drawing the bg
54
+ pygame .draw .rect (WIN ,BLACK ,BORDER ) # drawing the deviding line
55
+
56
+ red_health_text = HEALTH_FONT .render ("Health: " + str (red_health ),1 ,WHITE )
57
+ yellow_health_text = HEALTH_FONT .render ("Health: " + str (yellow_health ),1 ,WHITE )
58
+ WIN .blit (red_health_text ,(WIDTH - red_health_text .get_width ()- 10 ,10 ))
59
+ WIN .blit (yellow_health_text ,(10 ,10 ))
60
+
61
+ # drawing the two spaceships
62
+ WIN .blit (YELLOW_S , (yellow .x ,yellow .y ))
63
+ WIN .blit (RED_S , (red .x ,red .y ))
64
+
65
+ # drawing the bullets
66
+ for bullet in red_bullets :
67
+ pygame .draw .rect (WIN ,RED ,bullet )
68
+
69
+ for bullet in yellow_bullets :
70
+ pygame .draw .rect (WIN ,YELLOW ,bullet )
71
+
72
+ pygame .display .update () # IMP.... display needs to be updated
73
+
74
+
75
+ def yellow_handle_movement (keys_pressed ,yellow ):
76
+ if keys_pressed [pygame .K_a ] and yellow .x - VEL > 0 : #LEFT
77
+ yellow .x -= VEL
78
+ if keys_pressed [pygame .K_d ] and yellow .x + VEL + yellow .width < BORDER .x : #RIGHT
79
+ yellow .x += VEL
80
+ if keys_pressed [pygame .K_w ] and yellow .y - VEL > 0 : #UP
81
+ yellow .y -= VEL
82
+ if keys_pressed [pygame .K_s ] and yellow .y + VEL + yellow .height < HEIGHT - 15 : #DOWN
83
+ yellow .y += VEL
84
+
85
+ def red_handle_movement (keys_pressed ,red ):
86
+ if keys_pressed [pygame .K_LEFT ] and red .x - VEL > BORDER .width + BORDER .x : #LEFT
87
+ red .x -= VEL
88
+ if keys_pressed [pygame .K_RIGHT ] and red .x + VEL + red .width < WIDTH : #RIGHT
89
+ red .x += VEL
90
+ if keys_pressed [pygame .K_UP ] and red .y - VEL > 0 : #UP
91
+ red .y -= VEL
92
+ if keys_pressed [pygame .K_DOWN ] and red .y + VEL + red .height < HEIGHT - 15 : #DOWN
93
+ red .y += VEL
94
+
95
+ # Func to handle bullet movements and collisions
96
+ def handle_bullets (yellow_bullets ,red_bullets ,yellow ,red ):
97
+ for bullet in yellow_bullets :
98
+ bullet .x += BULLET_VEL
99
+ if red .colliderect (bullet ):
100
+ pygame .event .post (pygame .event .Event (RED_HIT ))
101
+ yellow_bullets .remove (bullet )
102
+ if (bullet .x > WIDTH ):
103
+ yellow_bullets .remove (bullet )
104
+ elif bullet .x < 0 :
105
+ red_bullets .remove (bullet )
106
+
107
+ for bullet in red_bullets :
108
+ bullet .x -= BULLET_VEL
109
+ if yellow .colliderect (bullet ):
110
+ pygame .event .post (pygame .event .Event (YELLOW_HIT ))
111
+ red_bullets .remove (bullet )
112
+ if (bullet .x > WIDTH ):
113
+ yellow_bullets .remove (bullet )
114
+ elif bullet .x < 0 :
115
+ red_bullets .remove (bullet )
116
+
117
+ # Func to get winner text
118
+ def draw_winner (text ):
119
+ draw_text = WINNER_FONT .render (text ,1 ,WHITE )
120
+ WIN .blit (draw_text ,(WIDTH // 2 - draw_text .get_width ()// 2 ,HEIGHT // 2 - draw_text .get_height ()// 2 ))
121
+ pygame .display .update ()
122
+ pygame .time .delay (5000 )
123
+
124
+
125
+ # CODE DRIVING FUNCTION
126
+ def main ():
127
+ red = pygame .Rect (700 ,300 ,SPACESHIP_WIDTH ,SPACESHIP_HEIGHT )
128
+ yellow = pygame .Rect (100 ,300 ,SPACESHIP_WIDTH ,SPACESHIP_HEIGHT )
129
+
130
+ red_bullets = []
131
+ yellow_bullets = []
132
+
133
+ red_health = 10
134
+ yellow_health = 10
135
+
136
+ winner_text = ""
137
+
138
+ clock = pygame .time .Clock ()
139
+ run = True
140
+ while run :
141
+ clock .tick (FPS )
142
+ for event in pygame .event .get ():
143
+
144
+ #pygame.mixer.music.set_volume(0.1)
145
+ #ACKROUND_MUSIC.play()
146
+
147
+ if event .type == pygame .QUIT :
148
+ run = False
149
+ pygame .quit ()
150
+
151
+ if event .type == pygame .KEYDOWN :
152
+ if event .key == pygame .K_LCTRL and len (yellow_bullets )< MAX_BULLETS :
153
+ bullet = pygame .Rect (yellow .x + yellow .width , yellow .y + yellow .height // 2 - 2 ,10 ,5 )
154
+ yellow_bullets .append (bullet )
155
+ BULLET_FIRE_SOUND .play ()
156
+
157
+ if event .key == pygame .K_RCTRL and len (red_bullets )< MAX_BULLETS :
158
+ bullet = pygame .Rect (red .x , red .y + red .height // 2 - 2 ,10 ,5 )
159
+ red_bullets .append (bullet )
160
+ BULLET_FIRE_SOUND .play ()
161
+
162
+ if event .type == RED_HIT :
163
+ red_health -= 1
164
+ BULLET_HIT_SOUND .play ()
165
+
166
+ if event .type == YELLOW_HIT :
167
+ yellow_health -= 1
168
+ BULLET_HIT_SOUND .play ()
169
+
170
+ if red_health <= 0 :
171
+ winner_text = "Yellow Wins!"
172
+
173
+ if yellow_health <= 0 :
174
+ winner_text = "Red Wins!"
175
+
176
+ if winner_text != "" :
177
+ draw_winner (winner_text )
178
+ break
179
+
180
+ keys_pressed = pygame .key .get_pressed ()
181
+ yellow_handle_movement (keys_pressed ,yellow )
182
+ red_handle_movement (keys_pressed ,red )
183
+ handle_bullets (yellow_bullets ,red_bullets ,yellow ,red )
184
+ draw_window (red ,yellow ,red_bullets ,yellow_bullets ,red_health ,yellow_health )
185
+
186
+ main () # Rerun on completion
187
+
188
+
189
+ if __name__ == "__main__" :
190
+ main ()
0 commit comments