From a55be7234204b100e7a29bad57ad942612e7bde5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Wilczy=C5=84ska?= Date: Mon, 25 Mar 2019 16:03:25 +0100 Subject: [PATCH 1/4] Added statistics utils --- game.py | 3 ++- sprites/garbage_collector.py | 14 ++++++++++++++ sprites/house.py | 5 ++++- utils.py | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/game.py b/game.py index d9d4def..d3be8b2 100644 --- a/game.py +++ b/game.py @@ -7,7 +7,7 @@ from pygame.locals import * import utils ##INITIALIZE STATIC VARIABLES######### -FPS = 60 +FPS = 20 all_sprites = sprite.Group() fps_clock = time.Clock() @@ -59,6 +59,7 @@ while(1): if(type(item) == House): item.generate_rubbish() + utils.get_statistics(all_sprites) display.flip() fps_clock.tick(FPS) ################################################################################## diff --git a/sprites/garbage_collector.py b/sprites/garbage_collector.py index 89b7544..1185e59 100644 --- a/sprites/garbage_collector.py +++ b/sprites/garbage_collector.py @@ -4,6 +4,8 @@ from sprites.cell import Cell class Garbage_collector(Cell): def __init__(self, x, y): + GC_CAPACITY = 10 + Cell.__init__(self, x, y) self.image = pygame.image.load("images/garbage_collector.png") self.move_options = { @@ -12,6 +14,12 @@ class Garbage_collector(Cell): "left": lambda forbidden: ('x', self.x - 1) if (self.x - 1, self.y) not in forbidden else ('x', self.x), "right": lambda forbidden: ('x', self.x + 1) if (self.x + 1, self.y) not in forbidden else ('x', self.x) } + self.trash_space_taken = { + "plastic": 0, + "glass": 0, + "metal": 0 + } + self.trash_collected = 0 def move(self, direction, forbidden): (destination, value) = self.move_options[direction](forbidden) @@ -21,3 +29,9 @@ class Garbage_collector(Cell): self.y = value self.update() + + def get_collect_data(self): + return self.trash_collected + + def get_space_data(self): + return self.trash_space_taken diff --git a/sprites/house.py b/sprites/house.py index 8ac9576..a101078 100644 --- a/sprites/house.py +++ b/sprites/house.py @@ -22,7 +22,7 @@ class House(Cell): self.max_metal = max_metal def generate_rubbish(self): - if(random.randint(0, 50) == 1): # 1/5 szansa na wyrzucenie śmiecia w klatce + if(random.randint(0, 25) == 1): # 1/25 szansa na wyrzucenie śmiecia w klatce thrash_type = random.randint(0, 2) self.rubbish[thrash_type] = self.rubbish[thrash_type] + 1 @@ -48,3 +48,6 @@ class House(Cell): def check_rubbish_status(self): print("plastic: " + str(self.rubbish[PLASTIC]) + " glass: " + str( self.rubbish[GLASS]) + " metal: " + str(self.rubbish[METAL])) + + def get_rubbish_data(self): + return self.rubbish diff --git a/utils.py b/utils.py index 46cc6f8..4cd11bf 100644 --- a/utils.py +++ b/utils.py @@ -87,3 +87,36 @@ def generate_garbage_collector(all_sprites, obstacles_coords): all_sprites.add(gc) return gc ################################################################################## + +##GET STATISTICS################################################################## + +def get_statistics(all_sprites): + ###Garbage collector stats### + gc_taken_space_plastic = 0 + gc_taken_space_metal = 0 + gc_taken_space_glass = 0 + gc_trash_space = 10 + + ###Board stats############### + plastic_left = 0 + metal_left = 0 + glass_left = 0 + total_gathered = 0 + + for item in all_sprites: + if(type(item) == House): + rubbish = item.get_rubbish_data() + plastic_left += rubbish[0] + glass_left += rubbish[1] + metal_left += rubbish[2] + if(type(item) == Garbage_collector): + space_taken = item.get_space_data() + gc_taken_space_plastic += space_taken.get("plastic") + gc_taken_space_glass += space_taken.get("glass") + gc_taken_space_metal += space_taken.get("metal") + total_gathered += item.get_collect_data() + + print("plastic left: "+str(plastic_left)+" | glass left: "+str(glass_left)+" | metal left: "+str(metal_left)) + print(" plastic: "+str(gc_taken_space_plastic)+"/"+str(gc_trash_space)+" | glass: "+str(gc_taken_space_glass)+"/"+str(gc_trash_space)+" | metal: "+str(gc_taken_space_metal)+"/"+str(gc_trash_space)) + print("### TOTAL COLLECTED: "+str(total_gathered)+" ###") +################################################################################## From 84f33fd118f95d0866fe7dab65ecc305aec1d4c5 Mon Sep 17 00:00:00 2001 From: Anna Nowak Date: Mon, 25 Mar 2019 16:10:51 +0100 Subject: [PATCH 2/4] tmp --- README.md | 1 - config.py | 1 + fonts/Bazgroly.ttf | Bin 0 -> 36040 bytes game.py | 6 ++++-- sprites/hud.py | 24 ++++++++++++++++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 fonts/Bazgroly.ttf create mode 100644 sprites/hud.py diff --git a/README.md b/README.md index 54a71a7..1de169f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ ```yaml Modele: Smieciarka: - - Zbiera smieci - posiada liste smieci (pojemnosc), - zbiera smieci, - segreguje smieci, diff --git a/config.py b/config.py index 6bb4bb0..6fac672 100644 --- a/config.py +++ b/config.py @@ -24,3 +24,4 @@ home_amount = set_home_amount() PLAY_WIDTH = (home_amount+2)*CELL_SIZE PLAY_HEIGHT = PLAY_WIDTH +HUD_HEIGHT = int(home_amount*CELL_SIZE/4) diff --git a/fonts/Bazgroly.ttf b/fonts/Bazgroly.ttf new file mode 100644 index 0000000000000000000000000000000000000000..44bfd5f4b130f49622d5b40aa0173c0cce831963 GIT binary patch literal 36040 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 literal 0 HcmV?d00001 diff --git a/game.py b/game.py index d9d4def..15b2bc3 100644 --- a/game.py +++ b/game.py @@ -1,8 +1,9 @@ from pygame import * import sys import random -from config import PLAY_WIDTH, PLAY_HEIGHT, home_amount +from config import PLAY_WIDTH, PLAY_HEIGHT, HUD_HEIGHT, home_amount from sprites.house import House +from sprites.hud import Hud from pygame.locals import * import utils @@ -20,8 +21,9 @@ obstacles_coords = [] ##GAMEWINDOW########################## WINDOW_WIDTH = PLAY_WIDTH -WINDOW_HEIGHT = PLAY_HEIGHT +WINDOW_HEIGHT = PLAY_HEIGHT + HUD_HEIGHT GAMEWINDOW = display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT), 0, 32) +hud = Hud(home_amount,WINDOW_WIDTH, WINDOW_HEIGHT,GAMEWINDOW) display.set_caption('Smieciarz WMI') icon = image.load('images/icon.png') display.set_icon(icon) diff --git a/sprites/hud.py b/sprites/hud.py new file mode 100644 index 0000000..a7f18d5 --- /dev/null +++ b/sprites/hud.py @@ -0,0 +1,24 @@ +import pygame +from config import HUD_HEIGHT +HUD_COLOR = (51,21,4) +WHITE = (255,255,255) +class Hud(): + texts = [] + def __init__(self,house_amount,WINDOW_WIDTH, WINDOW_HEIGHT,GAMEWINDOW): + pygame.init() + hud_upper = WINDOW_WIDTH - HUD_HEIGHT + hud_lower = WINDOW_WIDTH + height = hud_upper - hud_lower + font_type = 'fonts/Bazgroly.ttf' + font_size = house_amount * 2 + GAMEWINDOW.fill(HUD_COLOR) + font = pygame.font.Font(font_type, font_size) + + gc_plastic_text = font.render("Plastic: 0/0",True,WHITE) + gc_metal_text = font.render("Metal: 0/0",True,WHITE) + gc_glass_text = font.render("Glass: 0/0",True,WHITE) + map_plastic_text = font.render("Plastic: 0",True,WHITE) + map_metal_text = font.render("Metal: 0",True,WHITE) + map_glass_text = font.render("Glass: 0",True,WHITE) + overall_text = font.render("Garbage thrown away: 0",True,WHITE) + GAMEWINDOW.blit(overall_text,(20, 20)) From 4d807fe0c925f33d1f2759bab6f1979fb1fbcee4 Mon Sep 17 00:00:00 2001 From: Anna Nowak Date: Mon, 25 Mar 2019 16:19:24 +0100 Subject: [PATCH 3/4] cleaning time --- game.py | 2 +- sprites/hud.py | 32 ++++++++++++++++++++++++++++++++ utils.py | 33 --------------------------------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/game.py b/game.py index b1927ce..384f503 100644 --- a/game.py +++ b/game.py @@ -61,7 +61,7 @@ while(1): if(type(item) == House): item.generate_rubbish() - utils.get_statistics(all_sprites) + hud.get_statistics(all_sprites) display.flip() fps_clock.tick(FPS) ################################################################################## diff --git a/sprites/hud.py b/sprites/hud.py index a7f18d5..1d552bc 100644 --- a/sprites/hud.py +++ b/sprites/hud.py @@ -1,4 +1,6 @@ import pygame +from sprites.house import House +from sprites.garbage_collector import Garbage_collector from config import HUD_HEIGHT HUD_COLOR = (51,21,4) WHITE = (255,255,255) @@ -22,3 +24,33 @@ class Hud(): map_glass_text = font.render("Glass: 0",True,WHITE) overall_text = font.render("Garbage thrown away: 0",True,WHITE) GAMEWINDOW.blit(overall_text,(20, 20)) + + def get_statistics(self, all_sprites): + ###Garbage collector stats### + gc_taken_space_plastic = 0 + gc_taken_space_metal = 0 + gc_taken_space_glass = 0 + gc_trash_space = 10 + + ###Board stats############### + plastic_left = 0 + metal_left = 0 + glass_left = 0 + total_gathered = 0 + + for item in all_sprites: + if(type(item) == House): + rubbish = item.get_rubbish_data() + plastic_left += rubbish[0] + glass_left += rubbish[1] + metal_left += rubbish[2] + if(type(item) == Garbage_collector): + space_taken = item.get_space_data() + gc_taken_space_plastic += space_taken.get("plastic") + gc_taken_space_glass += space_taken.get("glass") + gc_taken_space_metal += space_taken.get("metal") + total_gathered += item.get_collect_data() + + print("plastic left: "+str(plastic_left)+" | glass left: "+str(glass_left)+" | metal left: "+str(metal_left)) + print(" plastic: "+str(gc_taken_space_plastic)+"/"+str(gc_trash_space)+" | glass: "+str(gc_taken_space_glass)+"/"+str(gc_trash_space)+" | metal: "+str(gc_taken_space_metal)+"/"+str(gc_trash_space)) + print("### TOTAL COLLECTED: "+str(total_gathered)+" ###") diff --git a/utils.py b/utils.py index 4cd11bf..46cc6f8 100644 --- a/utils.py +++ b/utils.py @@ -87,36 +87,3 @@ def generate_garbage_collector(all_sprites, obstacles_coords): all_sprites.add(gc) return gc ################################################################################## - -##GET STATISTICS################################################################## - -def get_statistics(all_sprites): - ###Garbage collector stats### - gc_taken_space_plastic = 0 - gc_taken_space_metal = 0 - gc_taken_space_glass = 0 - gc_trash_space = 10 - - ###Board stats############### - plastic_left = 0 - metal_left = 0 - glass_left = 0 - total_gathered = 0 - - for item in all_sprites: - if(type(item) == House): - rubbish = item.get_rubbish_data() - plastic_left += rubbish[0] - glass_left += rubbish[1] - metal_left += rubbish[2] - if(type(item) == Garbage_collector): - space_taken = item.get_space_data() - gc_taken_space_plastic += space_taken.get("plastic") - gc_taken_space_glass += space_taken.get("glass") - gc_taken_space_metal += space_taken.get("metal") - total_gathered += item.get_collect_data() - - print("plastic left: "+str(plastic_left)+" | glass left: "+str(glass_left)+" | metal left: "+str(metal_left)) - print(" plastic: "+str(gc_taken_space_plastic)+"/"+str(gc_trash_space)+" | glass: "+str(gc_taken_space_glass)+"/"+str(gc_trash_space)+" | metal: "+str(gc_taken_space_metal)+"/"+str(gc_trash_space)) - print("### TOTAL COLLECTED: "+str(total_gathered)+" ###") -################################################################################## From d2423de7450e189750b92e17766d3fbe880e9154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Wilczy=C5=84ska?= Date: Mon, 25 Mar 2019 17:41:24 +0100 Subject: [PATCH 4/4] Added basic methods for collecting garbage --- game.py | 2 +- sprites/cell.py | 2 +- sprites/garbage_collector.py | 24 ++++++++++++++++++++++++ sprites/house.py | 5 +++++ sprites/hud.py | 2 +- sprites/landfill.py | 2 +- 6 files changed, 33 insertions(+), 4 deletions(-) diff --git a/game.py b/game.py index f692ce0..4760b50 100644 --- a/game.py +++ b/game.py @@ -64,5 +64,5 @@ while(1): hud.get_statistics(all_sprites) display.flip() - fps_clock.tick(FPS) + fps_clock.tick(FPS) ################################################################################## diff --git a/sprites/cell.py b/sprites/cell.py index fe232f0..31f73f2 100644 --- a/sprites/cell.py +++ b/sprites/cell.py @@ -15,4 +15,4 @@ class Cell(pygame.sprite.Sprite): def update(self): self.rect = pygame.Rect( - self.x*CELL_SIZE, self.y*CELL_SIZE, CELL_SIZE, CELL_SIZE) + self.x*CELL_SIZE, self.y*CELL_SIZE, CELL_SIZE, CELL_SIZE) diff --git a/sprites/garbage_collector.py b/sprites/garbage_collector.py index 229b16c..579202d 100644 --- a/sprites/garbage_collector.py +++ b/sprites/garbage_collector.py @@ -1,5 +1,6 @@ import pygame from sprites.cell import Cell, CELL_SIZE +from from config import PLAY_HEIGHT, PLAY_WIDTH class Garbage_collector(Cell): @@ -28,6 +29,29 @@ class Garbage_collector(Cell): elif(destination is 'y'): self.y = value self.update() +PLASTIC = 0 # blue +GLASS = 1 # green +METAL = 2 # yellow + def collect_trash(self, house): + rubbish = house.get_rubbish_data() + to_collect = rubbish + + if(rubbish[0] > GC_CAPACITY - self.trash_space_taken.get("plastic")): + to_collect[0] = self.trash_space_taken.get("plastic") + self.trash_space_taken['plastic'] += to_collect[0] + self.trash_collected += to_collect[0] + + if(rubbish[1] > GC_CAPACITY - self.trash_space_taken.get("glass")): + to_collect[1] = self.trash_space_taken.get("glass") + self.trash_space_taken['glass'] += to_collect[1] + self.trash_collected += to_collect[1] + + if(rubbish[2] > GC_CAPACITY - self.trash_space_taken.get("metal")): + to_collect[2] = self.trash_space_taken.get("metal") + self.trash_space_taken['metal'] += to_collect[2] + self.trash_collected += to_collect[2] + + house.give_away_rubbish(to_collect[0], to_collect[1], to_collect[2]) def get_collect_data(self): return self.trash_collected diff --git a/sprites/house.py b/sprites/house.py index a101078..699a579 100644 --- a/sprites/house.py +++ b/sprites/house.py @@ -44,6 +44,11 @@ class House(Cell): self.image = pygame.image.load(House_image.glass.value) #szklo elif(self.rubbish[METAL] > self.max_metal): self.image = pygame.image.load(House_image.metal.value) #metal + + def give_away_rubbish(self, plastic, glass, metal): + self.rubbish[PLASTIC] -= plastic + self.rubbish[GLASS] -= glass + self.rubbish[METAL] -= metal def check_rubbish_status(self): print("plastic: " + str(self.rubbish[PLASTIC]) + " glass: " + str( diff --git a/sprites/hud.py b/sprites/hud.py index 1d552bc..ca2b94a 100644 --- a/sprites/hud.py +++ b/sprites/hud.py @@ -53,4 +53,4 @@ class Hud(): print("plastic left: "+str(plastic_left)+" | glass left: "+str(glass_left)+" | metal left: "+str(metal_left)) print(" plastic: "+str(gc_taken_space_plastic)+"/"+str(gc_trash_space)+" | glass: "+str(gc_taken_space_glass)+"/"+str(gc_trash_space)+" | metal: "+str(gc_taken_space_metal)+"/"+str(gc_trash_space)) - print("### TOTAL COLLECTED: "+str(total_gathered)+" ###") + print("### TOTAL COLLECTED: "+str(total_gathered)+" ###") diff --git a/sprites/landfill.py b/sprites/landfill.py index eb99679..e4d2262 100644 --- a/sprites/landfill.py +++ b/sprites/landfill.py @@ -8,4 +8,4 @@ class Landfill(Cell): Cell.__init__(self, x, y) types = ["plastic", "glass", "metal"] self.type = types[type] - self.image = pygame.image.load("images/landfill_%s.png" % (self.type)) + self.image = pygame.image.load("images/landfill_%s.png" % (self.type))