commit 1a2ded0ea7fc49548cd457d834bb5a174dd16424 Author: Ting-Jun Wang Date: Thu Jun 30 17:44:03 2022 +0800 feat: 可以左右下轉 diff --git a/block.py b/block.py new file mode 100644 index 0000000..1908118 --- /dev/null +++ b/block.py @@ -0,0 +1,183 @@ +from turtle import right +from torch import true_divide +from traitlets import Bool +import copy + +BLOCK_FILL_LOC = [ + [[9, 10, 12, 13], [4, 8, 9, 13]], + [[8, 9, 13, 14], [5, 8, 9, 12]], + [[8, 12, 13, 14], [4, 5, 8, 12], [8, 9, 10, 14], [5, 9, 12, 13]], + [[10, 12, 13, 14], [4, 8, 12, 13], [8, 9, 10, 12], [4, 5, 9, 13]], + [[9, 12, 13, 14], [4, 8, 9, 12], [8, 9, 10, 13], [5, 8, 9, 13]], + [[8, 9, 12, 13]], + [[12, 13, 14, 15], [1, 5, 9, 13]] +] + + +class Board(): + ''' + | + --|------------- + 0 | |---- + | | + | | + | + | + 19 | + ''' + def __init__(self) -> None: + self.block = [[0 for _ in range(10)] for _ in range(20)] + + def show(self): + self.block[19] = [1 for i in range(10)] + for i in range(20): + print(str(i).rjust(2), end=' ') + for j in range(10): + if self.block[i][j]: + print('■', end='') + else: + print('□', end='') + print() + + +class Block(): + def __init__(self, block_id:int, board:Board) -> None: + self.block_id = block_id + self.x, self.y = 3, -2 + self.status = 0 + self.block = [[0 for i in range(4)] for i in range(4)] + self.board = board + self.update() + + def update(self): + id = self.block_id + status = self.status + + block = [[0 for i in range(4)] for i in range(4)] + counter = 0 + for i in range(4): + for j in range(4): + if counter in BLOCK_FILL_LOC[id][status]: + block[i][j] = 1 + counter += 1 + self.block = block + + def show(self) -> None: + for i in range(4): + for j in range(4): + if self.block[i][j]: + print('■', end='') + else: + print('□', end='') + print() + + def rotate(self) -> None: + self.status = (self.status+1)%len(BLOCK_FILL_LOC[self.block_id]) + self.update() + if(isCollision(self, self.board)): + self.status = (self.status-1)%len(BLOCK_FILL_LOC[self.block_id]) + self.update() + return False + else: + return True + + def fall(self) -> None: + self.y += 1 + if(isCollision(self, self.board)): + self.y -= 1 + return False + else: + return True + + def shiftRight(self) -> bool: + rightLimit = 0 + for col in range(4): + for row in range(4): + if self.block[row][col] and col>rightLimit: + rightLimit = col + + if (self.x+rightLimit)==9: + return False + else: + self.x += 1 + if(isCollision(self, self.board)): + self.x -= 1 + return False + else: + return True + + def shiftLeft(self) -> bool: + if (self.block_id == 6 and self.x == -1) or (self.block_id != 6 and self.x == 0): + # 長條判斷條件是-1 + return False + else: + self.x -= 1 + if(isCollision(self, self.board)): + self.x += 1 # 修正 + return False + else: + return True + +class TetrisGame(): + def __init__(self) -> None: + + +def view(block:Block, board:Board) -> list: + views = [] + for row in board.block: + views.append([]) + for col in row: + views[-1].append(col) + for onBlockY in range(4): + onBoardY = block.y+onBlockY + if onBoardY >= 0: + for onBlockX in range(4): + onBoardX = block.x+onBlockX + if onBoardX >= 10: + break + views[onBoardY][onBoardX] = block.block[onBlockY][onBlockX] + return views + +def isCollision(block:Block, board:Board) -> bool: + for onBlockY in range(4): + onBoardY = block.y+onBlockY + for onBlockX in range(4): + onBoardX = block.x+onBlockX + if block.block[onBlockY][onBlockX]==1: + if onBoardX >= 10 or onBoardX < 0 or onBoardY >= 20 or onBoardY < 0: + return True + if board.block[onBoardY][onBoardX]==1: + return True + return False + +board = Board() +# board.show() + +block = Block(0, board) +# block.show() +# print() + +views = view(block, board) + + +while 1: + views = view(block, board) + for i in range(20): + print(str(i).rjust(2), end=' ') + for j in range(10): + if views[i][j]: + print('■', end='') + else: + print('□', end='') + print() + action = input("Action: ") + if action == 'd': + block.fall() + elif action == 'l': + block.shiftLeft() + elif action == 'r': + block.shiftRight() + elif action == 'f': + block.rotate() + else: + continue