commit 21936d8d918ec5cb5ead0b2721094bce19ed0583 Author: TravoMaster <@> Date: Wed Mar 9 01:36:46 2022 +0100 Saper na ekranie diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba0430d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ \ No newline at end of file diff --git a/assets/sprites/sand.png b/assets/sprites/sand.png new file mode 100644 index 0000000..df9fccd Binary files /dev/null and b/assets/sprites/sand.png differ diff --git a/assets/sprites/saper.png b/assets/sprites/saper.png new file mode 100644 index 0000000..dc457b2 Binary files /dev/null and b/assets/sprites/saper.png differ diff --git a/classes/minesweeper.py b/classes/minesweeper.py new file mode 100644 index 0000000..324d39c --- /dev/null +++ b/classes/minesweeper.py @@ -0,0 +1,109 @@ +from numpy import size +import pygame +from classes import system + +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 + + speed=2 + + 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 update_offset(self): + if self.offset_x>0: + self.offset_x-=self.speed + elif self.offset_x<0: + self.offset_x+=self.speed + if self.offset_y>0: + self.offset_y-=self.speed + elif self.offset_y<0: + self.offset_y+=self.speed + + def draw(self, window): + 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() + + def move(self, dir:int): + #południe + if dir==0: + self.rotated_image = pygame.transform.rotate(self.image, 0) + self.position_y+=1 + self.offset_y=-self.size + #północ + elif dir==1: + self.rotated_image = pygame.transform.rotate(self.image, 180) + self.position_y-=1 + self.offset_y=self.size + #zachód + elif dir==2: + self.rotated_image = pygame.transform.rotate(self.image, 270) + self.position_x-=1 + self.offset_x=self.size + #wschód + elif dir==3: + self.rotated_image = pygame.transform.rotate(self.image, 90) + self.position_x+=1 + self.offset_x=-self.size + + + + +class Map: + window:system.Window + tile_size:int + tiles_x:int + tiles_y:int + terrain_matrix:list + tile_palette:list + + minesweeper:Minesweeper + + 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=[] + image = pygame.image.load("assets/sprites/sand.png") + image = pygame.transform.scale(image, (tile_size,tile_size)) + self.tile_palette.append(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 + matrix[i].append(0) + self.terrain_matrix = matrix + + #generowanie objektów + self.minesweeper = Minesweeper(0,0, self.tile_size) + + + 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): + self.minesweeper.draw(self.window.window) + + \ No newline at end of file diff --git a/classes/system.py b/classes/system.py new file mode 100644 index 0000000..e2faba0 --- /dev/null +++ b/classes/system.py @@ -0,0 +1,31 @@ +import pygame + +class Window: + window:None + width:int + height:int + title:str + icon_path:str + + def __init__(self, width:int=640, height:int=480, title="", icon_path=""): + self.set_resolution(width,height) + self.set_title(title) + self.set_icon(icon_path) + self.mount() + + def set_resolution(self, width:int, height:int): + self.width = width + self.height = height + + def set_title(self, title:str): + self.title=title + + def set_icon(self, icon_path:str): + self.icon_path= icon_path + + def mount(self): + self.window = pygame.display.set_mode((self.width,self.height)) + pygame.display.set_caption(self.title) + if self.icon_path != "": + icon = pygame.image.load(self.icon_path) + pygame.display.set_icon(icon) \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..a59e0be Binary files /dev/null and b/icon.png differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..fdd9efd --- /dev/null +++ b/main.py @@ -0,0 +1,59 @@ +#pygame - biblioteka do symulacji graficznych +import pygame +#system - klasy związane z pygame +#minesweeper - klasy związane z samym saperem +from classes import system, minesweeper + +#ustalenie wielkości pojedyńczych kawałków mapy, oraz wielkości mapy +TILE_SIZE = 64 +TILES_X = 16 +TILES_Y = 10 + +def main(): + #utworzenie okna do gry + window = system.Window(TILE_SIZE*TILES_X, TILE_SIZE*TILES_Y, "Intelligent Minesweeper", "icon.png") + + #utworzenie objektu mapy, wygenerowanie jej i narysowanie na ekranie + map = minesweeper.Map(window, TILE_SIZE, TILES_X, TILES_Y) + map.generate() + map.draw_tiles() + + #główna pętla + game_loop = True + clock = pygame.time.Clock() + while game_loop: + #ustalenie FPS + clock.tick(60) + + #sprawdzanie różnych interakcji użytkownika + for event in pygame.event.get(): + if event.type == pygame.QUIT: + game_loop = False + pygame.quit() + + #sterowanie + keys = pygame.key.get_pressed() + not_moving = map.minesweeper.offset_x==0 and map.minesweeper.offset_y==0 + if keys[pygame.K_DOWN] and not_moving: + map.minesweeper.move(0) + elif keys[pygame.K_UP] and not_moving: + map.minesweeper.move(1) + elif keys[pygame.K_LEFT] and not_moving: + map.minesweeper.move(2) + elif keys[pygame.K_RIGHT] and not_moving: + map.minesweeper.move(3) + + + + #narysowanie terenu i obiektów + map.draw_tiles() + map.draw_objects() + + #odświeżenie ekranu + pygame.display.update() + + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..231dd17 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file