Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 19.96 KB | None | 0 0
  1. import cv2
  2. import numpy as np
  3. import random
  4.  
  5.  
  6. class Block:
  7.     COLORS = [(0, 255, 255), (238, 0, 238), (82, 127, 0)]
  8.  
  9.     def __init__(self):
  10.         self.type = random.randint(0, 2)
  11.         self.X, self.Y = self.prepare_ranges()
  12.         self.color = self.COLORS[self.type]
  13.         self.x = random.choice(self.X)
  14.         self.y = random.choice(self.Y)
  15.         while not self.occupied(self.x, self.y):
  16.             self.x = random.choice(self.X)
  17.             self.y = random.choice(self.Y)
  18.         self.angle = 0
  19.         self.x_borders = [0, 420]
  20.         self.y_borders = [0, 720]
  21.         self.draw()
  22.  
  23.     def move_up(self):
  24.         if self.y > self.y_borders[0]:
  25.             if self.not_colliding(self.x, self.y - 30, 'up'):
  26.                 self.y -= 30
  27.  
  28.     def move_down(self):
  29.         if self.y < self.y_borders[1]:
  30.             if self.not_colliding(self.x, self.y + 30, 'down'):
  31.                 self.y += 30
  32.  
  33.     def move_right(self):
  34.         if self.x < self.x_borders[1]:
  35.             if self.not_colliding(self.x + 30, self.y, 'right'):
  36.                 self.x += 30
  37.  
  38.     def move_left(self):
  39.         if self.x > self.x_borders[0]:
  40.             if self.not_colliding(self.x - 30, self.y, 'left'):
  41.                 self.x -= 30
  42.  
  43.     def highlight(self):
  44.         self.color = (0, 0, 255)
  45.  
  46.     def redo_color(self):
  47.         self.color = self.COLORS[self.type]
  48.  
  49.     def rotate(self):
  50.         if self.rotation_available(self.x, self.y):
  51.             self.angle += 90
  52.         if self.angle == 360:
  53.             self.angle = 0
  54.  
  55.     def draw(self):
  56.         if self.type == 0:
  57.             self.draw_first()
  58.         if self.type == 1:
  59.             self.draw_second()
  60.         if self.type == 2:
  61.             self.draw_third()
  62.  
  63.     def draw_first(self, ):
  64.         self.x_borders[0] = 0
  65.         self.x_borders[1] = 390
  66.         self.y_borders[0] = 0
  67.         self.y_borders[1] = 690
  68.         self.draw_rect_border(image, self.x, self.y, self.color)
  69.         self.draw_rect_border(image, self.x + 30, self.y, self.color)
  70.         self.draw_rect_border(image, self.x + 30, self.y + 30, self.color)
  71.         self.draw_rect_border(image, self.x, self.y + 30, self.color)
  72.  
  73.     def draw_second(self):
  74.         if self.angle == 0 or self.angle == 180:
  75.             self.x_borders[0] = 0
  76.             self.x_borders[1] = 330
  77.             self.y_borders[0] = 0
  78.             self.y_borders[1] = 720
  79.             self.draw_rect_border(image, self.x, self.y, self.color)
  80.             self.draw_rect_border(image, self.x + 30, self.y, self.color)
  81.             self.draw_rect_border(image, self.x + 60, self.y, self.color)
  82.             self.draw_rect_border(image, self.x + 90, self.y, self.color)
  83.         if self.angle == 90 or self.angle == 270:
  84.             self.x_borders[0] = 0
  85.             self.x_borders[1] = 420
  86.             self.y_borders[0] = 90
  87.             self.y_borders[1] = 720
  88.             self.draw_rect_border(image, self.x, self.y, self.color)
  89.             self.draw_rect_border(image, self.x, self.y - 30, self.color)
  90.             self.draw_rect_border(image, self.x, self.y - 60, self.color)
  91.             self.draw_rect_border(image, self.x, self.y - 90, self.color)
  92.  
  93.     def draw_third(self):
  94.         if self.angle == 0:
  95.             self.x_borders[0] = 0
  96.             self.x_borders[1] = 360
  97.             self.y_borders[0] = 0
  98.             self.y_borders[1] = 690
  99.             self.draw_rect_border(image, self.x, self.y, self.color)
  100.             self.draw_rect_border(image, self.x + 30, self.y, self.color)
  101.             self.draw_rect_border(image, self.x + 60, self.y, self.color)
  102.             self.draw_rect_border(image, self.x, self.y + 30, self.color)
  103.         if self.angle == 90:
  104.             self.x_borders[0] = 0
  105.             self.x_borders[1] = 390
  106.             self.y_borders[0] = 60
  107.             self.y_borders[1] = 720
  108.             self.draw_rect_border(image, self.x, self.y, self.color)
  109.             self.draw_rect_border(image, self.x, self.y - 30, self.color)
  110.             self.draw_rect_border(image, self.x, self.y - 60, self.color)
  111.             self.draw_rect_border(image, self.x + 30, self.y, self.color)
  112.         if self.angle == 180:
  113.             self.x_borders[0] = 60
  114.             self.x_borders[1] = 420
  115.             self.y_borders[0] = 30
  116.             self.y_borders[1] = 720
  117.             self.draw_rect_border(image, self.x, self.y, self.color)
  118.             self.draw_rect_border(image, self.x - 30, self.y, self.color)
  119.             self.draw_rect_border(image, self.x - 60, self.y, self.color)
  120.             self.draw_rect_border(image, self.x, self.y - 30, self.color)
  121.         if self.angle == 270:
  122.             self.x_borders[0] = 30
  123.             self.x_borders[1] = 420
  124.             self.y_borders[0] = 0
  125.             self.y_borders[1] = 660
  126.             self.draw_rect_border(image, self.x, self.y, self.color)
  127.             self.draw_rect_border(image, self.x, self.y + 30, self.color)
  128.             self.draw_rect_border(image, self.x, self.y + 60, self.color)
  129.             self.draw_rect_border(image, self.x - 30, self.y, self.color)
  130.  
  131.     @staticmethod
  132.     def draw_rect_border(img, x, y, color):
  133.         cv2.rectangle(img, (x, y), (x + 30, y + 30), color, -1)
  134.         cv2.rectangle(img, (x, y), (x + 30, y + 30), (0, 0, 0), 1)
  135.  
  136.     def occupied(self, x, y):
  137.         if self.type == 0:
  138.             free = list()
  139.             free.append((image[y, x] == [255., 255., 255.]).all())
  140.             free.append((image[y, x + 30] == [255., 255., 255.]).all())
  141.             free.append((image[y + 30, x + 30] == [255., 255., 255.]).all())
  142.             free.append((image[y + 30, x] == [255., 255., 255.]).all())
  143.             return all(free)
  144.         if self.type == 1:
  145.             free = list()
  146.             free.append((image[y, x] == [255., 255., 255.]).all())
  147.             free.append((image[y, x + 30] == [255., 255., 255.]).all())
  148.             free.append((image[y, x + 60] == [255., 255., 255.]).all())
  149.             free.append((image[y, x + 90] == [255., 255., 255.]).all())
  150.             return all(free)
  151.         if self.type == 2:
  152.             free = list()
  153.             free.append((image[y, x] == [255., 255., 255.]).all())
  154.             free.append((image[y, x + 30] == [255., 255., 255.]).all())
  155.             free.append((image[y, x + 60] == [255., 255., 255.]).all())
  156.             free.append((image[y + 30, x] == [255., 255., 255.]).all())
  157.             return all(free)
  158.  
  159.     def rotation_available(self, x, y):
  160.         if self.type == 1:
  161.             if self.angle == 0 or self.angle == 180:
  162.                 if self.y >= 90:
  163.                     free = list()
  164.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  165.                     free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
  166.                     free.append((image[y - 90 + 1, x + 1] == [255., 255., 255.]).all())
  167.                     return all(free)
  168.                 else:
  169.                     return False
  170.             if self.angle == 90 or self.angle == 270:
  171.                 if self.x < 360:
  172.                     free = list()
  173.                     free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  174.                     free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
  175.                     free.append((image[y + 1, x + 90 + 1] == [255., 255., 255.]).all())
  176.                     return all(free)
  177.                 else:
  178.                     return False
  179.         if self.type == 2:
  180.             if self.angle == 0:
  181.                 if self.y >= 60:
  182.                     free = list()
  183.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  184.                     free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
  185.                     return all(free)
  186.                 else:
  187.                     return False
  188.             if self.angle == 90:
  189.                 if self.x >= 60:
  190.                     free = list()
  191.                     free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
  192.                     free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
  193.                     return all(free)
  194.                 else:
  195.                     return False
  196.             if self.angle == 180:
  197.                 if self.y < 690:
  198.                     free = list()
  199.                     free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
  200.                     free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
  201.                     return all(free)
  202.                 else:
  203.                     return False
  204.             if self.angle == 270:
  205.                 if self.x < 390:
  206.                     free = list()
  207.                     free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  208.                     free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
  209.                     return all(free)
  210.                 else:
  211.                     return False
  212.  
  213.     def prepare_ranges(self):
  214.         if self.type == 0:
  215.             x = np.arange(0, 390, 30)
  216.             y = np.arange(0, 690, 30)
  217.             return x, y
  218.         if self.type == 1:
  219.             x = np.arange(0, 330, 30)
  220.             y = np.arange(0, 720, 30)
  221.             return x, y
  222.         if self.type == 2:
  223.             x = np.arange(0, 360, 30)
  224.             y = np.arange(0, 690, 30)
  225.             return x, y
  226.  
  227.     def not_colliding(self, x, y, move):
  228.         if self.type == 0:
  229.             if move == 'up':
  230.                 free = list()
  231.                 free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  232.                 free.append((image[y + 1, x + 1 + 30] == [255., 255., 255.]).all())
  233.                 return all(free)
  234.             elif move == 'down':
  235.                 free = list()
  236.                 free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
  237.                 free.append((image[y + 30 + 1, x + 1 + 30] == [255., 255., 255.]).all())
  238.                 return all(free)
  239.             elif move == 'left':
  240.                 free = list()
  241.                 free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  242.                 free.append((image[y + 1 + 30, x + 1] == [255., 255., 255.]).all())
  243.                 return all(free)
  244.             elif move == 'right':
  245.                 free = list()
  246.                 free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  247.                 free.append((image[y + 1 + 30, x + 30 + 1] == [255., 255., 255.]).all())
  248.                 return all(free)
  249.         if self.type == 1:
  250.             if self.angle == 0 or self.angle == 180:
  251.                 if move == 'up':
  252.                     free = list()
  253.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  254.                     free.append((image[y + 1, x + 30] == [255., 255., 255.]).all())
  255.                     free.append((image[y + 1, x + 60] == [255., 255., 255.]).all())
  256.                     free.append((image[y + 1, x + 90] == [255., 255., 255.]).all())
  257.                     return all(free)
  258.                 elif move == 'down':
  259.                     free = list()
  260.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  261.                     free.append((image[y + 1, x + 30] == [255., 255., 255.]).all())
  262.                     free.append((image[y + 1, x + 60] == [255., 255., 255.]).all())
  263.                     free.append((image[y + 1, x + 90] == [255., 255., 255.]).all())
  264.                     return all(free)
  265.                 elif move == 'right':
  266.                     free = list()
  267.                     free.append((image[y + 1, x + 120 - 1] == [255., 255., 255.]).all())
  268.                     return all(free)
  269.                 elif move == 'left':
  270.                     free = list()
  271.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  272.                     return all(free)
  273.             if self.angle == 90 or self.angle == 270:
  274.                 if move == 'up':
  275.                     free = list()
  276.                     free.append((image[y - 90 + 1, x + 1] == [255., 255., 255.]).all())
  277.                     return all(free)
  278.                 elif move == 'down':
  279.                     free = list()
  280.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  281.                     return all(free)
  282.                 elif move == 'right':
  283.                     free = list()
  284.                     free.append((image[y + 1, x + 30 - 1] == [255., 255., 255.]).all())
  285.                     free.append((image[y - 30 + 1, x + 30 - 1] == [255., 255., 255.]).all())
  286.                     free.append((image[y - 60 + 1, x + 30 - 1] == [255., 255., 255.]).all())
  287.                     free.append((image[y - 90 + 1, x + 30 - 1] == [255., 255., 255.]).all())
  288.                     return all(free)
  289.                 elif move == 'left':
  290.                     free = list()
  291.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  292.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  293.                     free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
  294.                     free.append((image[y - 90 + 1, x + 1] == [255., 255., 255.]).all())
  295.                     return all(free)
  296.         if self.type == 2:
  297.             if self.angle == 0:
  298.                 if move == 'up':
  299.                     free = list()
  300.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  301.                     free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  302.                     free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
  303.                     return all(free)
  304.                 elif move == 'down':
  305.                     free = list()
  306.                     free.append((image[y + 1 + 30, x + 1] == [255., 255., 255.]).all())
  307.                     free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  308.                     free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
  309.                     return all(free)
  310.                 elif move == 'right':
  311.                     free = list()
  312.                     free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
  313.                     free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
  314.                     return all(free)
  315.                 elif move == 'left':
  316.                     free = list()
  317.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  318.                     free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
  319.                     return all(free)
  320.             if self.angle == 90:
  321.                 if move == 'up':
  322.                     free = list()
  323.                     free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
  324.                     free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  325.                     return all(free)
  326.                 elif move == 'down':
  327.                     free = list()
  328.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  329.                     free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  330.                     return all(free)
  331.                 elif move == 'right':
  332.                     free = list()
  333.                     free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
  334.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  335.                     free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
  336.                     return all(free)
  337.                 elif move == 'left':
  338.                     free = list()
  339.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  340.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  341.                     free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
  342.                     return all(free)
  343.             if self.angle == 180:
  344.                 if move == 'up':
  345.                     free = list()
  346.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  347.                     free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
  348.                     free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
  349.                     return all(free)
  350.                 elif move == 'down':
  351.                     free = list()
  352.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  353.                     free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
  354.                     free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
  355.                     return all(free)
  356.                 elif move == 'right':
  357.                     free = list()
  358.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  359.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  360.                     return all(free)
  361.                 elif move == 'left':
  362.                     free = list()
  363.                     free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
  364.                     free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
  365.                     return all(free)
  366.             if self.angle == 270:
  367.                 if move == 'up':
  368.                     free = list()
  369.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  370.                     free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
  371.                     return all(free)
  372.                 elif move == 'down':
  373.                     free = list()
  374.                     free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
  375.                     free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
  376.                     return all(free)
  377.                 elif move == 'right':
  378.                     free = list()
  379.                     free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
  380.                     free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
  381.                     free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
  382.                     return all(free)
  383.                 elif move == 'left':
  384.                     free = list()
  385.                     free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
  386.                     free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
  387.                     free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
  388.                     return all(free)
  389.  
  390.  
  391. ARROW_UP = 2490368
  392. ARROW_DOWN = 2621440
  393. ARROW_LEFT = 2424832
  394. ARROW_RIGHT = 2555904
  395. PAGE_DOWN = 2228224
  396. PAGE_UP = 2162688
  397. SPACE = 32
  398. ENTER = 13
  399.  
  400. cv2.namedWindow('IMG', cv2.WINDOW_AUTOSIZE)
  401. image = np.ones((750, 450, 3)) * 255
  402. blank = image.copy()
  403. running = True
  404. blocks = [Block() for _ in range(15)]
  405. i = 0
  406. auto = 0
  407. while running:
  408.     image = blank.copy()
  409.     if i > 14:
  410.         i = 0
  411.     if i < 0:
  412.         i = 14
  413.     blocks[i].highlight()
  414.     for block in blocks:
  415.         block.draw()
  416.     cv2.imshow('IMG', image)
  417.  
  418.     # STEERING
  419.     if auto == 20:
  420.         auto = 0
  421.     if auto == 0:
  422.         key = cv2.waitKeyEx()
  423.     if key == ord('q') or key == 27:
  424.         running = False
  425.         cv2.destroyWindow('IMG')
  426.         break
  427.     elif key == ENTER or 20 > auto > 0:
  428.         for block in blocks:
  429.             rotations = random.randint(0, 4)
  430.             for _ in range(rotations):
  431.                 block.rotate()
  432.                 block.draw()
  433.             for _ in range(2):
  434.                 block.move_down()
  435.                 block.draw()
  436.             block.move_left()
  437.             block.draw()
  438.         auto += 1
  439.     elif key == SPACE:
  440.         blocks[i].rotate()
  441.     elif key == PAGE_UP:
  442.         blocks[i].redo_color()
  443.         i += 1
  444.     elif key == PAGE_DOWN:
  445.         blocks[i].redo_color()
  446.         i -= 1
  447.     elif key == ARROW_UP:
  448.         blocks[i].move_up()
  449.     elif key == ARROW_DOWN:
  450.         blocks[i].move_down()
  451.     elif key == ARROW_LEFT:
  452.         blocks[i].move_left()
  453.     elif key == ARROW_RIGHT:
  454.         blocks[i].move_right()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement