Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import cv2
- import numpy as np
- import random
- class Block:
- COLORS = [(0, 255, 255), (238, 0, 238), (82, 127, 0)]
- def __init__(self):
- self.type = random.randint(0, 2)
- self.X, self.Y = self.prepare_ranges()
- self.color = self.COLORS[self.type]
- self.x = random.choice(self.X)
- self.y = random.choice(self.Y)
- while not self.occupied(self.x, self.y):
- self.x = random.choice(self.X)
- self.y = random.choice(self.Y)
- self.angle = 0
- self.x_borders = [0, 420]
- self.y_borders = [0, 720]
- self.draw()
- def move_up(self):
- if self.y > self.y_borders[0]:
- if self.not_colliding(self.x, self.y - 30, 'up'):
- self.y -= 30
- def move_down(self):
- if self.y < self.y_borders[1]:
- if self.not_colliding(self.x, self.y + 30, 'down'):
- self.y += 30
- def move_right(self):
- if self.x < self.x_borders[1]:
- if self.not_colliding(self.x + 30, self.y, 'right'):
- self.x += 30
- def move_left(self):
- if self.x > self.x_borders[0]:
- if self.not_colliding(self.x - 30, self.y, 'left'):
- self.x -= 30
- def highlight(self):
- self.color = (0, 0, 255)
- def redo_color(self):
- self.color = self.COLORS[self.type]
- def rotate(self):
- if self.rotation_available(self.x, self.y):
- self.angle += 90
- if self.angle == 360:
- self.angle = 0
- def draw(self):
- if self.type == 0:
- self.draw_first()
- if self.type == 1:
- self.draw_second()
- if self.type == 2:
- self.draw_third()
- def draw_first(self, ):
- self.x_borders[0] = 0
- self.x_borders[1] = 390
- self.y_borders[0] = 0
- self.y_borders[1] = 690
- self.draw_rect_border(image, self.x, self.y, self.color)
- self.draw_rect_border(image, self.x + 30, self.y, self.color)
- self.draw_rect_border(image, self.x + 30, self.y + 30, self.color)
- self.draw_rect_border(image, self.x, self.y + 30, self.color)
- def draw_second(self):
- if self.angle == 0 or self.angle == 180:
- self.x_borders[0] = 0
- self.x_borders[1] = 330
- self.y_borders[0] = 0
- self.y_borders[1] = 720
- self.draw_rect_border(image, self.x, self.y, self.color)
- self.draw_rect_border(image, self.x + 30, self.y, self.color)
- self.draw_rect_border(image, self.x + 60, self.y, self.color)
- self.draw_rect_border(image, self.x + 90, self.y, self.color)
- if self.angle == 90 or self.angle == 270:
- self.x_borders[0] = 0
- self.x_borders[1] = 420
- self.y_borders[0] = 90
- self.y_borders[1] = 720
- self.draw_rect_border(image, self.x, self.y, self.color)
- self.draw_rect_border(image, self.x, self.y - 30, self.color)
- self.draw_rect_border(image, self.x, self.y - 60, self.color)
- self.draw_rect_border(image, self.x, self.y - 90, self.color)
- def draw_third(self):
- if self.angle == 0:
- self.x_borders[0] = 0
- self.x_borders[1] = 360
- self.y_borders[0] = 0
- self.y_borders[1] = 690
- self.draw_rect_border(image, self.x, self.y, self.color)
- self.draw_rect_border(image, self.x + 30, self.y, self.color)
- self.draw_rect_border(image, self.x + 60, self.y, self.color)
- self.draw_rect_border(image, self.x, self.y + 30, self.color)
- if self.angle == 90:
- self.x_borders[0] = 0
- self.x_borders[1] = 390
- self.y_borders[0] = 60
- self.y_borders[1] = 720
- self.draw_rect_border(image, self.x, self.y, self.color)
- self.draw_rect_border(image, self.x, self.y - 30, self.color)
- self.draw_rect_border(image, self.x, self.y - 60, self.color)
- self.draw_rect_border(image, self.x + 30, self.y, self.color)
- if self.angle == 180:
- self.x_borders[0] = 60
- self.x_borders[1] = 420
- self.y_borders[0] = 30
- self.y_borders[1] = 720
- self.draw_rect_border(image, self.x, self.y, self.color)
- self.draw_rect_border(image, self.x - 30, self.y, self.color)
- self.draw_rect_border(image, self.x - 60, self.y, self.color)
- self.draw_rect_border(image, self.x, self.y - 30, self.color)
- if self.angle == 270:
- self.x_borders[0] = 30
- self.x_borders[1] = 420
- self.y_borders[0] = 0
- self.y_borders[1] = 660
- self.draw_rect_border(image, self.x, self.y, self.color)
- self.draw_rect_border(image, self.x, self.y + 30, self.color)
- self.draw_rect_border(image, self.x, self.y + 60, self.color)
- self.draw_rect_border(image, self.x - 30, self.y, self.color)
- @staticmethod
- def draw_rect_border(img, x, y, color):
- cv2.rectangle(img, (x, y), (x + 30, y + 30), color, -1)
- cv2.rectangle(img, (x, y), (x + 30, y + 30), (0, 0, 0), 1)
- def occupied(self, x, y):
- if self.type == 0:
- free = list()
- free.append((image[y, x] == [255., 255., 255.]).all())
- free.append((image[y, x + 30] == [255., 255., 255.]).all())
- free.append((image[y + 30, x + 30] == [255., 255., 255.]).all())
- free.append((image[y + 30, x] == [255., 255., 255.]).all())
- return all(free)
- if self.type == 1:
- free = list()
- free.append((image[y, x] == [255., 255., 255.]).all())
- free.append((image[y, x + 30] == [255., 255., 255.]).all())
- free.append((image[y, x + 60] == [255., 255., 255.]).all())
- free.append((image[y, x + 90] == [255., 255., 255.]).all())
- return all(free)
- if self.type == 2:
- free = list()
- free.append((image[y, x] == [255., 255., 255.]).all())
- free.append((image[y, x + 30] == [255., 255., 255.]).all())
- free.append((image[y, x + 60] == [255., 255., 255.]).all())
- free.append((image[y + 30, x] == [255., 255., 255.]).all())
- return all(free)
- def rotation_available(self, x, y):
- if self.type == 1:
- if self.angle == 0 or self.angle == 180:
- if self.y >= 90:
- free = list()
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 90 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- else:
- return False
- if self.angle == 90 or self.angle == 270:
- if self.x < 360:
- free = list()
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 90 + 1] == [255., 255., 255.]).all())
- return all(free)
- else:
- return False
- if self.type == 2:
- if self.angle == 0:
- if self.y >= 60:
- free = list()
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- else:
- return False
- if self.angle == 90:
- if self.x >= 60:
- free = list()
- free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
- return all(free)
- else:
- return False
- if self.angle == 180:
- if self.y < 690:
- free = list()
- free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- else:
- return False
- if self.angle == 270:
- if self.x < 390:
- free = list()
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
- return all(free)
- else:
- return False
- def prepare_ranges(self):
- if self.type == 0:
- x = np.arange(0, 390, 30)
- y = np.arange(0, 690, 30)
- return x, y
- if self.type == 1:
- x = np.arange(0, 330, 30)
- y = np.arange(0, 720, 30)
- return x, y
- if self.type == 2:
- x = np.arange(0, 360, 30)
- y = np.arange(0, 690, 30)
- return x, y
- def not_colliding(self, x, y, move):
- if self.type == 0:
- if move == 'up':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 1 + 30] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'down':
- free = list()
- free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 30 + 1, x + 1 + 30] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'left':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1 + 30, x + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'right':
- free = list()
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1 + 30, x + 30 + 1] == [255., 255., 255.]).all())
- return all(free)
- if self.type == 1:
- if self.angle == 0 or self.angle == 180:
- if move == 'up':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 30] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 60] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 90] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'down':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 30] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 60] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 90] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'right':
- free = list()
- free.append((image[y + 1, x + 120 - 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'left':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- if self.angle == 90 or self.angle == 270:
- if move == 'up':
- free = list()
- free.append((image[y - 90 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'down':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'right':
- free = list()
- free.append((image[y + 1, x + 30 - 1] == [255., 255., 255.]).all())
- free.append((image[y - 30 + 1, x + 30 - 1] == [255., 255., 255.]).all())
- free.append((image[y - 60 + 1, x + 30 - 1] == [255., 255., 255.]).all())
- free.append((image[y - 90 + 1, x + 30 - 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'left':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 90 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- if self.type == 2:
- if self.angle == 0:
- if move == 'up':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'down':
- free = list()
- free.append((image[y + 1 + 30, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'right':
- free = list()
- free.append((image[y + 1, x + 60 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'left':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- if self.angle == 90:
- if move == 'up':
- free = list()
- free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'down':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'right':
- free = list()
- free.append((image[y + 1, x + 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'left':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 60 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- if self.angle == 180:
- if move == 'up':
- free = list()
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'down':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'right':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'left':
- free = list()
- free.append((image[y + 1, x - 60 + 1] == [255., 255., 255.]).all())
- free.append((image[y - 30 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- if self.angle == 270:
- if move == 'up':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'down':
- free = list()
- free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'right':
- free = list()
- free.append((image[y + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- elif move == 'left':
- free = list()
- free.append((image[y + 1, x - 30 + 1] == [255., 255., 255.]).all())
- free.append((image[y + 30 + 1, x + 1] == [255., 255., 255.]).all())
- free.append((image[y + 60 + 1, x + 1] == [255., 255., 255.]).all())
- return all(free)
- ARROW_UP = 2490368
- ARROW_DOWN = 2621440
- ARROW_LEFT = 2424832
- ARROW_RIGHT = 2555904
- PAGE_DOWN = 2228224
- PAGE_UP = 2162688
- SPACE = 32
- ENTER = 13
- cv2.namedWindow('IMG', cv2.WINDOW_AUTOSIZE)
- image = np.ones((750, 450, 3)) * 255
- blank = image.copy()
- running = True
- blocks = [Block() for _ in range(15)]
- i = 0
- auto = 0
- while running:
- image = blank.copy()
- if i > 14:
- i = 0
- if i < 0:
- i = 14
- blocks[i].highlight()
- for block in blocks:
- block.draw()
- cv2.imshow('IMG', image)
- # STEERING
- if auto == 20:
- auto = 0
- if auto == 0:
- key = cv2.waitKeyEx()
- if key == ord('q') or key == 27:
- running = False
- cv2.destroyWindow('IMG')
- break
- elif key == ENTER or 20 > auto > 0:
- for block in blocks:
- rotations = random.randint(0, 4)
- for _ in range(rotations):
- block.rotate()
- block.draw()
- for _ in range(2):
- block.move_down()
- block.draw()
- block.move_left()
- block.draw()
- auto += 1
- elif key == SPACE:
- blocks[i].rotate()
- elif key == PAGE_UP:
- blocks[i].redo_color()
- i += 1
- elif key == PAGE_DOWN:
- blocks[i].redo_color()
- i -= 1
- elif key == ARROW_UP:
- blocks[i].move_up()
- elif key == ARROW_DOWN:
- blocks[i].move_down()
- elif key == ARROW_LEFT:
- blocks[i].move_left()
- elif key == ARROW_RIGHT:
- blocks[i].move_right()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement