Compare commits

...

2 Commits

Author SHA1 Message Date
adrienmalin
317af4a3a6 optimization 2019-09-30 00:08:49 +02:00
adrienmalin
1eb75722e6 clockwise before counter 2019-09-29 23:13:38 +02:00
3 changed files with 41 additions and 48 deletions

View File

@ -13,7 +13,7 @@ You can install it with:
python -m pip install --user arcade""" python -m pip install --user arcade"""
) )
from tetrislogic import TetrisLogic, State, NB_LINES from tetrislogic import TetrisLogic, State
# Constants # Constants
@ -27,8 +27,8 @@ HIGHLIGHT_TEXT_DISPLAY_DELAY = 0.7
# Transparency (0=invisible, 255=opaque) # Transparency (0=invisible, 255=opaque)
NORMAL_ALPHA = 200 NORMAL_ALPHA = 200
PRELOCKED_ALPHA = 127 PRELOCKED_ALPHA = 100
GHOST_ALPHA = 50 GHOST_ALPHA = 30
MATRIX_SPRITE_ALPHA = 100 MATRIX_SPRITE_ALPHA = 100
# Paths # Paths
@ -183,57 +183,50 @@ class TetrArcade(TetrisLogic, arcade.Window):
def load_next(self): def load_next(self):
super().load_next() super().load_next()
for tetromino in self.next: for tetromino in self.next:
self.load_minoes_sprite(tetromino) self.load_minoes(tetromino)
def new_current(self): def new_current(self):
super().new_current() super().new_current()
self.update_sprites_position(self.current) self.update_tetromino(self.current)
self.load_minoes_sprite(self.next[-1]) self.load_minoes(self.next[-1])
self.load_minoes_sprite(self.ghost, GHOST_ALPHA) self.load_minoes(self.ghost, GHOST_ALPHA)
for tetromino in [self.current, self.ghost] + self.next: for tetromino in [self.current, self.ghost] + self.next:
self.update_sprites_position(tetromino) self.update_tetromino(tetromino)
self.reload_all_tetrominoes_sprites() self.reload_all_tetrominoes()
def move(self, movement, prelock=False): def move(self, movement, prelock=True):
if super().move(movement, prelock): moved = super().move(movement, prelock)
if moved or self.current.prelocked:
for tetromino in (self.current, self.ghost): for tetromino in (self.current, self.ghost):
self.update_sprites_position(tetromino) self.update_tetromino(tetromino)
return True return moved
else:
return False
def rotate(self, rotation): def rotate(self, rotation):
if super().rotate(rotation): if super().rotate(rotation):
for tetromino in (self.current, self.ghost): for tetromino in (self.current, self.ghost):
self.update_sprites_position(tetromino) self.update_tetromino(tetromino)
return True return True
else: else:
return False return False
def swap(self): def swap(self):
super().swap() super().swap()
self.load_minoes_sprite(self.ghost, GHOST_ALPHA) self.load_minoes(self.ghost, GHOST_ALPHA)
for tetromino in [self.held, self.current, self.ghost]: for tetromino in [self.held, self.current, self.ghost]:
if tetromino: if tetromino:
self.update_sprites_position(tetromino) self.update_tetromino(tetromino)
self.reload_all_tetrominoes_sprites() self.reload_all_tetrominoes()
def lock(self): def lock(self):
self.update_sprites_position(self.current) self.update_tetromino(self.current)
super().lock() super().lock()
self.matrix.minoes_sprites = arcade.SpriteList() self.matrix.minoes_sprites = arcade.SpriteList()
for line in self.matrix: for y, line in enumerate(self.matrix):
for mino in line: for x, mino in enumerate(line):
if mino: if mino:
self.update_mino(mino, x, y, NORMAL_ALPHA)
self.matrix.minoes_sprites.append(mino.sprite) self.matrix.minoes_sprites.append(mino.sprite)
def remove_line_of_matrix(self, line):
super().remove_line_of_matrix(line)
for line in self.matrix[line:NB_LINES+2]:
for mino in line:
if mino:
mino.sprite.center_y -= mino.sprite.height-1
def game_over(self): def game_over(self):
super().game_over() super().game_over()
@ -322,21 +315,21 @@ class TetrArcade(TetrisLogic, arcade.Window):
anchor_y = 'center' anchor_y = 'center'
) )
def load_minoes_sprite(self, tetromino, alpha=NORMAL_ALPHA): def load_minoes(self, tetromino, alpha=NORMAL_ALPHA):
path = MINOES_SPRITES_PATHS[tetromino.MINOES_COLOR] path = MINOES_SPRITES_PATHS[tetromino.MINOES_COLOR]
tetromino.alpha = alpha tetromino.alpha = alpha
for mino in tetromino: for mino in tetromino:
mino.sprite = arcade.Sprite(path) mino.sprite = arcade.Sprite(path)
mino.sprite.alpha = alpha mino.sprite.alpha = alpha
def reload_all_tetrominoes_sprites(self): def reload_all_tetrominoes(self):
self.tetrominoes_sprites = arcade.SpriteList() self.tetrominoes_sprites = arcade.SpriteList()
for tetromino in [self.held, self.current, self.ghost] + self.next: for tetromino in [self.held, self.current, self.ghost] + self.next:
if tetromino: if tetromino:
for mino in tetromino: for mino in tetromino:
self.tetrominoes_sprites.append(mino.sprite) self.tetrominoes_sprites.append(mino.sprite)
def update_sprites_position(self, tetromino): def update_tetromino(self, tetromino):
alpha = ( alpha = (
PRELOCKED_ALPHA PRELOCKED_ALPHA
if tetromino.prelocked if tetromino.prelocked
@ -344,9 +337,12 @@ class TetrArcade(TetrisLogic, arcade.Window):
) )
for mino in tetromino: for mino in tetromino:
coord = mino.coord + tetromino.coord coord = mino.coord + tetromino.coord
mino.sprite.left = self.matrix.sprite.left + coord.x*(mino.sprite.width-1) self.update_mino(mino, coord.x, coord.y, alpha)
mino.sprite.bottom = self.matrix.sprite.bottom + coord.y*(mino.sprite.height-1)
mino.sprite.alpha = alpha def update_mino(self, mino, x, y, alpha):
mino.sprite.left = self.matrix.sprite.left + x*(mino.sprite.width-1)
mino.sprite.bottom = self.matrix.sprite.bottom + y*(mino.sprite.height-1)
mino.sprite.alpha = alpha
def load_high_score(self): def load_high_score(self):
try: try:

