This commit is contained in:
Adrien MALINGREY 2019-10-08 08:35:08 +02:00
parent 0d7470fd51
commit 8e6359bfa3
3 changed files with 25 additions and 13 deletions

View File

@ -20,7 +20,7 @@ import os
import itertools
import configparser
from tetrislogic import TetrisLogic, Color, Coord, I_Tetrimino, Movement, AbstractTimer
from tetrislogic import TetrisLogic, Color, Coord, I_Tetrimino, Movement, AbstractScheduler
# Constants
@ -134,7 +134,7 @@ class State:
OVER = 3
class Timer(AbstractTimer):
class Scheduler(AbstractScheduler):
def __init__(self):
self.tasks = {}
@ -226,7 +226,7 @@ class MatrixSprites(MinoesSprites):
class TetrArcade(TetrisLogic, arcade.Window):
timer = Timer()
timer = Scheduler()
def __init__(self):
locale.setlocale(locale.LC_ALL, "")

View File

@ -12,4 +12,4 @@ from .tetromino import (
T_Tetrimino,
Z_Tetrimino,
)
from .tetrislogic import TetrisLogic, Matrix, AbstractTimer
from .tetrislogic import TetrisLogic, Matrix, AbstractScheduler

View File

@ -1,4 +1,9 @@
# -*- coding: utf-8 -*-
"""Tetris game logic meant to be implemented with GUI
Follows Tetris Guidelines 2009 (see https://tetris.fandom.com/wiki/Tetris_Guideline)
"""
import pickle
from .utils import Coord, Movement, Spin, T_Spin, T_Slot
@ -20,31 +25,34 @@ from .consts import (
CRYPT_KEY = 987943759387540938469837689379857347598347598379584857934579343
class AbstractTimer:
class AbstractScheduler:
def postpone(task, delay):
"""schedule callable task once after delay in second"""
raise Warning("AbstractTimer.postpone is not implemented.")
def cancel(self, task):
"""cancel task if schedule of pass"""
raise Warning("AbstractTimer.stop is not implemented.")
def reset(self, task, period):
"""cancel and reschedule task"""
self.timer.cancel(task)
self.timer.postpone(task, period)
class PieceContainer:
class AbstractPieceContainer:
def __init__(self):
self.piece = None
class HoldQueue(PieceContainer):
class HoldQueue(AbstractPieceContainer):
pass
class Matrix(list, PieceContainer):
class Matrix(list, AbstractPieceContainer):
def __init__(self, lines, collumns):
list.__init__(self)
PieceContainer.__init__(self)
AbstractPieceContainer.__init__(self)
self.lines = lines
self.collumns = collumns
self.ghost = None
@ -74,7 +82,7 @@ class Matrix(list, PieceContainer):
)
class NextQueue(PieceContainer):
class NextQueue(AbstractPieceContainer):
def __init__(self, nb_pieces):
super().__init__()
self.nb_pieces = nb_pieces
@ -147,24 +155,28 @@ class Stats:
class TetrisLogic:
"""Tetris game logic"""
# These class attributes can be redefined on inheritance
AUTOREPEAT_DELAY = AUTOREPEAT_DELAY
AUTOREPEAT_PERIOD = AUTOREPEAT_PERIOD
MATRIX_PIECE_COORD = MATRIX_PIECE_COORD
timer = AbstractTimer()
timer = AbstractScheduler()
def __init__(self, lines=LINES, collumns=COLLUMNS, next_pieces=NEXT_PIECES):
def __init__(self, lines=LINES, collumns=COLLUMNS, nb_next_pieces=NEXT_PIECES):
"""init game with a `lines`x`collumns` size matrix
and `nb_next_pieces`"""
self.stats = Stats()
self.load_high_score()
self.held = HoldQueue()
self.matrix = Matrix(lines, collumns)
self.next = NextQueue(next_pieces)
self.next = NextQueue(nb_next_pieces)
self.autorepeatable_actions = (self.move_left, self.move_right, self.soft_drop)
self.pressed_actions = []
def new_game(self, level=1):
"""start a new game at `level`"""
self.stats.new_game(level)
self.pressed_actions = []