summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
Diffstat (limited to 'board')
-rw-r--r--board/__init__.py4
-rw-r--r--board/board.py252
-rw-r--r--board/static.py34
3 files changed, 0 insertions, 290 deletions
diff --git a/board/__init__.py b/board/__init__.py
deleted file mode 100644
index ba87812..0000000
--- a/board/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-""" board - tämä alimoduli hoitaa pelilaudan käsittelyn sääntöjen mukaan """
-
-from .board import Board
-from .static import Level, LevelSpecs, Tile
diff --git a/board/board.py b/board/board.py
deleted file mode 100644
index 36ceb62..0000000
--- a/board/board.py
+++ /dev/null
@@ -1,252 +0,0 @@
-""" board/board.py - Pelilaudan käsittelyyn tarkoitetut jutut """
-from random import randrange
-from sys import stderr
-from copy import deepcopy
-
-from .static import Level, Tile, LevelSpecs
-
-
-class Board():
- """ Board - Luokka joka pitää huolen pelilaudasta ja siihen kohdistuvista
- siirroista.
- """
- def __init__(self,
- level = Level.BEGINNER,
- width = None,
- height = None,
- mines = None,
- board = None):
- # pylint: disable = too-many-arguments
-
- if ( not width or not height or
- width not in range(2,51) or
- height not in range(2,51) ):
- width, height = None, None
-
- self.__level = level
- self.__width, self.__height, self.__mines =LevelSpecs[self.__level][:3]
-
- if width:
- self.__width = width
- if height:
- self.__height = height
- if height or width or mines:
- self.__mines = mines
-
- if self.__mines not in range(1,self.__width*self.__height):
- self.__mines = self.__width
-
-
- if board and self.__validate_board(board):
- self.__width, self.__height = self.__get_board_dimensions(board)
- self.__mines = self.__get_board_mines(board)
- else:
- board = None
-
- for _, specs in LevelSpecs.items():
- if (self.__width, self.__height, self.__mines) == specs[:3]:
- self.__level_name = specs[3]
- break
- else:
- self.__level_name = "Mukautettu"
-
- self.__level_name += ( f" ({self.__width}x{self.__height}"
- f", {self.__mines} miinaa)" )
-
- self.__tiles = None
- self.__masked = None
-
- self.__initialize_tiles()
- if board:
- self.__populate_with_board(board)
- else:
- self.__randomize_mines()
- self.__calculate_neighbours()
-
- def __validate_board(self, board):
- w = len(board[0])
- h = len(board)
- if w not in range(2,51) or h not in range(2,51):
- return False
- for line in board:
- if len(line)!=w:
- return False
- if self.__get_board_mines(board) not in range (1, w*h):
- return False
- return True
-
-
- def __get_board_dimensions(self, board):
- return len(board[0]), len(board)
-
-
- def __get_board_mines(self, board):
- return sum((sum(x) for x in board))
-
-
- def __populate_with_board(self, board):
- for y in range(self.__height):
- for x in range(self.__width):
- if board[y][x]:
- self.__tiles[x][y] = Tile.MINE
-
- def __initialize_tiles(self):
- """ alustaa pelilaudan matriisit """
- w, h = self.__width, self.__height
- self.__tiles = [[Tile.BLANK for _ in range(h)] for _ in range(w)]
- self.__masked = [[Tile.UNOPENED for _ in range(h)] for _ in range(w)]
-
-
- def __randomize_mines(self):
- """ arpoo pelilaudalle pommit """
- for _ in range(self.__mines):
- while True:
- x, y = randrange(0,self.__width), randrange(0,self.__height)
- if self.__tiles[x][y] != Tile.BLANK:
- continue
- self.__tiles[x][y] = Tile.MINE
- break
-
-
- def __calculate_neighbours(self):
- """ laskee naapurissa olevien pommien määrät valmiiksi laudalle """
- for y in range(self.__height):
- for x in range(self.__width):
- if self.__tiles[x][y] == Tile.MINE:
- continue
- neighbouring_mines = 0
- for nx, ny in self.get_neighbours_coords(x,y):
- if self.__tiles[nx][ny] == Tile.MINE:
- neighbouring_mines += 1
- self.__tiles[x][y] = neighbouring_mines
-
-
- def invalid_coordinates(self, x, y):
- """ onko koordinaatit pelilaudan ulkopuolella """
- return x < 0 or x >= self.__width or y < 0 or y >= self.__height
-
-
- def get_neighbours_coords(self, x, y, include_home = False):
- """ antaa listan naapureiden koordinaateista """
- offsets = (
- (-1,-1), (0,-1), (1,-1),
- (-1, 0), (0, 0), (1, 0),
- (-1, 1), (0, 1), (1, 1)
- ) if include_home else (
- (-1,-1), (0,-1), (1,-1),
- (-1, 0), (1, 0),
- (-1, 1), (0, 1), (1, 1)
- )
- coordinates=[]
- for dx,dy in offsets:
- if not self.invalid_coordinates(x+dx, y+dy):
- coordinates.append( (x+dx, y+dy) )
- return coordinates
-
-
- def get_view(self):
- """ antaa matriisin nykyisestä pelinäkymästä """
- view = deepcopy(self.__masked)
- for y in range(self.__height):
- for x in range(self.__width):
- if not view[x][y]:
- view[x][y]=self.__tiles[x][y]
- return view
-
-
- def is_winning(self):
- """ tarkistaa onko peli voitettu """
- for y in range(self.__height):
- for x in range(self.__width):
- if self.__tiles[x][y] == Tile.MINE:
- if not self.__masked[x][y]:
- return False
- else:
- if self.__masked[x][y]:
- return False
- return True
-
-
- def collect_area(self, x, y, area = None):
- """ tunnustelee ja palauttaa tyhjän alueen koordinaatit """
- if area is None:
- area = {(x,y)}
- to_test = []
- for nx, ny in self.get_neighbours_coords(x, y):
- if self.__tiles[nx][ny] == Tile.BLANK and (nx,ny) not in area:
- to_test.append((nx, ny))
- area.add((nx, ny))
- for tx, ty in to_test:
- area=area.union(self.collect_area(tx, ty, area))
- return area
-
-
- def get_mask(self, x, y):
- """ onko ruutu vielä piilossa """
- return self.__masked[x][y]
-
-
- def flag(self, x, y, flag=-1):
- """ aseta lippu peitetylle ruudulle"""
- if self.invalid_coordinates(x, y):
- print("Koordinaatit on pelilaudan ulkopuolella", file=stderr)
- return False
-
- if self.__masked[x][y] not in range(10,14):
- print("Ruudulla odottamaton lippu tai se on avattu", file=stderr)
- return False
-
- if flag == -1:
- self.__masked[x][y] += 1 if self.__masked[x][y] < 13 else -3
- return True
-
- if flag not in range(10,14):
- print("Lippua jota asetat ei ole olemassa", file=stderr)
- return False
-
- self.__masked[x][y]=flag
- return True
-
-
- def guess(self, x, y):
- """ tee arvaus """
- if self.invalid_coordinates(x, y):
- print("Koordinaatit on pelilaudan ulkopuolella", file=stderr)
- return False
-
- if not self.__masked[x][y]:
- print("Ruutu on jo avattu", file=stderr)
- return False
-
- self.__masked[x][y] = 0
-
- if self.__tiles[x][y] == Tile.MINE:
- return False
-
- if self.__tiles[x][y] == Tile.BLANK:
- for cx, cy in self.collect_area( x, y ):
- for nx, ny in self.get_neighbours_coords(cx, cy, True):
- self.__masked[nx][ny] = 0
-
- return True
-
- def reveal(self):
- """ näytä koko lauta """
- w, h = self.__width, self.__height
- self.__masked = [[0 for _ in range(h)] for _ in range(w)]
-
- def get_width(self):
- """ palauttaa laudan leveyden """
- return self.__width
-
- def get_height(self):
- """ palauttaa laudan korkeuden """
- return self.__height
-
- def get_mines(self):
- """ palauttaa pommien määrän """
- return self.__mines
-
- def get_level_name(self):
- """ palauttaa vaikesutason nimen"""
- return self.__level_name
diff --git a/board/static.py b/board/static.py
deleted file mode 100644
index 4804ded..0000000
--- a/board/static.py
+++ /dev/null
@@ -1,34 +0,0 @@
-""" board/static.py - määrittelyjä pelilaudan muuttumattomille asoille """
-
-from enum import Enum, IntEnum
-
-class Level(Enum):
- """ vaikeustasot """
- BEGINNER = 0
- INTERMEDIATE = 1
- EXPERT = 2
-
-
-class Tile(IntEnum):
- """ alueiden selitteet """
- BLANK = 0
- ONE = 1
- TWO = 2
- THREE = 3
- FOUR = 4
- FIVE = 5
- SIX = 6
- SEVEN = 7
- EIGHT = 8
- MINE = 9
- FLAG_MINE = 10
- FLAG_FREE = 11
- UNOPENED = 12
- FLAG_UNKNOWN = 13
-
-
-LevelSpecs = {
- Level.BEGINNER: ( 9, 9, 10, "Aloittelija"),
- Level.INTERMEDIATE: ( 16, 16, 40, "Keskivaikea"),
- Level.EXPERT: ( 30, 16, 99, "Edistynyt")
-}