merge Scheduler and TetrisLogic classes

This commit is contained in:
adrienmalin 2019-09-29 12:19:57 +02:00
parent f5be3c1ad5
commit 5d606bb55b
2 changed files with 60 additions and 71 deletions

View File

@ -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()

View File

@ -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)