Files
@ 86543e726ef8
Branch filter:
Location: Tetris/tetris.py - annotation
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 | 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)
|