From b95478ea8d03f1d37ef245d26c2620c19a244fa1 Mon Sep 17 00:00:00 2001 From: adrien Date: Wed, 2 Oct 2019 11:54:50 +0200 Subject: [PATCH] use texture, import from, black --- TetrArcade.py | 145 ++++++++++++++----------------------- res/blue_mino.png | Bin 165 -> 0 bytes res/cyan_mino.png | Bin 151 -> 0 bytes res/green_mino.png | Bin 167 -> 0 bytes res/held_mino.png | Bin 148 -> 0 bytes res/magenta_mino.png | Bin 165 -> 0 bytes res/minoes.png | Bin 0 -> 389 bytes res/orange_mino.png | Bin 165 -> 0 bytes res/red_mino.png | Bin 165 -> 0 bytes res/yellow_mino.png | Bin 143 -> 0 bytes setup.py | 8 +- test.py | 4 +- tetrislogic/__init__.py | 2 +- tetrislogic/tetrislogic.py | 35 +++------ tetrislogic/tetromino.py | 16 ++-- tetrislogic/utils.py | 11 ++- 16 files changed, 85 insertions(+), 136 deletions(-) delete mode 100644 res/blue_mino.png delete mode 100644 res/cyan_mino.png delete mode 100644 res/green_mino.png delete mode 100644 res/held_mino.png delete mode 100644 res/magenta_mino.png create mode 100644 res/minoes.png delete mode 100644 res/orange_mino.png delete mode 100644 res/red_mino.png delete mode 100644 res/yellow_mino.png diff --git a/TetrArcade.py b/TetrArcade.py index c524855..4d65be0 100644 --- a/TetrArcade.py +++ b/TetrArcade.py @@ -12,13 +12,15 @@ except ImportError: try: import arcade except ImportError as e: - sys.exit(str(e) + """ + sys.exit( + str(e) + + """ This game require arcade library. You can install it with: python -m pip install --user arcade""" ) -import tetrislogic +from tetrislogic import TetrisLogic, Color, State # Constants @@ -28,7 +30,6 @@ WINDOW_HEIGHT = 600 WINDOW_MIN_WIDTH = 517 WINDOW_MIN_HEIGHT = 388 WINDOW_TITLE = "TETRARCADE" -MINO_SIZE = 20 BG_COLOR = (7, 11, 21) # Delays (seconds) @@ -46,26 +47,30 @@ WINDOW_BG_PATH = "res/bg.jpg" MATRIX_BG_PATH = "res/matrix.png" HELD_BG_PATH = "res/held.png" NEXT_BG_PATH = "res/next.png" -MINOES_SPRITES_PATHS = { - "orange": "res/orange_mino.png", - "blue": "res/blue_mino.png", - "yellow": "res/yellow_mino.png", - "cyan": "res/cyan_mino.png", - "green": "res/green_mino.png", - "red": "res/red_mino.png", - "magenta": "res/magenta_mino.png", - "held": "res/held_mino.png" +MINOES_SPRITES_PATH = "res/minoes.png" +Color.PRELOCKED = 7 +MINOES_COLOR_ID = { + Color.BLUE: 0, + Color.CYAN: 1, + Color.GREEN: 2, + Color.MAGENTA: 3, + Color.ORANGE: 4, + Color.RED: 5, + Color.YELLOW: 6, + Color.PRELOCKED: 7, } +MINO_SIZE = 20 +MINO_SPRITE_SIZE = 21 +TEXTURES = arcade.load_textures( + MINOES_SPRITES_PATH, ((i * MINO_SPRITE_SIZE, 0, MINO_SPRITE_SIZE, MINO_SPRITE_SIZE) for i in range(8)) +) +TEXTURES = {color: TEXTURES[i] for color, i in MINOES_COLOR_ID.items()} # User profile path if sys.platform == "win32": - USER_PROFILE_DIR = os.environ.get( - "appdata", os.path.expanduser("~\Appdata\Roaming") - ) + USER_PROFILE_DIR = os.environ.get("appdata", os.path.expanduser("~\Appdata\Roaming")) else: - USER_PROFILE_DIR = os.environ.get( - "XDG_DATA_HOME", os.path.expanduser("~/.local/share") - ) + USER_PROFILE_DIR = os.environ.get("XDG_DATA_HOME", os.path.expanduser("~/.local/share")) USER_PROFILE_DIR = os.path.join(USER_PROFILE_DIR, "TetrArcade") HIGH_SCORE_PATH = os.path.join(USER_PROFILE_DIR, ".high_score") CONF_PATH = os.path.join(USER_PROFILE_DIR, "TetrArcade.ini") @@ -83,15 +88,17 @@ HIGHLIGHT_TEXT_SIZE = 20 class MinoSprite(arcade.Sprite): def __init__(self, mino, window, alpha): super().__init__() - self.append_texture(MINOES_SPRITES_PATHS[mino.color]) - self.append_texture(MINOES_SPRITES_PATHS["held"]) self.alpha = alpha self.window = window + self.append_texture(TEXTURES[mino.color]) + self.append_texture(TEXTURES[Color.PRELOCKED]) + self.set_texture(0) - def set_position(self, x, y): + def refresh(self, x, y, prelocked=False): size = MINO_SIZE * self.scale self.left = self.window.matrix_bg.left + x * size self.bottom = self.window.matrix_bg.bottom + y * size + self.set_texture(prelocked) class MinoesSprites(arcade.SpriteList): @@ -104,10 +111,6 @@ class MinoesSprites(arcade.SpriteList): class TetrominoSprites(MinoesSprites): def __init__(self, tetromino, window, alpha=NORMAL_ALPHA): super().__init__() - self.preload_textures([ - MINOES_SPRITES_PATHS[tetromino.MINOES_COLOR], - MINOES_SPRITES_PATHS["held"] - ]) self.tetromino = tetromino self.alpha = alpha for mino in tetromino: @@ -115,14 +118,9 @@ class TetrominoSprites(MinoesSprites): self.append(mino.sprite) def refresh(self): - if self.tetromino.prelocked: - texture = 1 - else: - texture = 0 for mino in self.tetromino: coord = mino.coord + self.tetromino.coord - mino.sprite.set_position(coord.x, coord.y) - mino.sprite.set_texture(texture) + mino.sprite.refresh(coord.x, coord.y, self.tetromino.prelocked) class MatrixSprites(MinoesSprites): @@ -135,11 +133,11 @@ class MatrixSprites(MinoesSprites): for y, line in enumerate(self.matrix): for x, mino in enumerate(line): if mino: - mino.sprite.set_position(x, y) + mino.sprite.refresh(x, y) self.append(mino.sprite) -class TetrArcade(tetrislogic.TetrisLogic, arcade.Window): +class TetrArcade(TetrisLogic, arcade.Window): def __init__(self): locale.setlocale(locale.LC_ALL, "") self.highlight_texts = [] @@ -180,11 +178,7 @@ class TetrArcade(tetrislogic.TetrisLogic, arcade.Window): self.on_resize(self.init_width, self.init_height) def new_conf(self): - self.conf["WINDOW"] = { - "width": WINDOW_WIDTH, - "height": WINDOW_HEIGHT, - "fullscreen": False, - } + self.conf["WINDOW"] = {"width": WINDOW_WIDTH, "height": WINDOW_HEIGHT, "fullscreen": False} self.conf["KEYBOARD"] = { "start": "ENTER", "move left": "LEFT", @@ -197,10 +191,7 @@ class TetrArcade(tetrislogic.TetrisLogic, arcade.Window): "pause": "ESCAPE", "fullscreen": "F11", } - self.conf["AUTO-REPEAT"] = { - "delay": 0.3, - "period": 0.01 - } + self.conf["AUTO-REPEAT"] = {"delay": 0.3, "period": 0.01} self.load_conf() if not os.path.exists(USER_PROFILE_DIR): os.makedirs(USER_PROFILE_DIR) @@ -213,42 +204,28 @@ class TetrArcade(tetrislogic.TetrisLogic, arcade.Window): self.init_fullscreen = self.conf["WINDOW"].getboolean("fullscreen") self.key_map = { - tetrislogic.State.STARTING: { + State.STARTING: { getattr(arcade.key, self.conf["KEYBOARD"]["start"]): self.new_game, - getattr( - arcade.key, self.conf["KEYBOARD"]["fullscreen"] - ): self.toggle_fullscreen, + getattr(arcade.key, self.conf["KEYBOARD"]["fullscreen"]): self.toggle_fullscreen, }, - tetrislogic.State.PLAYING: { + State.PLAYING: { getattr(arcade.key, self.conf["KEYBOARD"]["move left"]): self.move_left, - getattr( - arcade.key, self.conf["KEYBOARD"]["move right"] - ): self.move_right, + getattr(arcade.key, self.conf["KEYBOARD"]["move right"]): self.move_right, getattr(arcade.key, self.conf["KEYBOARD"]["soft drop"]): self.soft_drop, getattr(arcade.key, self.conf["KEYBOARD"]["hard drop"]): self.hard_drop, - getattr( - arcade.key, self.conf["KEYBOARD"]["rotate clockwise"] - ): self.rotate_clockwise, - getattr( - arcade.key, self.conf["KEYBOARD"]["rotate counter"] - ): self.rotate_counter, + getattr(arcade.key, self.conf["KEYBOARD"]["rotate clockwise"]): self.rotate_clockwise, + getattr(arcade.key, self.conf["KEYBOARD"]["rotate counter"]): self.rotate_counter, getattr(arcade.key, self.conf["KEYBOARD"]["hold"]): self.swap, getattr(arcade.key, self.conf["KEYBOARD"]["pause"]): self.pause, - getattr( - arcade.key, self.conf["KEYBOARD"]["fullscreen"] - ): self.toggle_fullscreen, + getattr(arcade.key, self.conf["KEYBOARD"]["fullscreen"]): self.toggle_fullscreen, }, - tetrislogic.State.PAUSED: { + State.PAUSED: { getattr(arcade.key, self.conf["KEYBOARD"]["pause"]): self.resume, - getattr( - arcade.key, self.conf["KEYBOARD"]["fullscreen"] - ): self.toggle_fullscreen, + getattr(arcade.key, self.conf["KEYBOARD"]["fullscreen"]): self.toggle_fullscreen, }, - tetrislogic.State.OVER: { + State.OVER: { getattr(arcade.key, self.conf["KEYBOARD"]["start"]): self.new_game, - getattr( - arcade.key, self.conf["KEYBOARD"]["fullscreen"] - ): self.toggle_fullscreen, + getattr(arcade.key, self.conf["KEYBOARD"]["fullscreen"]): self.toggle_fullscreen, }, } @@ -259,21 +236,12 @@ class TetrArcade(tetrislogic.TetrisLogic, arcade.Window): "\n\n\nCONTROLS\n\n" + "\n".join( "{:<16s}{:>6s}".format(key, action) - for key, action in tuple(self.conf["KEYBOARD"].items()) - + (("QUIT", "ALT+F4"),) + for key, action in tuple(self.conf["KEYBOARD"].items()) + (("QUIT", "ALT+F4"),) ) + "\n\n\n" ) - self.start_text = ( - "TETRARCADE" - + controls_text - + "PRESS [{}] TO START".format(self.conf["KEYBOARD"]["start"]) - ) - self.pause_text = ( - "PAUSE" - + controls_text - + "PRESS [{}] TO RESUME".format(self.conf["KEYBOARD"]["pause"]) - ) + self.start_text = "TETRARCADE" + controls_text + "PRESS [{}] TO START".format(self.conf["KEYBOARD"]["start"]) + self.pause_text = "PAUSE" + controls_text + "PRESS [{}] TO RESUME".format(self.conf["KEYBOARD"]["pause"]) self.game_over_text = """GAME OVER @@ -358,7 +326,7 @@ AGAIN""".format( arcade.start_render() self.bg.draw() - if self.state in (tetrislogic.State.PLAYING, tetrislogic.State.OVER): + if self.state in (State.PLAYING, State.OVER): self.matrix_bg.draw() self.held_bg.draw() self.next_bg.draw() @@ -370,13 +338,10 @@ AGAIN""".format( t = time.localtime(self.time) font_size = STATS_TEXT_SIZE * self.scale - for y, text in enumerate( - ("TIME", "LINES", "GOAL", "LEVEL", "HIGH SCORE", "SCORE") - ): + for y, text in enumerate(("TIME", "LINES", "GOAL", "LEVEL", "HIGH SCORE", "SCORE")): arcade.draw_text( text=text, - start_x=self.matrix_bg.left - - self.scale * (STATS_TEXT_MARGIN + STATS_TEXT_WIDTH), + start_x=self.matrix_bg.left - self.scale * (STATS_TEXT_MARGIN + STATS_TEXT_WIDTH), start_y=self.matrix_bg.bottom + 1.5 * (2 * y + 1) * font_size, color=TEXT_COLOR, font_size=font_size, @@ -406,12 +371,10 @@ AGAIN""".format( ) highlight_text = { - tetrislogic.State.STARTING: self.start_text, - tetrislogic.State.PLAYING: self.highlight_texts[0] - if self.highlight_texts - else "", - tetrislogic.State.PAUSED: self.pause_text, - tetrislogic.State.OVER: self.game_over_text, + State.STARTING: self.start_text, + State.PLAYING: self.highlight_texts[0] if self.highlight_texts else "", + State.PAUSED: self.pause_text, + State.OVER: self.game_over_text, }.get(self.state, "") if highlight_text: arcade.draw_text( diff --git a/res/blue_mino.png b/res/blue_mino.png deleted file mode 100644 index d5b67e93f23f8bda098e074f4f41cf00d4333c64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1SHi;jSd1S#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=Digg?tAYcTCKF3ly~Sba4!^@K3J!{O|u(Yn~^Jx}t2yoR|N9 zZ_D>|GS?hk$r%fLiVm)*J9Pkt9bPYA^CviwfuZmTUq*ZWgmpku7(8A5T-G@yGywnv CL^d)2 diff --git a/res/cyan_mino.png b/res/cyan_mino.png deleted file mode 100644 index b4d92aecae548cf5de573521ed5048033fce077d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RYSkfJR9T^xl_H+M9WCij$3p^r= z85sBufiR<}hF1en(9+YzF~q_@`42w}PY7FrbNbyX-lsu)m#(--&RCGMswvQUCBGZ* sQacILDZdh~1iWINCE?X<)z!$zusMcbMzZTuJ!lvI6;>1s;*b3=Digg?tAYcTCKF3ly~Rba4!^@K3J!|Nn7pTRTq*V=7zaG2{RG zxoJ0;MHK{p80|1{ocW|F@b8pH7;e1gANljR0zbn8BfjRY2ewW?a~M2b{an^LB{Ts5 D3|2IX diff --git a/res/held_mino.png b/res/held_mino.png deleted file mode 100644 index c265bf964887c33b77e3d018288b0cd03881af40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS0Aa?gYn_}xK}}B=#}EtuUkNVKr+|7Q4OrA(ulRNXsENVT)z4*}Q$iB}v$iMO diff --git a/res/magenta_mino.png b/res/magenta_mino.png deleted file mode 100644 index 4dde03f3bdb62067c5920e803f4ab136ec950164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1SHi;jSd1S#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=Digg?tAYcTCKF3ly~Sba4!^@K65p^WFdHw|Sm0%7wBW+phk9 z{~flclev!Um6)->r|95{x>E;W*x~i^HGhIr85kxn=36QGyX6+p6b4UMKbLh*2~7Zv CSvb)E diff --git a/res/minoes.png b/res/minoes.png new file mode 100644 index 0000000000000000000000000000000000000000..d5cebc538024c086b469bedde521db2da79d91b5 GIT binary patch literal 389 zcmV;00eb$4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0UAj}K~!i%?b@+w z0#Ou%Vc-0|L5g%%zC#-ObYg5o0@{eBqHbi7#E@_@g4Mar>}(;DIsEN3`?1{}?3;L< ziecOHnmE11TnpRFF%Ai1H_u!UbKV%T2R(T<}Tbq*`o_dCN^qGbKyKNnZUZRs3V z`0x9j;VV%x!zWHYYz?1LnGA1u`3zr)k{Ld6@?mTEjLKwq!^>y*N|em-iIWdo!)H_` z!y8^c!&jnYhEJS)*cv{gG8x|R@)^DoB{O{D!lvI6;>1s;*b3=Digg?tAYcTCKF3ly~Sba4!^@K65p|Eulc+0{Hx7zI_2{pUY# z6my5=>13`ie`hSvDLS~K?$iMoc6hyf%^%@FCI(+izS)nP>cWAhFnGH9xvX!lvI6;>1s;*b3=DinK$vl=HlH+5(8|-rF~q_@`Op8K#)m&Y=Xt{D>3Qt`_B=zK zSgxm&xfU&+xj?7r;EK9a2VmIY_3|};CQo5u$X4fDy6VR<6QC&!p00i_>zopr0O`#( AlmGw# diff --git a/res/yellow_mino.png b/res/yellow_mino.png deleted file mode 100644 index ed0b6b72a2269b916d768622c67932e44162d895..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1SHi;jSd1S#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DinK$vl=HlH+5P{q^5F~q_@`Op7N^BS2Buq-{vy7-qSGYl(7 c+cPsW@N8w8_~6o=XrOuqPgg&ebxsLQ0NU{-^Z)<= diff --git a/setup.py b/setup.py index a3e580b..8a03c97 100644 --- a/setup.py +++ b/setup.py @@ -14,17 +14,13 @@ setup( version="0.1", description="Tetris clone", author="adrienmalin", - executables=[Executable( - script="TetrArcade.py", - icon=icon, - base=base - )], + executables=[Executable(script="TetrArcade.py", icon=icon, base=base)], options={ "build_exe": { "packages": ["arcade", "pyglet"], "excludes": ["tkinter", "PyQt4", "PyQt5", "PySide", "PySide2"], "include_files": "res", - "silent": True + "silent": True, } }, ) diff --git a/test.py b/test.py index feba072..3e9e918 100644 --- a/test.py +++ b/test.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from TetrArcade import TetrArcade, tetrislogic +from TetrArcade import TetrArcade, State game = TetrArcade() game.new_game() @@ -11,5 +11,5 @@ game.rotate_counter() for i in range(12): game.soft_drop() game.on_draw() -while game.state != tetrislogic.State.OVER: +while game.state != State.OVER: game.hard_drop() diff --git a/tetrislogic/__init__.py b/tetrislogic/__init__.py index 8f2d2d6..3d0ce10 100644 --- a/tetrislogic/__init__.py +++ b/tetrislogic/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- from .consts import NB_LINES, NB_COLS, NB_NEXT -from .utils import Movement, Rotation +from .utils import Movement, Rotation, Color from .tetromino import Mino, Tetromino from .tetrislogic import TetrisLogic, State, Matrix diff --git a/tetrislogic/tetrislogic.py b/tetrislogic/tetrislogic.py index 4f233e3..4216770 100644 --- a/tetrislogic/tetrislogic.py +++ b/tetrislogic/tetrislogic.py @@ -2,7 +2,7 @@ import random import pickle -from .utils import Coord, Movement, Rotation, T_Spin, Line +from .utils import Coord, Movement, Rotation, T_Spin from .tetromino import Tetromino, T, I from .consts import ( NB_LINES, @@ -102,7 +102,7 @@ class TetrisLogic: return self.random_bag.pop()() def append_new_line_to_matrix(self): - self.matrix.append(Line(None for x in range(self.NB_COLS))) + self.matrix.append([None for x in range(self.NB_COLS)]) def new_level(self): self.level += 1 @@ -145,9 +145,7 @@ class TetrisLogic: self.ghost.coord = self.current.coord for ghost_mino, current_mino in zip(self.ghost, self.current): ghost_mino.coord = current_mino.coord - while self.can_move( - self.ghost.coord + Movement.DOWN, (mino.coord for mino in self.ghost) - ): + while self.can_move(self.ghost.coord + Movement.DOWN, (mino.coord for mino in self.ghost)): self.ghost.coord += Movement.DOWN def soft_drop(self): @@ -181,13 +179,8 @@ class TetrisLogic: return False def rotate(self, rotation): - rotated_coords = tuple( - Coord(rotation * mino.coord.y, -rotation * mino.coord.x) - for mino in self.current - ) - for rotation_point, liberty_degree in enumerate( - self.current.SRS[rotation][self.current.orientation], start=1 - ): + rotated_coords = tuple(Coord(rotation * mino.coord.y, -rotation * mino.coord.x) for mino in self.current) + for rotation_point, liberty_degree in enumerate(self.current.SRS[rotation][self.current.orientation], start=1): potential_coord = self.current.coord + liberty_degree if self.can_move(potential_coord, rotated_coords): if self.current.prelocked: @@ -215,16 +208,11 @@ class TetrisLogic: self.stop(self.lock) # Piece unlocked - if self.can_move( - self.current.coord + Movement.DOWN, (mino.coord for mino in self.current) - ): + if self.can_move(self.current.coord + Movement.DOWN, (mino.coord for mino in self.current)): return # Game over - if all( - (mino.coord + self.current.coord).y >= self.NB_LINES - for mino in self.current - ): + if all((mino.coord + self.current.coord).y >= self.NB_LINES for mino in self.current): self.game_over() return @@ -296,17 +284,12 @@ class TetrisLogic: self.new_current() def can_move(self, potential_coord, minoes_coords): - return all( - self.matrix.cell_is_free(potential_coord + mino_coord) - for mino_coord in minoes_coords - ) + return all(self.matrix.cell_is_free(potential_coord + mino_coord) for mino_coord in minoes_coords) T_SLOT_COORDS = (Coord(-1, 1), Coord(1, 1), Coord(-1, 1), Coord(-1, -1)) def is_t_slot(self, n): - t_slot_coord = ( - self.current.coord + self.T_SLOT_COORDS[(self.current.orientation + n) % 4] - ) + t_slot_coord = self.current.coord + self.T_SLOT_COORDS[(self.current.orientation + n) % 4] return not self.matrix.cell_is_free(t_slot_coord) def swap(self): diff --git a/tetrislogic/tetromino.py b/tetrislogic/tetromino.py index 4e67715..5401b96 100644 --- a/tetrislogic/tetromino.py +++ b/tetrislogic/tetromino.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from .utils import Coord, Rotation +from .utils import Coord, Rotation, Color class Mino: @@ -51,7 +51,7 @@ class O(Tetromino, metaclass=MetaTetromino): Rotation.COUNTER: (tuple(), tuple(), tuple(), tuple()), } MINOES_COORDS = (Coord(0, 0), Coord(1, 0), Coord(0, 1), Coord(1, 1)) - MINOES_COLOR = "yellow" + MINOES_COLOR = Color.YELLOW def rotate(self, direction): return False @@ -74,34 +74,34 @@ class I(Tetromino, metaclass=MetaTetromino): ), } MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(2, 0)) - MINOES_COLOR = "cyan" + MINOES_COLOR = Color.CYAN class T(Tetromino, metaclass=MetaTetromino): MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 0)) - MINOES_COLOR = "magenta" + MINOES_COLOR = Color.MAGENTA class L(Tetromino, metaclass=MetaTetromino): MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(1, 1)) - MINOES_COLOR = "orange" + MINOES_COLOR = Color.ORANGE class J(Tetromino, metaclass=MetaTetromino): MINOES_COORDS = (Coord(-1, 1), Coord(-1, 0), Coord(0, 0), Coord(1, 0)) - MINOES_COLOR = "blue" + MINOES_COLOR = Color.BLUE class S(Tetromino, metaclass=MetaTetromino): MINOES_COORDS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 1)) - MINOES_COLOR = "green" + MINOES_COLOR = Color.GREEN class Z(Tetromino, metaclass=MetaTetromino): MINOES_COORDS = (Coord(-1, 1), Coord(0, 1), Coord(0, 0), Coord(1, 0)) - MINOES_COLOR = "red" + MINOES_COLOR = Color.RED diff --git a/tetrislogic/utils.py b/tetrislogic/utils.py index 4423027..82200dc 100644 --- a/tetrislogic/utils.py +++ b/tetrislogic/utils.py @@ -28,5 +28,12 @@ class T_Spin: T_SPIN = "T-SPIN" -class Line(list): - pass +class Color: + + BLUE = 0 + CYAN = 1 + GREEN = 2 + MAGENTA = 3 + ORANGE = 4 + RED = 5 + YELLOW = 6