diff --git a/tetrarcade.py b/tetrarcade.py index 6458d09..3d82e14 100644 --- a/tetrarcade.py +++ b/tetrarcade.py @@ -14,7 +14,7 @@ python -m pip install --user arcade """ ) -from tetrislogic import TetrisLogic, State, AbstractScheduler, NB_LINES +from tetrislogic import TetrisLogic, State, NB_LINES # Constants @@ -93,40 +93,8 @@ GHOST_ALPHA = 50 MATRIX_SRITE_ALPHA = 100 -class ArcadeScheduler(AbstractScheduler): - - def __init__(self): - self._tasks = {} - - def start(self, task, period): - _task = lambda _: task() - self._tasks[task] = _task - arcade.schedule(_task, period) - - def stop(self, task): - try: - _task = self._tasks[task] - except KeyError: - pass - else: - arcade.unschedule(_task) - del self._tasks[task] - - def restart(self, task, period): - try: - _task = self._tasks[task] - except KeyError: - _task = lambda _: task() - self._tasks[task] = _task - else: - arcade.unschedule(_task) - arcade.schedule(_task, period) - - class TetrArcade(TetrisLogic, arcade.Window): - scheduler = ArcadeScheduler() - def __init__(self): super().__init__() @@ -203,6 +171,8 @@ class TetrArcade(TetrisLogic, arcade.Window): anchor_x = 'right' ) + self.tasks = {} + def new_game(self): self.highlight_texts = [] self.matrix_minoes_sprites = [] @@ -266,13 +236,13 @@ class TetrArcade(TetrisLogic, arcade.Window): def show_text(self, text): self.highlight_texts.append(text) - self.scheduler.restart(self.del_highlight_text, HIGHLIGHT_TEXT_DISPLAY_DELAY) + self.restart(self.del_highlight_text, HIGHLIGHT_TEXT_DISPLAY_DELAY) def del_highlight_text(self): if self.highlight_texts: self.highlight_texts.pop(0) else: - self.scheduler.stop(self.del_highlight_text) + self.stop(self.del_highlight_text) def reload_piece(self, piece): piece_sprites = arcade.SpriteList() @@ -418,6 +388,30 @@ High score could not be saved: + str(e) ) + def start(self, task, period): + _task = lambda _: task() + self.tasks[task] = _task + arcade.schedule(_task, period) + + def stop(self, task): + try: + _task = self.tasks[task] + except KeyError: + pass + else: + arcade.unschedule(_task) + del self.tasks[task] + + def restart(self, task, period): + try: + _task = self.tasks[task] + except KeyError: + _task = lambda _: task() + self.tasks[task] = _task + else: + arcade.unschedule(_task) + arcade.schedule(_task, period) + def main(): tetrarcade = TetrArcade() diff --git a/tetrislogic.py b/tetrislogic.py index 5d0119c..b711e01 100644 --- a/tetrislogic.py +++ b/tetrislogic.py @@ -61,19 +61,6 @@ class T_Spin: T_SPIN = "T-SPIN" -class AbstractScheduler: - - def start(task, period): - raise Warning("AbstractScheduler.start is not implemented.") - - def stop(self, task): - raise Warning("AbstractScheduler.stop is not implemented.") - - def restart(self, task, period): - self.stop(task) - self.start(task, period) - - class Tetromino: random_bag = [] @@ -197,8 +184,6 @@ class Tetromino: class TetrisLogic(): - scheduler = AbstractScheduler() - def __init__(self): self.load_high_score() self.state = State.STARTING @@ -241,7 +226,7 @@ class TetrisLogic(): self.current_piece = None self.held_piece = None self.state = State.PLAYING - self.scheduler.start(self.update_time, 1) + self.start(self.update_time, 1) self.new_level() def new_level(self): @@ -252,7 +237,7 @@ class TetrisLogic(): if self.level > 15: self.lock_delay = 0.5 * pow(0.9, self.level-15) self.show_text("LEVEL\n{:n}".format(self.level)) - self.scheduler.restart(self.fall, self.fall_delay) + self.restart(self.fall, self.fall_delay) self.new_current_piece() def new_current_piece(self): @@ -309,7 +294,7 @@ class TetrisLogic(): potential_coord = self.current_piece.coord + movement if self.can_move(potential_coord, self.current_piece.minoes_coords): if self.current_piece.prelocked: - self.scheduler.restart(self.lock, self.lock_delay) + self.restart(self.lock, self.lock_delay) self.current_piece.coord = potential_coord if not movement == Movement.DOWN: self.current_piece.last_rotation_point_used = None @@ -321,7 +306,7 @@ class TetrisLogic(): and movement == Movement.DOWN ): self.current_piece.prelocked = True - self.scheduler.start(self.lock, self.lock_delay) + self.start(self.lock, self.lock_delay) return False def rotate(self, direction): @@ -336,7 +321,7 @@ class TetrisLogic(): potential_coord = self.current_piece.coord + liberty_degree if self.can_move(potential_coord, rotated_minoes_coords): if self.current_piece.prelocked: - self.scheduler.restart(self.lock, self.lock_delay) + self.restart(self.lock, self.lock_delay) self.current_piece.coord = potential_coord self.current_piece.minoes_coords = rotated_minoes_coords self.current_piece.orientation = ( @@ -363,10 +348,10 @@ class TetrisLogic(): # Start lock self.current_piece.prelocked = False - self.scheduler.stop(self.lock) + self.stop(self.lock) if self.pressed_actions: self.auto_repeat = False - self.scheduler.restart(self.repeat_action, AUTOREPEAT_DELAY) + self.restart(self.repeat_action, AUTOREPEAT_DELAY) # Game over if all( @@ -483,7 +468,7 @@ class TetrisLogic(): if self.current_piece.hold_enabled: self.current_piece.hold_enabled = False self.current_piece.prelocked = False - self.scheduler.stop(self.lock) + self.stop(self.lock) self.current_piece, self.held_piece = self.held_piece, self.current_piece if self.held_piece.__class__ == Tetromino.I: self.held_piece.coord = HELD_I_COORD @@ -499,25 +484,25 @@ class TetrisLogic(): def pause(self): self.state = State.PAUSED - self.scheduler.stop(self.fall) - self.scheduler.stop(self.lock) - self.scheduler.stop(self.update_time) + self.stop(self.fall) + self.stop(self.lock) + self.stop(self.update_time) self.pressed_actions = [] self.auto_repeat = False - self.scheduler.stop(self.repeat_action) + self.stop(self.repeat_action) def resume(self): self.state = State.PLAYING - self.scheduler.start(self.fall, self.fall_delay) + self.start(self.fall, self.fall_delay) if self.current_piece.prelocked: - self.scheduler.start(self.lock, self.lock_delay) - self.scheduler.start(self.update_time, 1) + self.start(self.lock, self.lock_delay) + self.start(self.update_time, 1) def game_over(self): self.state = State.OVER - self.scheduler.stop(self.fall) - self.scheduler.stop(self.update_time) - self.scheduler.stop(self.repeat_action) + self.stop(self.fall) + self.stop(self.update_time) + self.stop(self.repeat_action) self.save_high_score() def update_time(self): @@ -528,17 +513,17 @@ class TetrisLogic(): if action in self.autorepeatable_actions: self.auto_repeat = False self.pressed_actions.append(action) - self.scheduler.restart(self.repeat_action, AUTOREPEAT_DELAY) + self.restart(self.repeat_action, AUTOREPEAT_DELAY) def repeat_action(self): if self.pressed_actions: self.pressed_actions[-1]() if not self.auto_repeat: self.auto_repeat = True - self.scheduler.restart(self.repeat_action, AUTOREPEAT_PERIOD) + self.restart(self.repeat_action, AUTOREPEAT_PERIOD) else: self.auto_repeat = False - self.scheduler.stop(self.repeat_action) + self.stop(self.repeat_action) def remove_action(self, action): if action in self.autorepeatable_actions: @@ -565,3 +550,13 @@ High score is set to 0""" High score is not saved""" ) + def start(task, period): + raise Warning("TetrisLogic.start is not implemented.") + + def stop(self, task): + raise Warning("TetrisLogic.stop is not implemented.") + + def restart(self, task, period): + self.stop(task) + self.start(task, period) +