Files @ 86543e726ef8
Branch filter:

Location: Tetris/tetris.py - annotation

Laman
omezená sada dílků
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
86543e726ef8
ac1b7e45a643
ac1b7e45a643
86543e726ef8
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
86543e726ef8
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
ac1b7e45a643
EMPTY="."
FULL="O"


class Piece:
	def __init__(self,variants):
		self.variants=variants


pieceSet=dict()

pieceSet["sq"]=Piece([
	# OO
	# OO
	((0,0),(0,1),(1,0),(1,1))
])

pieceSet["long"]=Piece([
	# OOOO
	((0,0),(0,1),(0,2),(0,3)),
	((0,0),(1,0),(2,0),(3,0))
])

pieceSet["boat"]=Piece([
	# OOO
	# .O.
	((0,0),(0,1),(0,2),(1,1)),
	((0,0),(1,0),(2,0),(1,1)),
	((0,0),(1,-1),(1,0),(1,1)),
	((0,0),(1,-1),(1,0),(2,0))
])

pieceSet["sz"]=Piece([
	# .OO
	# OO.
	((0,0),(0,1),(1,-1),(1,0)),
	((0,0),(1,0),(1,1),(2,1)),

	# OO.
	# .OO
	((0,0),(0,1),(1,1),(1,2)),
	((0,0),(1,0),(1,-1),(2,-1))
])

pieceSet["el"]=Piece([
	# OOO
	# O..
	((0,0),(1,0),(0,1),(0,2)),
	((0,0),(1,0),(2,0),(2,1)),
	((0,0),(1,-2),(1,-1),(1,0)),
	((0,0),(0,1),(1,1),(2,1)),

	# OOO
	# ..O
	((0,0),(0,1),(0,2),(1,2)),
	((0,0),(0,1),(1,0),(2,0)),
	((0,0),(1,0),(1,1),(1,2)),
	((0,0),(1,0),(2,0),(2,-1))
])

WIDTH=8
HEIGHT=5
board=[[EMPTY]*WIDTH for r in range(HEIGHT)]


def fill(board,pieces):
	point=firstEmpty(board)
	if not point: return True
	res=[]
	for (i,(k,p)) in enumerate(pieces):
		if k==0: continue
		for v in p.variants:
			if place(board,point,v):
				pieces[i][0]-=1
				partialRes=fill(board,pieces)
				if partialRes:
					res+=[((point,v), partialRes)]
				remove(board,point,v)
				pieces[i][0]+=1
	return res


def firstEmpty(board):
	for (r,row) in enumerate(board):
		for (c,cell) in enumerate(row):
			if cell==EMPTY:
				return (r,c)
	return None


def place(board,point,piece):
	(r,c)=point
	if not all(0<=r+ri<HEIGHT and 0<=c+ci<WIDTH and board[r+ri][c+ci]==EMPTY for (ri,ci) in piece):
		return False
	for (ri,ci) in piece:
		board[r+ri][c+ci]=FULL
	return True


def remove(board,point,piece):
	(r,c)=point
	for (ri,ci) in piece:
		board[r+ri][c+ci]=EMPTY


def visualise(board,tree,letter="A"):
	if tree is True:
		for row in board:
			print("".join(row))
		print()
		return
	for (((r,c),piece),rest) in tree:
		for (ri,ci) in piece:
			board[r+ri][c+ci]=letter
		visualise(board,rest,chr(ord(letter)+1))


res=fill(board,[[k,pieceSet[x]] for (k,x) in [(2,"sq"),(2,"el"),(2,"boat"),(2,"long"),(2,"sz")]])
if res:
	visualise(board,res)
else:
	print(res)