InteligentnySaper/classes/minesweeper.py
2022-03-10 18:40:11 +01:00

233 lines
7.4 KiB
Python

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)
class Cliff:
position_x:int
position_y:int
size:int
image:pygame.surface.Surface
rotation:int
def __init__(self,position_x, position_y, size, rotation):
self.position_x=position_x
self.position_y=position_y
self.size=size
self.rotation = rotation
self.image = pygame.image.load("assets/sprites/cliff.png")
self.image = pygame.transform.scale(self.image, (self.size, self.size))
self.image = pygame.transform.rotate(self.image, self.rotation)
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
cliffs=[]
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
rng = randrange(10)
if rng==0:
matrix[i].append(10)
elif rng<2:
matrix[i].append(0)
cliff = Cliff(j,i,self.tile_size, randrange(4)*90)
#self.cliffs.append(cliff)
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)
for cliff in self.cliffs:
cliff.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"))