Files
@ 86543e726ef8
Branch filter:
Location: Tetris/tetris.py
86543e726ef8
2.1 KiB
text/x-python
omezená sada dílků
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 120 121 122 | 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)
|