Untitled
unknown
plain_text
2 months ago
7.1 kB
8
Indexable
import pgzero
from random import randint, choice
TITLE = 'CROSS THE ROAD'
WIDTH = 800
HEIGHT = 700
lvls = { 'lvl1': {
"roads": {
"coordinates": [
[80, 0],
[240, 0],
[480, 0]
],
"tracks": [80, 160, 240, 320, 480, 560]
},
"grass": {
"coordinates": [
[0, 0],
[400, 0],
[640, 0],
[720, 0]
]
},
"finish": {
"coordinates": [760, 50]
},
"water": {
"coordinates": []
},
"logs": {
"coordinates": []
},
"enemies": {
"data": [
{
"x": 683,
"y": 300,
"max_y": 500,
"min_y": 150,
"speed": 3
}
]
},
"cars": ["big_track", "car_blue", "car_cyan", "car_grey",
"car_red", "car_white", "car_yellow", "track"],
"chicken": {
"coordinates": [43, 650]
}
},
'lvl2': {
"roads": {
"coordinates": [
[80, 0],
[480, 0]
],
"tracks": [80, 160, 480, 560]
},
"grass": {
"coordinates": [
[0, 0],
[320, 0],
[400, 0],
[640, 0],
[720, 0]
]
},
"water": {
"coordinates":[[240, 0]]
},
"logs": {
"coordinates":[[240, 30], [240, 300]]
},
"enemies": {
"data": [
{
"x": 683,
"y": 300,
"max_y": 500,
"min_y": 150,
"speed": 3
},
{
"x": 443,
"y": 300,
"max_y": 700,
"min_y": 100,
"speed": 2
}
]
},
"finish": {
"coordinates": [760, 50]
},
"cars": ["big_track", "car_blue", "car_cyan", "car_grey",
"car_red", "car_white", "car_yellow", "track"],
"chicken": {
"coordinates": [43, 650]
}
}
}
class Game:
def __init__(self, Actor):
self.actor = Actor
def make_car(self):
track = choice(self.tracks)
car = self.actor(choice(self.car_names), (43+track, randint(100, 700)))
car.track = track
self.tracks.remove(car.track)
car.speed = randint(1, 10)
return car
def init_lvl(self, lvl_name):
lvl = lvls[lvl_name]
self.roads = []
for coord in lvl['roads']['coordinates']:
self.roads.append(self.actor('road', topleft=coord))
self.grasses = []
for coord in lvl['grass']['coordinates']:
self.grasses.append(self.actor('grass', topleft=coord))
self.water_sprites = []
self.water_zones = []
for coord in lvl['water']['coordinates']:
self.water_sprites.append(self.actor('water', topleft=coord))
self.water_zones.append((coord[0], coord[0] + 80))
self.logs = []
self.log_rects = []
for coord in lvl['logs']['coordinates']:
log = self.actor(
choice(['log1', 'log2']), topleft=coord)
self.logs.append(log)
self.log_rects.append(
(coord[0], coord[1], coord[0] + log.width, coord[1] + log.height))
self.chicken = self.actor('chicken', lvl['chicken']['coordinates'])
self.finish = self.actor('flag_1', lvl['finish']['coordinates'])
self.finish.time = 0
self.tracks = lvl['roads']['tracks']
self.car_names = lvl['cars']
self.enemies = []
for enemy_data in lvl['enemies']['data']:
enemy = self.actor('enemy', (enemy_data['x'], enemy_data['y']))
enemy.speed = enemy_data['speed']
enemy.max_y = enemy_data['max_y']
enemy.min_y = enemy_data['min_y']
enemy.up = True
self.enemies.append(enemy)
self.cars = []
for _ in range(len(self.tracks)):
car = self.make_car()
self.cars.append(car)
def is_in_water(self, x):
for (wl, wr) in self.water_zones:
if wl <= x <= wr:
return True
return False
def is_on_log(self, x, y):
for (left, top, right, bottom) in self.log_rects:
if left <= x <= right and top <= y <= bottom:
return True
return False
def update_enemies(self):
for enemy in self.enemies:
if enemy.up:
enemy.y -= enemy.speed
if enemy.y < enemy.min_y:
enemy.up = False
else:
enemy.y += enemy.speed
if enemy.y > enemy.max_y:
enemy.up = True
def chicken_move_x(self, key, keys, WIDTH):
step = 80
if key == keys.RIGHT and self.chicken.x < WIDTH - 43:
self.chicken.x += step
elif key == keys.LEFT and self.chicken.x > 43:
self.chicken.x -= step
else:
return
if self.is_in_water(self.chicken.x):
if not self.is_on_log(self.chicken.x, self.chicken.y):
if key == keys.RIGHT:
self.chicken.x -= step
else:
self.chicken.x += step
def chicken_move_y(self, key, keys, HEIGHT):
step = 40
if key == keys.UP and self.chicken.y > 40:
self.chicken.y -= step
elif key == keys.DOWN and self.chicken.y < HEIGHT - 40:
self.chicken.y += step
else:
return
if self.is_in_water(self.chicken.x):
if not self.is_on_log(self.chicken.x, self.chicken.y):
if key == keys.UP:
self.chicken.y += step
else:
self.chicken.y -= step
gm = Game(Actor)
gm.init_lvl('lvl1')
explosion = Actor('explosion_0', (-100, -100))
explosion.time = 0
state = 'game'
def draw():
for grass in gm.grasses:
grass.draw()
for road in gm.roads:
road.draw()
for car in gm.cars:
car.draw()
for enemy in gm.enemies:
enemy.draw()
for water in gm.water_sprites:
water.draw()
for log in gm.logs:
log.draw()
gm.finish.draw()
gm.chicken.draw()
if state == 'pause':
screen.draw.text('PAUSE', fontsize=60,
center=(WIDTH//2, HEIGHT//2),
color='red')
if state == 'win':
screen.draw.text('WIN! PRESS SPACE', fontsize=60,
center=(WIDTH//2, HEIGHT//2),
color='green')
if state == 'loose':
screen.draw.text('GAME OVER!', fontsize=60,
center=(WIDTH//2, HEIGHT//2),
color='red')
explosion.draw()Editor is loading...
Leave a Comment