Untitled

 avatar
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