merge Scheduler and TetrisLogic classes
This commit is contained in:
parent
f5be3c1ad5
commit
5d606bb55b
@ -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
|
# Constants
|
||||||
@ -93,40 +93,8 @@ GHOST_ALPHA = 50
|
|||||||
MATRIX_SRITE_ALPHA = 100
|
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):
|
class TetrArcade(TetrisLogic, arcade.Window):
|
||||||
|
|
||||||
scheduler = ArcadeScheduler()
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
@ -203,6 +171,8 @@ class TetrArcade(TetrisLogic, arcade.Window):
|
|||||||
anchor_x = 'right'
|
anchor_x = 'right'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.tasks = {}
|
||||||
|
|
||||||
def new_game(self):
|
def new_game(self):
|
||||||
self.highlight_texts = []
|
self.highlight_texts = []
|
||||||
self.matrix_minoes_sprites = []
|
self.matrix_minoes_sprites = []
|
||||||
@ -266,13 +236,13 @@ class TetrArcade(TetrisLogic, arcade.Window):
|
|||||||
|
|
||||||
def show_text(self, text):
|
def show_text(self, text):
|
||||||
self.highlight_texts.append(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):
|
def del_highlight_text(self):
|
||||||
if self.highlight_texts:
|
if self.highlight_texts:
|
||||||
self.highlight_texts.pop(0)
|
self.highlight_texts.pop(0)
|
||||||
else:
|
else:
|
||||||
self.scheduler.stop(self.del_highlight_text)
|
self.stop(self.del_highlight_text)
|
||||||
|
|
||||||
def reload_piece(self, piece):
|
def reload_piece(self, piece):
|
||||||
piece_sprites = arcade.SpriteList()
|
piece_sprites = arcade.SpriteList()
|
||||||
@ -418,6 +388,30 @@ High score could not be saved:
|
|||||||
+ str(e)
|
+ 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():
|
def main():
|
||||||
tetrarcade = TetrArcade()
|
tetrarcade = TetrArcade()
|
||||||
|
@ -61,19 +61,6 @@ class T_Spin:
|
|||||||
T_SPIN = "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:
|
class Tetromino:
|
||||||
|
|
||||||
random_bag = []
|
random_bag = []
|
||||||
@ -197,8 +184,6 @@ class Tetromino:
|
|||||||
|
|
||||||
class TetrisLogic():
|
class TetrisLogic():
|
||||||
|
|
||||||
scheduler = AbstractScheduler()
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.load_high_score()
|
self.load_high_score()
|
||||||
self.state = State.STARTING
|
self.state = State.STARTING
|
||||||
@ -241,7 +226,7 @@ class TetrisLogic():
|
|||||||
self.current_piece = None
|
self.current_piece = None
|
||||||
self.held_piece = None
|
self.held_piece = None
|
||||||
self.state = State.PLAYING
|
self.state = State.PLAYING
|
||||||
self.scheduler.start(self.update_time, 1)
|
self.start(self.update_time, 1)
|
||||||
self.new_level()
|
self.new_level()
|
||||||
|
|
||||||
def new_level(self):
|
def new_level(self):
|
||||||
@ -252,7 +237,7 @@ class TetrisLogic():
|
|||||||
if self.level > 15:
|
if self.level > 15:
|
||||||
self.lock_delay = 0.5 * pow(0.9, self.level-15)
|
self.lock_delay = 0.5 * pow(0.9, self.level-15)
|
||||||
self.show_text("LEVEL\n{:n}".format(self.level))
|
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()
|
self.new_current_piece()
|
||||||
|
|
||||||
def new_current_piece(self):
|
def new_current_piece(self):
|
||||||
@ -309,7 +294,7 @@ class TetrisLogic():
|
|||||||
potential_coord = self.current_piece.coord + movement
|
potential_coord = self.current_piece.coord + movement
|
||||||
if self.can_move(potential_coord, self.current_piece.minoes_coords):
|
if self.can_move(potential_coord, self.current_piece.minoes_coords):
|
||||||
if self.current_piece.prelocked:
|
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.coord = potential_coord
|
||||||
if not movement == Movement.DOWN:
|
if not movement == Movement.DOWN:
|
||||||
self.current_piece.last_rotation_point_used = None
|
self.current_piece.last_rotation_point_used = None
|
||||||
@ -321,7 +306,7 @@ class TetrisLogic():
|
|||||||
and movement == Movement.DOWN
|
and movement == Movement.DOWN
|
||||||
):
|
):
|
||||||
self.current_piece.prelocked = True
|
self.current_piece.prelocked = True
|
||||||
self.scheduler.start(self.lock, self.lock_delay)
|
self.start(self.lock, self.lock_delay)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def rotate(self, direction):
|
def rotate(self, direction):
|
||||||
@ -336,7 +321,7 @@ class TetrisLogic():
|
|||||||
potential_coord = self.current_piece.coord + liberty_degree
|
potential_coord = self.current_piece.coord + liberty_degree
|
||||||
if self.can_move(potential_coord, rotated_minoes_coords):
|
if self.can_move(potential_coord, rotated_minoes_coords):
|
||||||
if self.current_piece.prelocked:
|
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.coord = potential_coord
|
||||||
self.current_piece.minoes_coords = rotated_minoes_coords
|
self.current_piece.minoes_coords = rotated_minoes_coords
|
||||||
self.current_piece.orientation = (
|
self.current_piece.orientation = (
|
||||||
@ -363,10 +348,10 @@ class TetrisLogic():
|
|||||||
|
|
||||||
# Start lock
|
# Start lock
|
||||||
self.current_piece.prelocked = False
|
self.current_piece.prelocked = False
|
||||||
self.scheduler.stop(self.lock)
|
self.stop(self.lock)
|
||||||
if self.pressed_actions:
|
if self.pressed_actions:
|
||||||
self.auto_repeat = False
|
self.auto_repeat = False
|
||||||
self.scheduler.restart(self.repeat_action, AUTOREPEAT_DELAY)
|
self.restart(self.repeat_action, AUTOREPEAT_DELAY)
|
||||||
|
|
||||||
# Game over
|
# Game over
|
||||||
if all(
|
if all(
|
||||||
@ -483,7 +468,7 @@ class TetrisLogic():
|
|||||||
if self.current_piece.hold_enabled:
|
if self.current_piece.hold_enabled:
|
||||||
self.current_piece.hold_enabled = False
|
self.current_piece.hold_enabled = False
|
||||||
self.current_piece.prelocked = 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
|
self.current_piece, self.held_piece = self.held_piece, self.current_piece
|
||||||
if self.held_piece.__class__ == Tetromino.I:
|
if self.held_piece.__class__ == Tetromino.I:
|
||||||
self.held_piece.coord = HELD_I_COORD
|
self.held_piece.coord = HELD_I_COORD
|
||||||
@ -499,25 +484,25 @@ class TetrisLogic():
|
|||||||
|
|
||||||
def pause(self):
|
def pause(self):
|
||||||
self.state = State.PAUSED
|
self.state = State.PAUSED
|
||||||
self.scheduler.stop(self.fall)
|
self.stop(self.fall)
|
||||||
self.scheduler.stop(self.lock)
|
self.stop(self.lock)
|
||||||
self.scheduler.stop(self.update_time)
|
self.stop(self.update_time)
|
||||||
self.pressed_actions = []
|
self.pressed_actions = []
|
||||||
self.auto_repeat = False
|
self.auto_repeat = False
|
||||||
self.scheduler.stop(self.repeat_action)
|
self.stop(self.repeat_action)
|
||||||
|
|
||||||
def resume(self):
|
def resume(self):
|
||||||
self.state = State.PLAYING
|
self.state = State.PLAYING
|
||||||
self.scheduler.start(self.fall, self.fall_delay)
|
self.start(self.fall, self.fall_delay)
|
||||||
if self.current_piece.prelocked:
|
if self.current_piece.prelocked:
|
||||||
self.scheduler.start(self.lock, self.lock_delay)
|
self.start(self.lock, self.lock_delay)
|
||||||
self.scheduler.start(self.update_time, 1)
|
self.start(self.update_time, 1)
|
||||||
|
|
||||||
def game_over(self):
|
def game_over(self):
|
||||||
self.state = State.OVER
|
self.state = State.OVER
|
||||||
self.scheduler.stop(self.fall)
|
self.stop(self.fall)
|
||||||
self.scheduler.stop(self.update_time)
|
self.stop(self.update_time)
|
||||||
self.scheduler.stop(self.repeat_action)
|
self.stop(self.repeat_action)
|
||||||
self.save_high_score()
|
self.save_high_score()
|
||||||
|
|
||||||
def update_time(self):
|
def update_time(self):
|
||||||
@ -528,17 +513,17 @@ class TetrisLogic():
|
|||||||
if action in self.autorepeatable_actions:
|
if action in self.autorepeatable_actions:
|
||||||
self.auto_repeat = False
|
self.auto_repeat = False
|
||||||
self.pressed_actions.append(action)
|
self.pressed_actions.append(action)
|
||||||
self.scheduler.restart(self.repeat_action, AUTOREPEAT_DELAY)
|
self.restart(self.repeat_action, AUTOREPEAT_DELAY)
|
||||||
|
|
||||||
def repeat_action(self):
|
def repeat_action(self):
|
||||||
if self.pressed_actions:
|
if self.pressed_actions:
|
||||||
self.pressed_actions[-1]()
|
self.pressed_actions[-1]()
|
||||||
if not self.auto_repeat:
|
if not self.auto_repeat:
|
||||||
self.auto_repeat = True
|
self.auto_repeat = True
|
||||||
self.scheduler.restart(self.repeat_action, AUTOREPEAT_PERIOD)
|
self.restart(self.repeat_action, AUTOREPEAT_PERIOD)
|
||||||
else:
|
else:
|
||||||
self.auto_repeat = False
|
self.auto_repeat = False
|
||||||
self.scheduler.stop(self.repeat_action)
|
self.stop(self.repeat_action)
|
||||||
|
|
||||||
def remove_action(self, action):
|
def remove_action(self, action):
|
||||||
if action in self.autorepeatable_actions:
|
if action in self.autorepeatable_actions:
|
||||||
@ -565,3 +550,13 @@ High score is set to 0"""
|
|||||||
High score is not saved"""
|
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)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user