feat: 正常作動
This commit is contained in:
parent
1a2ded0ea7
commit
52bf416675
@ -1,7 +1,4 @@
|
|||||||
from turtle import right
|
import random
|
||||||
from torch import true_divide
|
|
||||||
from traitlets import Bool
|
|
||||||
import copy
|
|
||||||
|
|
||||||
BLOCK_FILL_LOC = [
|
BLOCK_FILL_LOC = [
|
||||||
[[9, 10, 12, 13], [4, 8, 9, 13]],
|
[[9, 10, 12, 13], [4, 8, 9, 13]],
|
||||||
@ -28,17 +25,29 @@ class Board():
|
|||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.block = [[0 for _ in range(10)] for _ in range(20)]
|
self.block = [[0 for _ in range(10)] for _ in range(20)]
|
||||||
|
|
||||||
def show(self):
|
def place(self, block):
|
||||||
self.block[19] = [1 for i in range(10)]
|
'''
|
||||||
for i in range(20):
|
把現在的方塊擺進去 board,代表確定方塊位置了
|
||||||
print(str(i).rjust(2), end=' ')
|
'''
|
||||||
for j in range(10):
|
self.block = view(self, block)
|
||||||
if self.block[i][j]:
|
|
||||||
print('■', end='')
|
|
||||||
else:
|
|
||||||
print('□', end='')
|
|
||||||
print()
|
|
||||||
|
|
||||||
|
def checkScore(self) -> int:
|
||||||
|
'''
|
||||||
|
檢查是否有連線,並回傳該動作得到的分數
|
||||||
|
'''
|
||||||
|
score = 0
|
||||||
|
for row in range(20):
|
||||||
|
flag = True
|
||||||
|
for col in range(10):
|
||||||
|
if self.block[row][col] == 0:
|
||||||
|
flag = False
|
||||||
|
break
|
||||||
|
if flag:
|
||||||
|
score += 1
|
||||||
|
self.block[0] = [0 for i in range(10)]
|
||||||
|
for updateRow in range(row, 0, -1):
|
||||||
|
self.block[updateRow] = self.block[updateRow-1]
|
||||||
|
return score
|
||||||
|
|
||||||
class Block():
|
class Block():
|
||||||
def __init__(self, block_id:int, board:Board) -> None:
|
def __init__(self, block_id:int, board:Board) -> None:
|
||||||
@ -49,6 +58,10 @@ class Block():
|
|||||||
self.board = board
|
self.board = board
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
block_id = random.randint(0, 6)
|
||||||
|
self.__init__(block_id, self.board)
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
id = self.block_id
|
id = self.block_id
|
||||||
status = self.status
|
status = self.status
|
||||||
@ -81,24 +94,17 @@ class Block():
|
|||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def fall(self) -> None:
|
def fall(self) -> bool:
|
||||||
self.y += 1
|
self.y += 1
|
||||||
if(isCollision(self, self.board)):
|
if(isCollision(self, self.board)):
|
||||||
self.y -= 1
|
self.y -= 1
|
||||||
|
self.board.place(self)
|
||||||
|
self.reset()
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def shiftRight(self) -> bool:
|
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
|
self.x += 1
|
||||||
if(isCollision(self, self.board)):
|
if(isCollision(self, self.board)):
|
||||||
self.x -= 1
|
self.x -= 1
|
||||||
@ -107,10 +113,6 @@ class Block():
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def shiftLeft(self) -> bool:
|
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
|
self.x -= 1
|
||||||
if(isCollision(self, self.board)):
|
if(isCollision(self, self.board)):
|
||||||
self.x += 1 # 修正
|
self.x += 1 # 修正
|
||||||
@ -120,9 +122,29 @@ class Block():
|
|||||||
|
|
||||||
class TetrisGame():
|
class TetrisGame():
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
block_id = random.randint(0, 6)
|
||||||
|
self.board = Board()
|
||||||
|
self.block = Block(block_id, self.board)
|
||||||
|
|
||||||
|
self.score = 0
|
||||||
|
|
||||||
def view(block:Block, board:Board) -> list:
|
def action(self, mode):
|
||||||
|
if mode == 'd':
|
||||||
|
self.block.fall()
|
||||||
|
elif mode == 'l':
|
||||||
|
self.block.shiftLeft()
|
||||||
|
elif mode == 'r':
|
||||||
|
self.block.shiftRight()
|
||||||
|
elif mode == 'f':
|
||||||
|
self.block.rotate()
|
||||||
|
|
||||||
|
self.score += self.board.checkScore()
|
||||||
|
print("SCORE:", self.score)
|
||||||
|
|
||||||
|
def view(self):
|
||||||
|
return view(self.board, self.block)
|
||||||
|
|
||||||
|
def view(board:Board, block:Block) -> list:
|
||||||
views = []
|
views = []
|
||||||
for row in board.block:
|
for row in board.block:
|
||||||
views.append([])
|
views.append([])
|
||||||
@ -135,7 +157,8 @@ def view(block:Block, board:Board) -> list:
|
|||||||
onBoardX = block.x+onBlockX
|
onBoardX = block.x+onBlockX
|
||||||
if onBoardX >= 10:
|
if onBoardX >= 10:
|
||||||
break
|
break
|
||||||
views[onBoardY][onBoardX] = block.block[onBlockY][onBlockX]
|
if block.block[onBlockY][onBlockX] == 1:
|
||||||
|
views[onBoardY][onBoardX] = 1
|
||||||
return views
|
return views
|
||||||
|
|
||||||
def isCollision(block:Block, board:Board) -> bool:
|
def isCollision(block:Block, board:Board) -> bool:
|
||||||
@ -149,35 +172,3 @@ def isCollision(block:Block, board:Board) -> bool:
|
|||||||
if board.block[onBoardY][onBoardX]==1:
|
if board.block[onBoardY][onBoardX]==1:
|
||||||
return True
|
return True
|
||||||
return False
|
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
|
|
||||||
Loading…
Reference in New Issue
Block a user