Advertisement
qwertyMAN_rus

Trees empty field calculator

Apr 26th, 2022 (edited)
1,127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.57 KB | None | 0 0
  1. import random
  2. import tkinter
  3.  
  4.  
  5. class Field:
  6.     def __init__(self, size: int = 10, trees: int = 10, *, window: tkinter.Tk, canvas_size: int) -> None:
  7.         """
  8.    Create new field
  9.        :type window: window
  10.        :param size: size field
  11.        :param trees: number of trees
  12.        """
  13.         self._start_size = size
  14.         self._start_trees = trees
  15.         self._new_canvas(canvas_size, window)
  16.         self.new_field(size, trees)
  17.  
  18.     def new_field(self, size: int = 10, trees: int = 10) -> None:
  19.         """
  20.    Create new field
  21.        :param size: size field
  22.        :param trees: number of trees
  23.        """
  24.         self._field_generate(size)
  25.         self._trees_generate(trees)
  26.         self._max_empty_square()
  27.  
  28.     def reload_field(self):
  29.         self.new_field(self._start_size, self._start_trees)
  30.  
  31.     def new_random_tree(self):
  32.         if self._trees_number < self._trees_max_number:
  33.             exit_program = False
  34.             while not exit_program:
  35.                 x = random.randint(0, self._size - 1)
  36.                 y = random.randint(0, self._size - 1)
  37.                 if not self._check_field_cell(x, y):
  38.                     self._trees[x][y] = True
  39.                     exit_program = True
  40.             self._max_empty_square()
  41.  
  42.     def _new_canvas(self, size: int, window: tkinter.Tk):
  43.         self._canvas_size = size
  44.         self._canvas = tkinter.Canvas(window, bg="#888888",
  45.                                       width=size,
  46.                                       height=size)
  47.         self._canvas.place(x=0, y=0)
  48.  
  49.     def _draw(self, start_x, start_y, size_square):
  50.         interval = self._canvas_size / self._size
  51.         self._canvas.delete("all")
  52.         self._draw_trees(interval)
  53.         self._draw_max_square(start_x, start_y, size_square, interval)
  54.         self._draw_grid(self._size, interval)
  55.  
  56.     def _draw_trees(self, interval):
  57.         for x in range(self._size):
  58.             for y in range(self._size):
  59.                 if self._check_field_cell(x, y):
  60.                     cell_x = x * interval
  61.                     cell_y = y * interval
  62.                     self._canvas.create_rectangle(cell_x, cell_y, cell_x + interval, cell_y + interval, fill="#008800")
  63.  
  64.     def _draw_max_square(self, start_x, start_y, size_square, interval):
  65.         x = start_x * interval
  66.         y = start_y * interval
  67.         size = size_square * interval
  68.         self._canvas.create_rectangle(x, y, x + size, y + size, fill="#00aaaa")
  69.  
  70.     def _draw_grid(self, size, interval):
  71.         for x in range(size + 1):
  72.             for y in range(size + 1):
  73.                 self._canvas.create_line(x * interval, 0, x * interval, self._canvas_size, width=1)
  74.                 self._canvas.create_line(0, y * interval, self._canvas_size, y * interval, width=1)
  75.  
  76.     def _field_generate(self, size: int) -> None:
  77.         """
  78.    Create new field
  79.        :param size: size field
  80.        """
  81.         self._size = size
  82.         self._field = list()
  83.         self._trees = list()
  84.         for i in range(size):
  85.             self._field.append(list())
  86.             self._trees.append(list())
  87.             for j in range(size):
  88.                 self._field[i].append(0)
  89.                 self._trees[i].append(False)
  90.  
  91.     def _trees_generate(self, trees_number: int) -> None:
  92.         """
  93.    Generation of trees in the field
  94.        :param trees_number: number of trees
  95.        """
  96.         self._trees_max_number = self._size ** 2 - 1
  97.         self._trees_number = min(trees_number, self._trees_max_number)
  98.         count = 0
  99.         while count < self._trees_number:
  100.             x = random.randint(0, self._size - 1)
  101.             y = random.randint(0, self._size - 1)
  102.             if not self._check_field_cell(x, y):
  103.                 self._trees[x][y] = True
  104.                 count += 1
  105.  
  106.     def _check_field_cell(self, x: int, y: int) -> bool:
  107.         """
  108.    Check field cell
  109.        :param x: start x coord
  110.        :param y: start y coord
  111.        :return: cell contains tree
  112.        """
  113.         return self._trees[x][y]
  114.  
  115.     def _check_square(self, x: int, y: int, size: int) -> bool:
  116.         """
  117.    Check square
  118.        :param x: start x coord
  119.        :param y: start y coord
  120.        :param size: size square
  121.        :return: square contains tree
  122.        """
  123.         output = False
  124.         for i in range(size):
  125.             for j in range(size):
  126.                 output = output or self._check_field_cell(x + i, y + j)
  127.         return output
  128.  
  129.     def _max_empty_square(self) -> None:
  130.         """
  131.    Get max empty square
  132.        :return: square
  133.        """
  134.         for max_offset in range(self._size):
  135.             size = self._size - max_offset
  136.             for x in range(max_offset + 1):
  137.                 for y in range(max_offset + 1):
  138.                     if not self._check_square(x, y, size):
  139.                         return self._draw(x, y, size)
  140.  
  141.  
  142. class Program:
  143.     def __init__(self, size=300):
  144.         self._window = tkinter.Tk()
  145.         self._window.title("Trees")
  146.         self._window.geometry(f"{size + 100}x{size + 20}")
  147.         field = Field(25, 0, canvas_size=size, window=self._window)
  148.         reload_button = tkinter.Button(self._window, text="Reload", command=field.reload_field)
  149.         reload_button.grid(row=0, column=0, padx=size+20, pady=20)
  150.         new_random_tree_button = tkinter.Button(self._window, text="Random tree", command=field.new_random_tree)
  151.         new_random_tree_button.grid(row=1, column=0)
  152.  
  153.     def run(self):
  154.         self._window.mainloop()
  155.  
  156.  
  157. def main():
  158.     program = Program()
  159.     program.run()
  160.  
  161.  
  162. main()
  163.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement