diff --git a/README.md b/README.md index 61ec120..7d64d1d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,26 @@ -# InteractiveProgramming -This is the base repo for the interactive programming project for Software Design, Spring 2016 at Olin College. +# Motherload: Cabbage Rendition +@authors: Sung Park, Willem Thorbecke + +*Motherload: Cabbage Rendition* is a recreation of Motherload using pygame. This project was created as a part of Olin College Software Design course for Spring 2016. + +##Install + +To run *Motherload: Cabbage Rendition*, you need to install pygame. + +Run below code in your terminal to intsall pygame. + +``` +$ sudo apt-get install python-pygame +``` + +Download the repository to your local environment through cloning this repository or downloading as a zip. + +##Run + +Run motherload.py to start the program. + +``` +$ python motherload.py +``` + +You are all set. Enjoy the game. diff --git a/amazonite.png b/amazonite.png new file mode 100644 index 0000000..3c4b0c2 Binary files /dev/null and b/amazonite.png differ diff --git a/emerald.png b/emerald.png new file mode 100644 index 0000000..32ba4f2 Binary files /dev/null and b/emerald.png differ diff --git a/fuel_station.gif b/fuel_station.gif new file mode 100644 index 0000000..82cf790 Binary files /dev/null and b/fuel_station.gif differ diff --git a/game_model.py b/game_model.py new file mode 100644 index 0000000..74b4c24 --- /dev/null +++ b/game_model.py @@ -0,0 +1,280 @@ +import random +from random import choice +import pygame +from pygame.locals import QUIT, KEYDOWN, MOUSEMOTION +import time +""" + Class containing the game model and all its components +""" + + +class Brick(pygame.sprite.Sprite): + """ + Creates a brick class + + Key attributes: color, type + "Brown" color represents soil and "Black" color represents an empty spot + """ + + + # Constructor. Pass in the color of the brick, + # and its x and y position + def __init__(self, left, top, width, height, first): + # Call the parent class (Sprite) constructor + pygame.sprite.Sprite.__init__(self) + + # Create an image of the block, and fill it with a color. + # This could also be an image loaded from the disk. + self.image = pygame.Surface([width, height]) + + + # Fetch the rectangle object that has the dimensions of the image + # Update the position of this object by setting the values of rect.x and rect.y + self.rect = self.image.get_rect() + + #This if statement is executed during initalized of the world at the start of the game. + if first: + self.rect.x = left*width - width*9 #renders 9 extra columns of blocks off screen to the left + self.rect.y = top*height #top*height + height*2 - 1 #starts the world with a 2 block high sky + self.width = width + self.height = height + self.top = top*height #+ height*2 -1 + self.left = left*width - width*9 + + if top == 0 or top == 1: + self.color = "black" + return + random_seed = random.random() + if random_seed < 0.1: + self.color = "black" + self.brick_type = "empty" + elif random_seed <0.9: + self.color = "brown" + self.brick_type = "soil" + else: + self.color = "brown" + self.brick_type = choice(["ruby", "emerald", "amazonite", "sapphire", "watsonite"]) + if self.brick_type == "ruby": + self.image = pygame.image.load('ruby.png').convert() + self.image.set_colorkey((255,255,255)) + elif self.brick_type == "emerald": + self.image = pygame.image.load('emerald.png').convert() + self.image.set_colorkey((0,0,0)) + elif self.brick_type == "amazonite": + self.image = pygame.image.load('amazonite.png').convert() + self.image.set_colorkey((0,0,0)) + elif self.brick_type == "sapphire": + self.image = pygame.image.load('sapphire.png').convert() + self.image.set_colorkey((0,0,0)) + elif self.brick_type == "watsonite": + self.image = pygame.image.load('watsonite.png').convert() + self.image.set_colorkey((255,255,255)) + #This else statement is executed during "terrain generation" phase of the game + else: + self.rect.x = left + self.rect.y = top + self.top = top + self.left = left + self.width = width + self.height = height + random_seed = random.random() + if random_seed < 0.1: + self.color = "black" + self.brick_type = "empty" + elif random_seed <0.9: + self.color = "brown" + self.brick_type = "soil" + else: + self.color = "brown" + self.brick_type = choice(["ruby", "emerald", "amazonite", "sapphire", "watsonite"]) + if self.brick_type == "ruby": + self.image = pygame.image.load('ruby.png').convert() + self.image.set_colorkey((255,255,255)) + elif self.brick_type == "emerald": + self.image = pygame.image.load('emerald.png').convert() + self.image.set_colorkey((0,0,0)) + elif self.brick_type == "amazonite": + self.image = pygame.image.load('amazonite.png').convert() + self.image.set_colorkey((0,0,0)) + elif self.brick_type == "sapphire": + self.image = pygame.image.load('sapphire.png').convert() + self.image.set_colorkey((0,0,0)) + elif self.brick_type == "watsonite": + self.image = pygame.image.load('watsonite.png').convert() + self.image.set_colorkey((255,255,255)) + + +class FuelStation(pygame.sprite.Sprite): + """ + Fuel station object. It has the fixed position of (400,40) + """ + + def __init__(self): + pygame.sprite.Sprite.__init__(self) + + self.image = pygame.image.load('fuel_station.gif').convert() + + self.left = 400 + self.top = 40 + self.width = 40 + self.height = 40 + #self.image.fill((0,255,255)) + + # Fetch the rectangle object that has the dimensions of the image + # Update the position of this object by setting the values of rect.x and rect.y + self.rect = self.image.get_rect() + self.rect.x = 400 + self.rect.y = 40 + + +class Workshop(pygame.sprite.Sprite): + """ + Workshop tile where the vehicle can upgrade its fuel tank + Fixed position at (560, 40) + """ + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load('workshop.png') + self.rect = self.image.get_rect() + + self.left = 560 + self.top = 40 + self.width = 40 + self.height = 40 + self.rect.x = 560 + self.rect.y = 40 + + +class Shop(pygame.sprite.Sprite): + """ + Shop tile where the vehicle can sell its minerals. + It has the fixed position at (480,40) + """ + + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load('store.jpg').convert() + self.rect = self.image.get_rect() + + self.left = 480 + self.top = 40 + self.width = 40 + self.height = 40 + self.rect.x = 480 + self.rect.y = 40 + + + +class Vehicle(pygame.sprite.Sprite): + + """ Represents the vehicle""" + + def __init__(self, left, top, width, height): + pygame.sprite.Sprite.__init__(self) + + self.image = pygame.Surface([width, height]) + + + #Attributes that checks for the available action at the vehicle's current position + self.rect = self.image.get_rect() + self.can_drill_left = False + self.can_drill_right = False + self.can_drill_down = False + self.can_move_up = True + self.can_move_left = True + self.can_move_right = True + + self.left = left + self.top = top + self.width = width + self.height = height + self.thruster = False + self.speed = 0 + + self.gravity = .1 + self.thruster_veloc = -.1 + + self.rect.x = left + self.rect.y = top + self.image.fill((0,220,255)) + + +class BrickModel(object): + """ Stores the game state for our brick breaker game """ + def __init__(self): + #self.bricks = [][] + self.enlarger_helper = None + self.can_move_down = True #checks if the blocks free to fall downward + self.world = [] + self.MARGIN = 0 + self.BRICK_WIDTH = 40 + self.BRICK_HEIGHT = 40 + self.SCREEN_WIDTH = 640 + self.SCREEN_HEIGHT = 480 + self.FAR_LEFT = 320 + self.FAR_RIGHT = 320 + self.FAR_BOTTOM = self.SCREEN_HEIGHT + self.BRICK_HEIGHT*4 #the threshold for adding more blocks is 5 blocks from the bottom of the screen + + + self.init_height_dist = 32 #number of rows of blocks + self.init_width_dist = 34 #number of columns of blocks + + self.sprite_list = pygame.sprite.Group() #a list of sprites to be drawn + + + #initialize world + for top in range(0,self.init_height_dist): + self.world.append([]) + for left in range(0,self.init_width_dist): + brick = Brick(left, top, self.BRICK_WIDTH, self.BRICK_HEIGHT, True) + self.world[top].append(brick) + if not (top ==1 or top ==0): + if brick.brick_type != "empty" and brick.brick_type != "soil": + self.sprite_list.add(brick) + self.temp_world = self.world + + self.fuel = 3000 + self.max_fuel = 3000 + + #counter for minerals + self.red_block = 0 + self.green_block = 0 + self.orange_block = 0 + self.blue_block = 0 + self.purple_block = 0 + + self.money = 0 + + self.score = 0 + + self.vehicle = Vehicle(40*8,25, 25, 25) + + self.fuel_station = FuelStation() + self.sprite_list.add(self.fuel_station) + self.shop = Shop() + self.sprite_list.add(self.shop) + self.workshop = Workshop() + self.sprite_list.add(self.workshop) + + def world_enlarger(self, what_side): + """ + Function that enlarges the array that represents the map in our game when the vehicle reaches the bottom of the array + """ + + if what_side == "left": + pass + + elif what_side == "right": + pass + + elif what_side == "down": + + for top in range(0,5): # cycles through 5 blocks + self.world.append([]) #creates a row (list) to be filled with bricks + for left in range(0,self.init_width_dist): + + + brick = Brick(self.world[0][0].left+left*self.BRICK_WIDTH, self.world[-2][0].top + self.BRICK_HEIGHT, self.BRICK_WIDTH, self.BRICK_HEIGHT, False) + self.world[-1].append(brick) + if brick.brick_type != "soil" and brick.brick_type != "empty": + self.sprite_list.add(brick) diff --git a/motherload.py b/motherload.py new file mode 100644 index 0000000..3d8498f --- /dev/null +++ b/motherload.py @@ -0,0 +1,495 @@ +import pygame, os, sys +from pygame.locals import * +import time +from random import choice +import random +import game_model +import pygame, os, sys +import math + + +class GameViewer(object): + """ Visualizes the game world defined by the brick objects, vehicle, shop, workshop and fuel station""" + def __init__(self, model, screen): + """ Initialize the view with the specified model + and screen. """ + self.model = model + self.screen = screen + self.running = True + + + def draw(self): + """ Draws the game state to the screen """ + + myFont = pygame.font.SysFont("monospace",15) + game_over_font = pygame.font.SysFont("monospace",100) + + self.screen.fill(pygame.Color('black')) + + # draw the block to the screen + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + + #pulls the appropriate block model from the list + brick = self.model.temp_world[top][left] + + #if there are bricks surrounding the current block, then continue + if not (left == 0 or top == 0 or top == len(self.model.temp_world) -1 or left == len(self.model.temp_world[0])-1) and pygame.sprite.collide_rect(brick,self.model.vehicle): + + #define the 8 surrounding bricks + brick_left = self.model.temp_world[top][left-1] + brick_top_left = self.model.temp_world[top-1][left-1] + brick_top_right = self.model.temp_world[top-1][left+1] + brick_bottom_left = self.model.temp_world[top+1][left-1] + brick_bottom_right = self.model.temp_world[top+1][left+1] + brick_right = self.model.temp_world[top][left+1] + brick_bottom = self.model.temp_world[top+1][left] + brick_top = self.model.temp_world[top-1][left] + + #predefines collision which the surrounding blocks as True + t = True + tl = True + tr = True + + l = True + r = True + + bl = True + b = True + br = True + + #checks collision with each surround block, and if touching, sets the collision variable to True, else false + if pygame.sprite.collide_rect(brick,self.model.vehicle): + + if pygame.sprite.collide_rect(self.model.vehicle,brick_left): #checks collision with left brick + l = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_left): + l = False + + if pygame.sprite.collide_rect(self.model.vehicle,brick_right): #checks collision with right + r = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_right): + r = False + + if pygame.sprite.collide_rect(self.model.vehicle,brick_top): #checks collision with top + t = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_top): + t = False + + if pygame.sprite.collide_rect(self.model.vehicle,brick_bottom): #checks collision with bottom + b = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_bottom): + b = False + + if pygame.sprite.collide_rect(self.model.vehicle,brick_bottom_left): #checks collision with bottom left + bl = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_bottom_left): + bl = False + + if pygame.sprite.collide_rect(self.model.vehicle,brick_bottom_right): #checks collision with bottom right + br = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_bottom_right): + br = False + + if pygame.sprite.collide_rect(self.model.vehicle,brick_top_left): #checks collision with top left + tl = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_top_left): + tl = False + + if pygame.sprite.collide_rect(self.model.vehicle,brick_top_right): #checks collision with top right + tr = True + elif not pygame.sprite.collide_rect(self.model.vehicle,brick_top_right): + tr = False + + + + #checks if there are blocks above, and if so, dissallow the user from traveling upwards + if t and not tl and not tr: + + if brick_top.color == "black": + self.model.vehicle.can_move_up = True + else: + self.model.vehicle.can_move_up = False + elif (tl and t): + if brick_top.color == "black" and brick_top_left.color == "black": + self.model.vehicle.can_move_up = True + else: + self.model.vehicle.can_move_up = False + elif (t and tr): + if brick_top.color == "black" and brick_top_right.color == "black": + self.model.vehicle.can_move_up = True + else: + self.model.vehicle.can_move_up = False + else: + self.model.vehicle.can_move_up = True + + #checks if there are blocks below, if not, allow for free fall + if b and not bl and not br: + if brick_bottom.color == "black": + self.model.can_move_down = True + else: + self.model.can_move_down = False + elif b and bl: + if brick_bottom.color == "black" and brick_bottom_left == "black": + self.model.can_move_down = True + else: + self.model.can_move_down = False + elif b and br: + if brick_bottom.color == "black" and brick_bottom_right.color == "black": + self.model.can_move_down = True + else: + self.model.can_move_down = False + elif brick.color == "black" and not b and not bl and not br: + self.model.can_move_down = True + + #checks if there are bricks touching to the left and bottom, if so turn on drilling + if l and bl: + if brick_left.color == "black": + self.model.vehicle.can_move_left = True + else: + self.model.vehicle.can_move_left = False + + if r and br: + if brick_right.color == "black": + self.model.vehicle.can_move_right = True + else: + self.model.vehicle.can_move_right = False + + #checks for drilling to the right, True if there are blocks to the right + if l and b and not self.model.can_move_down: + if brick_left.color != "black" and brick_bottom.color != "black": + + self.model.vehicle.can_drill_left = True + else: + self.model.vehicle.can_drill_left = False + + if r and b and not self.model.can_move_down: + if brick_right.color != "black" and brick_bottom.color != "black": + self.model.vehicle.can_drill_right = True + else: + self.model.vehicle.can_drill_right = False + + if b: + if brick_bottom.color != "black": + self.model.vehicle.can_drill_down = True + else: + self.model.vehicle.can_drill_down = False + + + r = pygame.Rect(brick.left, brick.top, brick.width, brick.height) + + #checks if player has mined a mineral, if so increments the mineral count + if not (top == 0 or top ==1): + if math.fabs(brick.left - self.model.vehicle.left) < 20 and math.fabs(self.model.vehicle.top - brick.top)<20: #checks if the vehicle overlaps a block, if so change block to black (empty) + if brick.brick_type == "ruby": + self.model.red_block += 1 + self.model.score += 100 + brick.image.fill((0,0,0)) + brick.image.set_colorkey((0,0,0)) + elif brick.brick_type == "emerald": + self.model.green_block += 1 + self.model.score += 100 + brick.image.fill((0,0,0)) + brick.image.set_colorkey((0,0,0)) + elif brick.brick_type == "amazonite": + self.model.orange_block += 1 + self.model.score += 100 + brick.image.fill((0,0,0)) + brick.image.set_colorkey((0,0,0)) + elif brick.brick_type == "sapphire": + self.model.blue_block += 1 + self.model.score += 100 + brick.image.fill((0,0,0)) + brick.image.set_colorkey((0,0,0)) + elif brick.brick_type == "watsonite": + self.model.purple_block += 1 + self.model.score += 100 + brick.image.fill((0,0,0)) + brick.image.set_colorkey((0,0,0)) + + brick.color = "black" + brick.brick_type = "empty" + pygame.draw.rect(self.screen, pygame.Color(brick.color), r) + + else: + pygame.draw.rect(self.screen, pygame.Color(brick.color), r) + + + + r = pygame.Rect(self.model.vehicle.left,self.model.vehicle.top,self.model.vehicle.width,self.model.vehicle.height) #the mining vehicle + + pygame.draw.rect(self.screen, pygame.Color('white'), r) + + r = pygame.Rect(self.model.fuel_station.left,self.model.fuel_station.top,self.model.fuel_station.width,self.model.fuel_station.height) #defines fuel station + + pygame.draw.rect(self.screen, pygame.Color('deep pink'),r) + + self.model.sprite_list.draw(self.screen) + + r = pygame.Rect(self.model.shop.left,self.model.shop.top,self.model.shop.width,self.model.shop.height) #defines the shop + + #Vehicle visiting fuel station + if pygame.sprite.collide_rect(self.model.fuel_station, self.model.vehicle): #checks collision with fuel station + self.model.fuel = self.model.max_fuel + + #Vehicle visiting shop + if pygame.sprite.collide_rect(self.model.shop, self.model.vehicle): + self.model.money += 100 * self.model.red_block + self.model.money += 100 * self.model.green_block + self.model.money += 100 * self.model.orange_block + self.model.money += 100 * self.model.blue_block + self.model.money += 100 * self.model.purple_block + self.model.red_block = 0 + self.model.green_block = 0 + self.model.orange_block = 0 + self.model.blue_block = 0 + self.model.purple_block = 0 + + #Vehicle visiting workshop + if pygame.sprite.collide_rect(self.model.workshop, self.model.vehicle): + if self.model.money >= 500: + self.model.money -= 500 + self.model.max_fuel += 500 + + #ends game if player runs out of fuels + if self.model.fuel <= 0: + msg = game_over_font.render("GAME OVER",1,(255,255,0)) + screen.blit(msg, (0, 240)) + else: + timer = myFont.render(str(self.model.fuel), 1, (255,255,0)) + screen.blit(timer, (20,20)) + + #increments minterals based on drilling + red_counter = myFont.render("Red: " + str(self.model.red_block), 1, (255,255,0)) + screen.blit(red_counter,(540,20)) + + green_counter = myFont.render("Green: " + str(self.model.green_block), 1, (255,255,0)) + screen.blit(green_counter,(540,40)) + + orange_counter = myFont.render("Orange: " + str(self.model.orange_block), 1, (255,255,0)) + screen.blit(orange_counter,(540,60)) + + blue_counter = myFont.render("Blue: " + str(self.model.blue_block), 1, (255,255,0)) + screen.blit(blue_counter,(540,80)) + + purple_counter = myFont.render("Purplpe: " + str(self.model.purple_block), 1, (255,255,0)) + screen.blit(purple_counter,(540,100)) + + money_counter = myFont.render("Money: " + str(self.model.money), 1, (255,255, 0)) + screen.blit(money_counter, (540,120)) + + score_counter = myFont.render("Score: " + str(self.model.score), 1, (255,255, 0)) + screen.blit(score_counter, (540,140)) + + pygame.display.update() + + + +class KeyboardController(object): + def __init__(self, model,view): + self.model = model + self.view = view + + def handle_event(self): + """ + handles any keyboard input + """ + + pygame.init() + + while self.view.running: + for event in pygame.event.get(): + if event.type == QUIT: + self.view.running = False + + if model.fuel < 0: + self.view.running = False + + + #checks if the world should enlarge + if self.model.temp_world[-1][0].top >= self.model.FAR_BOTTOM and self.model.temp_world[-1][0].top < self.model.FAR_BOTTOM + 40: + mistake = self.model.FAR_BOTTOM - self.model.temp_world[-1][0].top + self.model.world_enlarger("down") + + + #checks for key press + keys = pygame.key.get_pressed() + + + if keys[pygame.K_UP] and self.model.vehicle.can_move_up: + + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + brick = self.model.temp_world[top][left] + brick.top -= self.model.vehicle.speed_y + brick.rect.y = brick.top + + self.model.fuel_station.top -= self.model.vehicle.speed_y + self.model.fuel_station.rect.y = self.model.fuel_station.top + self.model.shop.top -= self.model.vehicle.speed_y + self.model.shop.rect.y = self.model.shop.top + self.model.workshop.top -= self.model.vehicle.speed_y + self.model.workshop.rect.y = self.model.workshop.top + + self.model.vehicle.speed_y = self.model.vehicle.speed_y + self.model.vehicle.thruster; + + if self.model.vehicle.speed_y > 1: + self.model.vehicle.speed_y = 0 + elif self.model.vehicle.speed_y > 10: + self.model.vehicle.speed_y = 10 + elif keys[pygame.K_UP] and not model.vehicle.can_move_up: + self.model.vehicle.speed_y = 0 + + + + if keys[pygame.K_LEFT] and not self.model.vehicle.can_drill_left and not self.model.vehicle.can_move_left: + pass + elif keys[pygame.K_LEFT] and self.model.vehicle.can_drill_left: + speed_x = .7 + #loops through the game model and moves all the blocks appropriately based off of key press + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + brick = self.model.temp_world[top][left] + brick.left += self.model.vehicle.speed_x + brick.rect.x = brick.left + #moves all game objects appropriately bassed off of key presses + self.model.fuel_station.left += self.model.vehicle.speed_x + self.model.fuel_station.rect.x = self.model.fuel_station.left + self.model.shop.left += self.model.vehicle.speed_x + self.model.shop.rect.x = self.model.shop.left + self.model.workshop.left += self.model.vehicle.speed_x + self.model.workshop.rect.x = self.model.workshop.left + + elif keys[pygame.K_LEFT] and self.model.vehicle.can_move_left: + speed_x = 2 + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + brick = self.model.temp_world[top][left] + brick.left += self.model.vehicle.speed_x + brick.rect.x = brick.left + self.model.fuel_station.left += self.model.vehicle.speed_x + self.model.fuel_station.rect.x = self.model.fuel_station.left + self.model.shop.left += self.model.vehicle.speed_x + self.model.shop.rect.x = self.model.shop.left + self.model.workshop.left += self.model.vehicle.speed_x + self.model.workshop.rect.x = self.model.workshop.left + + self.model.vehicle.speed_x = self.model.vehicle.speed_x + self.model.vehicle.thruster_x; + + if self.model.vehicle.speed_x > 1: + self.model.vehicle.speed_x = 0 + elif self.model.vehicle.speed_x > 10: + self.model.vehicle.speed_x = 10 + + if keys[pygame.K_RIGHT] and self.model.vehicle.can_drill_right: + + speed_x = .7 + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + brick = self.model.temp_world[top][left] + brick.left -= self.model.vehicle.speed_x + brick.rect.x = brick.left + self.model.fuel_station.left -= self.model.vehicle.speed_x + self.model.fuel_station.rect.x = self.model.fuel_station.left + self.model.shop.left -= self.model.vehicle.speed_x + self.model.shop.rect.x = self.model.shop.left + self.model.workshop.left -= self.model.vehicle.speed_x + self.model.workshop.rect.x = self.model.workshop.left + + elif keys[pygame.K_RIGHT] and self.model.vehicle.can_move_right: + speed_x = 2 + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + brick = self.model.temp_world[top][left] + brick.left -= self.model.vehicle.speed_x + brick.rect.x = brick.left + + self.model.fuel_station.left -= self.model.vehicle.speed_x + self.model.fuel_station.rect.x = self.model.fuel_station.left + self.model.shop.left -= self.model.vehicle.speed_x + self.model.shop.rect.x = self.model.shop.left + self.model.workshop.left -= self.model.vehicle.speed_x + self.model.workshop.rect.x = self.model.workshop.left + + self.model.vehicle.speed_x = self.model.vehicle.speed_x + self.model.vehicle.thruster_x; + + if self.model.vehicle.speed_x > 1: + self.model.vehicle.speed_x = 0 + elif self.model.vehicle.speed_x > 10: + self.model.vehicle.speed_x = 10 + + + if keys[pygame.K_DOWN] and not self.model.can_move_down and self.model.vehicle.can_drill_down: + + self.model.vehicle.speed_y = .7 + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + brick = self.model.temp_world[top][left] + brick.top -= self.model.vehicle.speed_y + brick.rect.y = brick.top + self.model.fuel_station.top -= self.model.vehicle.speed_y + self.model.fuel_station.rect.y = self.model.fuel_station.top + self.model.shop.top -= self.model.vehicle.speed_y + self.model.shop.rect.y = self.model.shop.top + self.model.workshop.top -= self.model.vehicle.speed_y + self.model.workshop.rect.y = self.model.workshop.top + + + elif self.model.can_move_down and not keys[pygame.K_UP]: + for top in range(len(self.model.temp_world)): + for left in range(len(self.model.temp_world[top])): + brick = self.model.temp_world[top][left] + brick.top -= self.model.vehicle.speed_y + brick.rect.y = brick.top + + + self.model.fuel_station.top -= self.model.vehicle.speed_y + + self.model.fuel_station.rect.y = self.model.fuel_station.top + + self.model.shop.top -= self.model.vehicle.speed_y + self.model.shop.rect.y = self.model.shop.top + + self.model.workshop.top -= self.model.vehicle.speed_y + self.model.workshop.rect.y = self.model.workshop.top + + self.model.vehicle.speed_y = self.model.vehicle.speed_y + self.model.vehicle.gravity + if self.model.vehicle.speed_y > 12: + self.model.vehicle.speed_y -=.5 + + + if not self.model.can_move_down and event.type != KEYDOWN: + self.model.vehicle.speed_y = 0 + if not self.model.vehicle.can_drill_left and not self.model.vehicle.can_drill_right and event.type != KEYDOWN: + self.model.vehicle.speed_x = 0 + + + + #self.view.draw() + self.model.fuel -= 1 #decrease fuel value every frame + self.view.draw() + return + + + +#clock = pygame.time.Clock() + +if __name__ == '__main__': + + + + pygame.init() + size = (640, 480) + screen = pygame.display.set_mode(size) + model = game_model.BrickModel() + view = GameViewer(model, screen) + controller = KeyboardController(model,view) + + controller.handle_event() + + + + + + + \ No newline at end of file diff --git a/ruby.png b/ruby.png new file mode 100644 index 0000000..6d9b515 Binary files /dev/null and b/ruby.png differ diff --git a/sapphire.png b/sapphire.png new file mode 100644 index 0000000..c6c835b Binary files /dev/null and b/sapphire.png differ diff --git a/store.jpg b/store.jpg new file mode 100644 index 0000000..c9f778a Binary files /dev/null and b/store.jpg differ diff --git a/watsonite.png b/watsonite.png new file mode 100644 index 0000000..f363734 Binary files /dev/null and b/watsonite.png differ diff --git a/workshop.png b/workshop.png new file mode 100644 index 0000000..c508e20 Binary files /dev/null and b/workshop.png differ diff --git a/writeup.pdf b/writeup.pdf new file mode 100644 index 0000000..930dac2 Binary files /dev/null and b/writeup.pdf differ