< Summary

Class:minemap.py
Assembly:src.minesweeper
File(s):/home/runner/work/kata-python-minesweeper5/kata-python-minesweeper5/src/minesweeper/minemap.py
Covered lines:38
Uncovered lines:0
Coverable lines:38
Total lines:69
Line coverage:100% (38 of 38)
Covered branches:12
Total branches:12
Branch coverage:100% (12 of 12)
Tag:20_659826003

File(s)

/home/runner/work/kata-python-minesweeper5/kata-python-minesweeper5/src/minesweeper/minemap.py

#LineLine coverage
 11from typing import List, Tuple
 12from minesweeper.mineitem import MineItem
 13from random import sample
 14from injector import inject
 5
 6
 17class MineMap:
 18    def __getitem__(self, n):
 19        def getitem(xy):
 110            x, y = xy
 111            return (
 12                None
 13                if x < 0 or y < 0 or x >= self._width or y >= self._height
 14                else self._items[y * self._width + x]
 15            )
 16
 117        def convert_index_int_to_tuple(n):
 118            return reversed(divmod(n, self._width))
 19
 120        if isinstance(n, tuple):
 121            return getitem(n)
 22        else:
 123            return getitem(convert_index_int_to_tuple(n))
 24
 125    def __init__(
 26        self,
 27        width: int,
 28        height: int,
 29        pos_bombs: List[Tuple[int, int]] = [],
 30        random_bombs=0,
 31    ):
 132        self._width = width
 133        self._height = height
 134        self._items = [
 35            MineItem(self.near_items_generator((x, y)))
 36            for y in range(height)
 37            for x in range(width)
 38        ]
 39
 140        def select_bomb_items():
 141            return (
 42                map(lambda xy: self[xy], pos_bombs)
 43                if random_bombs == 0
 44                else (self[i] for i in sample(range(0, width * height), random_bombs))
 45            )
 46
 147        for item in select_bomb_items():
 148            item.set_bomb()
 49
 150    def near_items_generator(self, xy):
 151        x, y = xy
 52
 153        def nears():
 154            yield self[(x - 1, y - 1)]
 155            yield self[(x, y - 1)]
 156            yield self[(x + 1, y - 1)]
 157            yield self[(x - 1, y)]
 158            yield self[(x + 1, y)]
 159            yield self[(x - 1, y + 1)]
 160            yield self[(x, y + 1)]
 161            yield self[(x + 1, y + 1)]
 62
 163        return (x for x in nears() if x is not None)
 64
 165    def __str__(self):
 166        return "".join(str(x) for x in self._items)
 67
 168    def click(self, x, y):
 169        self[(x, y)].click()

Methods/Properties