-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcar.py
More file actions
235 lines (179 loc) · 7.03 KB
/
car.py
File metadata and controls
235 lines (179 loc) · 7.03 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
230
231
232
233
234
235
import pygame
from pygame.locals import *
import random
pygame.init()
# create the window
width = 500
height = 500
screen_size = (width, height)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('Car Game')
# colors
gray = (100, 100, 100)
green = (76, 208, 56)
red = (200, 0, 0)
white = (255, 255, 255)
yellow = (255, 232, 0)
# road and marker sizes
road_width = 300
marker_width = 10
marker_height = 50
# lane coordinates
left_lane = 150
center_lane = 250
right_lane = 350
lanes = [left_lane, center_lane, right_lane]
# road and edge markers
road = (100, 0, road_width, height)
left_edge_marker = (95, 0, marker_width, height)
right_edge_marker = (395, 0, marker_width, height)
# for animating movement of the lane markers
lane_marker_move_y = 0
# player's starting coordinates
player_x = 250
player_y = 400
# frame settings
clock = pygame.time.Clock()
fps = 120
# game settings
gameover = False
speed = 2
score = 0
class Vehicle(pygame.sprite.Sprite):
def __init__(self, image, x, y):
pygame.sprite.Sprite.__init__(self)
# scale the image down so it's not wider than the lane
image_scale = 45 / image.get_rect().width
new_width = image.get_rect().width * image_scale
new_height = image.get_rect().height * image_scale
self.image = pygame.transform.scale(image, (new_width, new_height))
self.rect = self.image.get_rect()
self.rect.center = [x, y]
class PlayerVehicle(Vehicle):
def __init__(self, x, y):
image = pygame.image.load('images/Car.png')
super().__init__(image, x, y)
# sprite groups
player_group = pygame.sprite.Group()
vehicle_group = pygame.sprite.Group()
# create the player's car
player = PlayerVehicle(player_x, player_y)
player_group.add(player)
# load the vehicle images
image_filenames = ['Mini_truck.png', 'truck.png', 'taxi.png', 'Mini_van.png']
vehicle_images = []
for image_filename in image_filenames:
image = pygame.image.load('images/' + image_filename)
vehicle_images.append(image)
# load the crash image
crash = pygame.image.load('images/crash.png')
crash_rect = crash.get_rect()
# game loop
running = True
while running:
clock.tick(fps)
for event in pygame.event.get():
if event.type == QUIT:
running = False
# move the player's car using the left/right arrow keys
if event.type == KEYDOWN:
if event.key == K_LEFT and player.rect.center[0] > left_lane:
player.rect.x -= 100
elif event.key == K_RIGHT and player.rect.center[0] < right_lane:
player.rect.x += 100
# check if there's a side swipe collision after changing lanes
for vehicle in vehicle_group:
if pygame.sprite.collide_rect(player, vehicle):
gameover = True
# place the player's car next to other vehicle
# and determine where to position the crash image
if event.key == K_LEFT:
player.rect.left = vehicle.rect.right
crash_rect.center = [player.rect.left, (player.rect.center[1] + vehicle.rect.center[1]) / 2]
elif event.key == K_RIGHT:
player.rect.right = vehicle.rect.left
crash_rect.center = [player.rect.right, (player.rect.center[1] + vehicle.rect.center[1]) / 2]
# draw the grass
screen.fill(green)
# draw the road
pygame.draw.rect(screen, gray, road)
# draw the edge markers
pygame.draw.rect(screen, yellow, left_edge_marker)
pygame.draw.rect(screen, yellow, right_edge_marker)
# draw the lane markers
lane_marker_move_y += speed * 2
if lane_marker_move_y >= marker_height * 2:
lane_marker_move_y = 0
for y in range(marker_height * -2, height, marker_height * 2):
pygame.draw.rect(screen, white, (left_lane + 45, y + lane_marker_move_y, marker_width, marker_height))
pygame.draw.rect(screen, white, (center_lane + 45, y + lane_marker_move_y, marker_width, marker_height))
# draw the player's car
player_group.draw(screen)
# add a vehicle
if len(vehicle_group) < 2:
# ensure there's enough gap between vehicles
add_vehicle = True
for vehicle in vehicle_group:
if vehicle.rect.top < vehicle.rect.height * 1.5:
add_vehicle = False
if add_vehicle:
# select a random lane
lane = random.choice(lanes)
# select a random vehicle image
image = random.choice(vehicle_images)
vehicle = Vehicle(image, lane, height / -2)
vehicle_group.add(vehicle)
# make the vehicles move
for vehicle in vehicle_group:
vehicle.rect.y += speed
# remove vehicle once it goes off screen
if vehicle.rect.top >= height:
vehicle.kill()
# add to score
score += 1
# speed up the game after passing 5 vehicles
if score > 0 and score % 5 == 0:
speed += 1
# draw the vehicles
vehicle_group.draw(screen)
# display the score
font = pygame.font.Font(pygame.font.get_default_font(), 16)
text = font.render('Score: ' + str(score), True, white)
text_rect = text.get_rect()
text_rect.center = (50, 400)
screen.blit(text, text_rect)
# check if there's a head on collision
if pygame.sprite.spritecollide(player, vehicle_group, True):
gameover = True
crash_rect.center = [player.rect.center[0], player.rect.top]
# display game over
if gameover:
screen.blit(crash, crash_rect)
pygame.draw.rect(screen, red, (0, 50, width, 100))
font = pygame.font.Font(pygame.font.get_default_font(), 16)
text = font.render('Game over. Play again? (Enter Y or N)', True, white)
text_rect = text.get_rect()
text_rect.center = (width / 2, 100)
screen.blit(text, text_rect)
pygame.display.update()
# wait for user's input to play again or exit
while gameover:
clock.tick(fps)
for event in pygame.event.get():
if event.type == QUIT:
gameover = False
running = False
# get the user's input (y or n)
if event.type == KEYDOWN:
if event.key == K_y:
# reset the game
gameover = False
speed = 2
score = 0
vehicle_group.empty()
player.rect.center = [player_x, player_y]
elif event.key == K_n:
# exit the loops
gameover = False
running = False
pygame.quit()