Files
@ ac1b7e45a643
Branch filter:
Location: Tetris/tetris.py - annotation
ac1b7e45a643
1.9 KiB
text/x-python
řešení základního tetrisu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 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 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 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 ac1b7e45a643 ac1b7e45a643 ac1b7e45a643 ac1b7e45a643 ac1b7e45a643 | EMPTY="."
FULL="O"
class Piece:
def __init__(self,variants):
self.variants=variants
pieces=[]
pieces.append(Piece([
# OO
# OO
((0,0),(0,1),(1,0),(1,1))
]))
pieces.append(Piece([
# OOOO
((0,0),(0,1),(0,2),(0,3)),
((0,0),(1,0),(2,0),(3,0))
]))
pieces.append(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))
]))
pieces.append(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))
]))
pieces.append(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=5
HEIGHT=5
board=[[EMPTY]*WIDTH for r in range(HEIGHT)]
def fill(board):
point=firstEmpty(board)
if not point: return True
res=[]
for p in pieces:
for v in p.variants:
if place(board,point,v):
partialRes=fill(board)
if partialRes:
res+=[((point,v), partialRes)]
remove(board,point,v)
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)
if res:
visualise(board,res)
else:
print(res)
|