1+ import pygame
2+ from pygame .locals import *
3+ import random
4+
5+ pygame .init ()
6+
7+ # create the window
8+ width = 500
9+ height = 500
10+ screen_size = (width ,height )
11+ screen = pygame .display .set_mode (screen_size )
12+ pygame .display .set_caption ('Car Game' )
13+
14+ # colors
15+ gray = (100 ,100 ,100 )
16+ green = (76 ,208 ,56 )
17+ red = (200 ,0 ,0 )
18+ white = (255 ,255 ,255 )
19+ yellow = (255 ,232 ,0 )
20+
21+ # road and marker sizes
22+ road_width = 300
23+ marker_width = 10
24+ marker_height = 50
25+
26+ # lane coordinates
27+ left_lane = 150
28+ center_lane = 250
29+ right_lane = 350
30+ lanes = [left_lane ,center_lane ,right_lane ]
31+
32+ # road and edge markers
33+ road = (100 ,0 ,road_width ,height )
34+ left_edge_marker = (95 ,0 ,marker_width ,height )
35+ right_edge_marker = (395 ,0 ,marker_width ,height )
36+
37+ # for animating movement of the lane markers
38+ lane_marker_move_y = 0
39+
40+ # player's starting coordinates
41+ player_x = 250
42+ player_y = 400
43+
44+ # frame settings
45+ clock = pygame .time .Clock ()
46+ fps = 120
47+
48+ # game settings
49+ gameover = False
50+ speed = 2
51+ score = 0
52+
53+ class Vehicle (pygame .sprite .Sprite ):
54+
55+ def __init__ (self ,image ,x ,y ):
56+ pygame .sprite .Sprite .__init__ (self )
57+
58+ # scale the image down so it's not wider than the lane
59+ image_scale = 45 / image .get_rect ().width
60+ new_width = image .get_rect ().width * image_scale
61+ new_height = image .get_rect ().height * image_scale
62+ self .image = pygame .transform .scale (image , (new_width ,new_height ))
63+
64+ self .rect = self .image .get_rect ()
65+ self .rect .center = [x ,y ]
66+
67+ class PlayerVehicle (Vehicle ):
68+
69+ def __init__ (self ,x ,y ):
70+ image = pygame .image .load ('images/Car.png' )
71+ super ().__init__ (image ,x ,y )
72+
73+ # sprite groups
74+ player_group = pygame .sprite .Group ()
75+ vehicle_group = pygame .sprite .Group ()
76+
77+ # create the player's car
78+ player = PlayerVehicle (player_x ,player_y )
79+ player_group .add (player )
80+
81+ # load the vehicle images
82+ image_filenames = ['Mini_truck.png' ,'truck.png' ,'taxi.png' ,'Mini_van.png' ]
83+ vehicle_images = []
84+ for image_filename in image_filenames :
85+ image = pygame .image .load ('images/' + image_filename )
86+ vehicle_images .append (image )
87+
88+ # load the crash image
89+ crash = pygame .image .load ('images/crash.png' )
90+ crash_rect = crash .get_rect ()
91+
92+ # game loop
93+ running = True
94+ while running :
95+
96+ clock .tick (fps )
97+
98+ for event in pygame .event .get ():
99+ if event .type == QUIT :
100+ running = False
101+
102+ # move the player's car using the left/right arrow keys
103+ if event .type == KEYDOWN :
104+
105+ if event .key == K_LEFT and player .rect .center [0 ]> left_lane :
106+ player .rect .x -= 100
107+ elif event .key == K_RIGHT and player .rect .center [0 ]< right_lane :
108+ player .rect .x += 100
109+
110+ # check if there's a side swipe collision after changing lanes
111+ for vehicle in vehicle_group :
112+ if pygame .sprite .collide_rect (player ,vehicle ):
113+
114+ gameover = True
115+
116+ # place the player's car next to other vehicle
117+ # and determine where to position the crash image
118+ if event .key == K_LEFT :
119+ player .rect .left = vehicle .rect .right
120+ crash_rect .center = [player .rect .left , (player .rect .center [1 ]+ vehicle .rect .center [1 ])/ 2 ]
121+ elif event .key == K_RIGHT :
122+ player .rect .right = vehicle .rect .left
123+ crash_rect .center = [player .rect .right , (player .rect .center [1 ]+ vehicle .rect .center [1 ])/ 2 ]
124+
125+
126+ # draw the grass
127+ screen .fill (green )
128+
129+ # draw the road
130+ pygame .draw .rect (screen ,gray ,road )
131+
132+ # draw the edge markers
133+ pygame .draw .rect (screen ,yellow ,left_edge_marker )
134+ pygame .draw .rect (screen ,yellow ,right_edge_marker )
135+
136+ # draw the lane markers
137+ lane_marker_move_y += speed * 2
138+ if lane_marker_move_y >= marker_height * 2 :
139+ lane_marker_move_y = 0
140+ for y in range (marker_height * - 2 ,height ,marker_height * 2 ):
141+ pygame .draw .rect (screen ,white , (left_lane + 45 ,y + lane_marker_move_y ,marker_width ,marker_height ))
142+ pygame .draw .rect (screen ,white , (center_lane + 45 ,y + lane_marker_move_y ,marker_width ,marker_height ))
143+
144+ # draw the player's car
145+ player_group .draw (screen )
146+
147+ # add a vehicle
148+ if len (vehicle_group )< 2 :
149+
150+ # ensure there's enough gap between vehicles
151+ add_vehicle = True
152+ for vehicle in vehicle_group :
153+ if vehicle .rect .top < vehicle .rect .height * 1.5 :
154+ add_vehicle = False
155+
156+ if add_vehicle :
157+
158+ # select a random lane
159+ lane = random .choice (lanes )
160+
161+ # select a random vehicle image
162+ image = random .choice (vehicle_images )
163+ vehicle = Vehicle (image ,lane ,height / - 2 )
164+ vehicle_group .add (vehicle )
165+
166+ # make the vehicles move
167+ for vehicle in vehicle_group :
168+ vehicle .rect .y += speed
169+
170+ # remove vehicle once it goes off screen
171+ if vehicle .rect .top >= height :
172+ vehicle .kill ()
173+
174+ # add to score
175+ score += 1
176+
177+ # speed up the game after passing 5 vehicles
178+ if score > 0 and score % 5 == 0 :
179+ speed += 1
180+
181+ # draw the vehicles
182+ vehicle_group .draw (screen )
183+
184+ # display the score
185+ font = pygame .font .Font (pygame .font .get_default_font (),16 )
186+ text = font .render ('Score: ' + str (score ),True ,white )
187+ text_rect = text .get_rect ()
188+ text_rect .center = (50 ,400 )
189+ screen .blit (text ,text_rect )
190+
191+ # check if there's a head on collision
192+ if pygame .sprite .spritecollide (player ,vehicle_group ,True ):
193+ gameover = True
194+ crash_rect .center = [player .rect .center [0 ],player .rect .top ]
195+
196+ # display game over
197+ if gameover :
198+ screen .blit (crash ,crash_rect )
199+
200+ pygame .draw .rect (screen ,red , (0 ,50 ,width ,100 ))
201+
202+ font = pygame .font .Font (pygame .font .get_default_font (),16 )
203+ text = font .render ('Game over. Play again? (Enter Y or N)' ,True ,white )
204+ text_rect = text .get_rect ()
205+ text_rect .center = (width / 2 ,100 )
206+ screen .blit (text ,text_rect )
207+
208+ pygame .display .update ()
209+
210+ # wait for user's input to play again or exit
211+ while gameover :
212+
213+ clock .tick (fps )
214+
215+ for event in pygame .event .get ():
216+
217+ if event .type == QUIT :
218+ gameover = False
219+ running = False
220+
221+ # get the user's input (y or n)
222+ if event .type == KEYDOWN :
223+ if event .key == K_y :
224+ # reset the game
225+ gameover = False
226+ speed = 2
227+ score = 0
228+ vehicle_group .empty ()
229+ player .rect .center = [player_x ,player_y ]
230+ elif event .key == K_n :
231+ # exit the loops
232+ gameover = False
233+ running = False
234+
235+ pygame .quit ()