Saper na ekranie

This commit is contained in:
TravoMaster 2022-03-09 01:36:46 +01:00
commit 21936d8d91
8 changed files with 201 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
__pycache__/

BIN
assets/sprites/sand.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
assets/sprites/saper.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

109
classes/minesweeper.py Normal file
View File

@ -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)

31
classes/system.py Normal file
View File

@ -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)

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

59
main.py Normal file
View File

@ -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()

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
pygame