import pygame from classes import system from random import randrange pygame.mixer.init() #mina class Mine: position_x:int position_y:int size:int difficulty:int = 1 weight:float = 1.0 image:pygame.surface.Surface def __init__(self,position_x, position_y, size): self.position_x=position_x self.position_y=position_y self.size=size self.image = pygame.image.load("assets/sprites/mine.png") self.image = pygame.transform.scale(self.image, (self.size, self.size)) def draw(self, window): position_on_screen = (self.size*self.position_x, self.size*self.position_y) window.blit(self.image, position_on_screen) #mapa class Map: window:system.Window tile_size:int tiles_x:int tiles_y:int tile_palette:list terrain_matrix:list mines=[] def __init__(self, window:system.Window, tile_size:int=64, tiles_x:int=8, tiles_y:int=8): self.window = window self.tile_size = tile_size self.tiles_x = tiles_x self.tiles_y = tiles_y #dodanie grafik wszystkich typów terenu do jednej listy self.tile_palette=[None]*20 image = pygame.image.load("assets/sprites/sand.png") image = pygame.transform.scale(image, (tile_size,tile_size)) self.tile_palette[0]=image image = pygame.image.load("assets/sprites/stone.png") image = pygame.transform.scale(image, (tile_size,tile_size)) self.tile_palette[10]=image def generate(self): #generowanie terenu matrix = [] for i in range(self.tiles_y): matrix.append([]) for j in range(self.tiles_x): #od liczby zależy jaki teren, np. 0 - piasek if randrange(10)==0: matrix[i].append(10) else: matrix[i].append(0) self.terrain_matrix = matrix for i in range(self.tiles_y): for j in range(self.tiles_x): if matrix[i][j]<10: if randrange(10)==0: mine = Mine(j, i, self.tile_size) self.mines.append(mine) def draw_tiles(self): #narysowanie na ekranie terenu for i in range(len(self.terrain_matrix)): for j in range(len(self.terrain_matrix[i])): self.window.window.blit(self.tile_palette[self.terrain_matrix[i][j]], (self.tile_size*j, self.tile_size*i)) def draw_objects(self): for mine in self.mines: mine.draw(self.window.window) #saper class Minesweeper: size:int position_x:int position_y:int image:pygame.surface.Surface rotated_image:pygame.surface.Surface offset_x:int=0 offset_y:int=0 carried_objects=[] speed=1 ability=1 max_carried_weight=5.0 def __init__(self, position_x=0, position_y=0, size=64): self.position_x=position_x self.position_y=position_y self.size = size self.image = pygame.image.load("assets/sprites/saper.png") self.image = pygame.transform.scale(self.image, (self.size, self.size)) self.rotated_image = self.image def check_position(self, map:Map): for mine in map.mines: if (self.position_x, self.position_y) == (mine.position_x, mine.position_y): map.mines.remove(mine) pygame.mixer.Channel(3).set_volume(0.7) pygame.mixer.Channel(3).play(pygame.mixer.Sound("assets/sounds/pickup.wav")) break def update_offset(self, delta:float, map): dist=round(self.speed*delta/8) finished=False if self.offset_x>0: self.offset_x-=dist if self.offset_x<=0: finished=True elif self.offset_x<0: self.offset_x+=dist if self.offset_x>=0: finished=True if self.offset_y>0: self.offset_y-=dist if self.offset_y<=0: finished=True elif self.offset_y<0: self.offset_y+=dist if self.offset_y>=0: finished=True if finished: pygame.mixer.Channel(1).stop() self.offset_y=0 self.offset_x=0 self.check_position(map) def draw(self, window, delta:float, map): position_on_screen = (self.size*self.position_x + self.offset_x, self.size*self.position_y + self.offset_y) window.blit(self.rotated_image, position_on_screen) self.update_offset(delta, map) def move(self, map:Map, dir:int): #południe - 0 #wschód - 90 #północ - 180 #zachód - 270 if self.offset_x!=0 or self.offset_y!=0: return self.rotated_image = pygame.transform.rotate(self.image, dir) move_legal=True if dir==0: if self.position_y+1 == map.tiles_y: move_legal=False elif map.terrain_matrix[self.position_y+1][self.position_x]>9: move_legal=False elif dir==180: if self.position_y-1 == -1: move_legal=False elif map.terrain_matrix[self.position_y-1][self.position_x]>9: move_legal=False elif dir==270: if self.position_x-1 == -1: move_legal=False elif map.terrain_matrix[self.position_y][self.position_x-1]>9: move_legal=False elif dir==90: if self.position_x+1 == map.tiles_x: move_legal=False elif map.terrain_matrix[self.position_y][self.position_x+1]>9: move_legal=False if move_legal: pygame.mixer.Channel(1).set_volume(0.3) pygame.mixer.Channel(1).play(pygame.mixer.Sound("assets/sounds/moving.wav")) if dir==0: self.position_y+=1 self.offset_y=-self.size elif dir==180: self.position_y-=1 self.offset_y=self.size elif dir==270: self.position_x-=1 self.offset_x=self.size elif dir==90: self.position_x+=1 self.offset_x=-self.size else: pygame.mixer.Channel(2).set_volume(0.5) pygame.mixer.Channel(2).play(pygame.mixer.Sound("assets/sounds/collision.wav"))