View File

@ -258,7 +258,7 @@ class TetrisLogic():
for y, line in reversed(list(enumerate(self.matrix))): for y, line in reversed(list(enumerate(self.matrix))):
if all(mino for mino in line): if all(mino for mino in line):
nb_lines_cleared += 1 nb_lines_cleared += 1
self.remove_line_of_matrix(y) self.matrix.pop(y)
self.append_new_line_to_matrix() self.append_new_line_to_matrix()
if nb_lines_cleared: if nb_lines_cleared:
self.nb_lines_cleared += nb_lines_cleared self.nb_lines_cleared += nb_lines_cleared
@ -295,9 +295,6 @@ class TetrisLogic():
else: else:
self.new_current() self.new_current()
def remove_line_of_matrix(self, line):
self.matrix.pop(line)
def can_move(self, potential_coord, minoes_coords): def can_move(self, potential_coord, minoes_coords):
return all( return all(
self.matrix.cell_is_free(potential_coord+mino_coord) self.matrix.cell_is_free(potential_coord+mino_coord)

View File

@ -57,8 +57,8 @@ class Tetromino:
class O(AbstractTetromino, metaclass=MetaTetromino): class O(AbstractTetromino, metaclass=MetaTetromino):
SRS = { SRS = {
Rotation.CLOCKWISE: (tuple(), tuple(), tuple(), tuple()),
Rotation.COUNTER: (tuple(), tuple(), tuple(), tuple()), Rotation.COUNTER: (tuple(), tuple(), tuple(), tuple()),
Rotation.CLOCKWISE: (tuple(), tuple(), tuple(), tuple())
} }
MINOES_COORDS = (Coord(0, 0), Coord(1, 0), Coord(0, 1), Coord(1, 1)) MINOES_COORDS = (Coord(0, 0), Coord(1, 0), Coord(0, 1), Coord(1, 1))
MINOES_COLOR = "yellow" MINOES_COLOR = "yellow"
@ -70,18 +70,18 @@ class Tetromino:
class I(AbstractTetromino, metaclass=MetaTetromino): class I(AbstractTetromino, metaclass=MetaTetromino):
SRS = { SRS = {
Rotation.COUNTER: (
(Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)),
(Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)),
(Coord(0, 1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)),
(Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2))
),
Rotation.CLOCKWISE: ( Rotation.CLOCKWISE: (
(Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2)), (Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2)),
(Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)), (Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)),
(Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)), (Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)),
(Coord(0, -1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)) (Coord(0, -1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)),
) ),
Rotation.COUNTER: (
(Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)),
(Coord(-1, 0), Coord(1, 0), Coord(-2, 0), Coord(1, 1), Coord(-2, -2)),
(Coord(0, 1), Coord(1, 1), Coord(-2, 1), Coord(1, -1), Coord(-2, 2)),
(Coord(1, 0), Coord(-1, 0), Coord(2, 0), Coord(-1, -1), Coord(2, 2)),
),
} }
MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(2, 0)) MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(2, 0))
MINOES_COLOR = "cyan" MINOES_COLOR = "cyan"