diff options
author | Aineopintojen-harjoitustyo-Algoritmit-j <github-hy-tiralabra@v.hix.fi> | 2024-02-17 09:41:48 +0200 |
---|---|---|
committer | Aineopintojen-harjoitustyo-Algoritmit-j <github-hy-tiralabra@v.hix.fi> | 2024-02-17 09:41:48 +0200 |
commit | e785dbd4f726c5716f21071ed25dc35ac87c0c74 (patch) | |
tree | 781373b78380a1ffd1ea8c5dc8ceb2bd313631e9 /tui | |
parent | 4eff4a32cfa594cc2a3df3885de92d407edc6675 (diff) |
Dev tools and directory structure rework.
Diffstat (limited to 'tui')
-rw-r--r-- | tui/__init__.py | 3 | ||||
-rw-r--r-- | tui/ansi.py | 46 | ||||
-rw-r--r-- | tui/ansi_draw.py | 58 | ||||
-rw-r--r-- | tui/kbd.py | 86 | ||||
-rw-r--r-- | tui/static.py | 76 | ||||
-rw-r--r-- | tui/tui.py | 109 |
6 files changed, 0 insertions, 378 deletions
diff --git a/tui/__init__.py b/tui/__init__.py deleted file mode 100644 index 0c8d632..0000000 --- a/tui/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -""" tui - hoitaa käyttäjälle katseltavaa ja havaitsee syötteet """ -from .tui import Tui -from .static import Action, KEY_DESCRIPTIONS diff --git a/tui/ansi.py b/tui/ansi.py deleted file mode 100644 index c25ff6c..0000000 --- a/tui/ansi.py +++ /dev/null @@ -1,46 +0,0 @@ -""" ansi.py - ansi ohjauskomentoja. värit jne """ - -class Ansi: - """ Ansi - Luokallinen staattisia metodeja ansi komennoille """ - - BLACK = 0 - RED = 1 - GREEN = 2 - YELLOW = 3 - BLUE = 4 - MAGENTA = 5 - CYAN = 6 - WHITE = 7 - GRAY = 8 - BRIGHT_RED = 9 - BRIGHT_GREEN = 0xA - BRIGHT_YELLOW = 0xB - BRIGHT_BLUE = 0xC - BRIGHT_MAGENTA = 0xD - BRIGHT_CYAN = 0xE - BRIGHT_WHITE = 0xF - - @staticmethod - def color(color): - """ asettaa tekstin värin """ - if color in range(16): - print(end=f"\033[{'1;' if color//8 else ''}3{color%8}m") - - - @staticmethod - def bg(color): - """ asettaa tekstin taustan värin""" - if color in range(8): - print(end=f"\033[4{color}m") - - - @staticmethod - def cup(lines): - """ liikuttaa kursoria ylöspäin""" - print(end=f"\033[{lines}F") - - - @staticmethod - def reset(): - """ resetoi tekstin värin ja muut attribuutit perusarvoille """ - print(end="\033[0m") diff --git a/tui/ansi_draw.py b/tui/ansi_draw.py deleted file mode 100644 index ba71fdb..0000000 --- a/tui/ansi_draw.py +++ /dev/null @@ -1,58 +0,0 @@ -""" tui/ansi_draw.py - perustukset ansi tulostelulle """ -# pylint: disable = multiple-imports -from .ansi import Ansi -from .static import TileTypes - -class AnsiDraw(): - """ AnsiDraw - "piirtelee" näytölle kirjailmilla """ - def __init__(self, height = 9, name = ""): - print(end='\n'*height+name+": Peli alkaa.") - - def __del__(self): - print() - - def __tile(self, tile, hilighted): - """ "piirtää" yhden ruudun """ - for ch, colors in zip(TileTypes[tile].text, TileTypes[tile].colors): - color, bg = colors - Ansi.color(Ansi.BLACK if hilighted else color) - Ansi.bg(Ansi.CYAN if hilighted else bg) - print(end=ch) - Ansi.reset() - - - def matrix(self, matrix, hx, hy): - """ "piirtää" ruudukon """ - Ansi.cup(len(matrix[0])) - # pylint: disable=consider-using-enumerate - for y in range(len(matrix[0])): - for x in range(len(matrix)): - hilight = matrix[x][y] != 9 and x == hx and y == hy - self.__tile(matrix[x][y], hilight) - print() - - - def status_line(self, text): - """ draw_status_line - tulostaa pelitietorivin""" - print(end=text+'\r') - -class SuppressDraw(): - """ SuppressDraw - vain status """ - # pylint: disable = unused-argument - - def matrix(self, matrix, hx, hy): - """ "piirtää" ruudukon """ - - def status_line(self, text): - """ draw_status_line - tulostaa pelitietorivin""" - print(end=text+'\r') - -class NoDraw(): - """ NoDraw - ei mitään """ - # pylint: disable = unused-argument - - def matrix(self, matrix, hx, hy): - """ "piirtää" ruudukon """ - - def status_line(self, text): - """ draw_status_line - tulostaa pelitietorivin""" diff --git a/tui/kbd.py b/tui/kbd.py deleted file mode 100644 index a31e56f..0000000 --- a/tui/kbd.py +++ /dev/null @@ -1,86 +0,0 @@ -""" tui/kbd.py - näppäimistön käsittellijä """ -# pylint: disable = multiple-imports -import termios, fcntl, sys, os, io -from time import sleep -from .static import ActionKeys, Action - -class NoKbd(): - """ NoKbd - näppis-ei-käsittelijä """ - # pylint: disable = unused-argument - def read_action(self): - """ read_action - ilman näppistä -> loppu """ - return Action.QUIT - - def read_matrix_action(self, w, h, x, y): - """ read_matrix_action - ilman näppistä -> loppu """ - return Action.QUIT, 0, 0 - -class Kbd(): - """ Kbd - näppiskäsittelijä """ - def __init__(self): - # Vaatii hieman terminaaliasetusten muokkaamista jotta yksittäiset - # napin painallukset voidaan lukea - # https://stackoverflow.com/questions/983354/how-do-i-wait-for-a-pressed-key - try: - fd = sys.stdin.fileno() - self.oldterm = termios.tcgetattr(fd) - - newattr = termios.tcgetattr(fd) - newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO - termios.tcsetattr(fd, termios.TCSANOW, newattr) - - self.oldflags = fcntl.fcntl(fd, fcntl.F_GETFL) - fcntl.fcntl(fd, fcntl.F_SETFL, self.oldflags | os.O_NONBLOCK) - # Testeissä ei voi mukata termilaalia - except io.UnsupportedOperation: - pass - - def __del__(self): - # palautetaan terminaali takaisin alkupetäiseen uskoon - try: - fd = sys.stdin.fileno() - termios.tcsetattr(fd, termios.TCSAFLUSH, self.oldterm) - fcntl.fcntl(fd, fcntl.F_SETFL, self.oldflags) - # Testeissä ei voi mukata termilaalia - except io.UnsupportedOperation: - pass - - def read_action(self): - """ lukee näppäimistölä käyttäjän toiminnon """ - while True: - # Ehkä riittää jos näppäimiä luetaan 50x sekunnissa - sleep(0.02) - try: - keycode = sys.stdin.read(16) - except KeyboardInterrupt: - return Action.QUIT - if keycode: - for key, action in ActionKeys.items(): - if keycode.startswith(key): - return action - - def read_matrix_action(self, w, h, x, y): - """ read_matrix_action - lukee actionit ja pitää huolen koordinaat""" - action = self.read_action() - match action: - case Action.QUIT | Action.HINT: - return (action, x, y) - case Action.OPEN | Action.FLAG | Action.MINE | Action.SAFE: - return (action, x, y) - case Action.UP: - y = y-1 if y > 0 else 0 - case Action.LEFT: - x = x-1 if x > 0 else 0 - case Action.DOWN: - y = y+1 if y < h-1 else y - case Action.RIGHT: - x = x+1 if x < w-1 else x - case Action.TOP: - y = 0 - case Action.BOTTOM: - y = h-1 - case Action.BEGIN: - x = 0 - case Action.END: - x = w-1 - return (Action.NOOP, x, y) diff --git a/tui/static.py b/tui/static.py deleted file mode 100644 index 60442c0..0000000 --- a/tui/static.py +++ /dev/null @@ -1,76 +0,0 @@ -""" tui/static.py - Staattiset määritykset tui:ssa tarvittaville jutuille. """ -from enum import Enum -from dataclasses import dataclass -from board import Tile - -class Action(Enum): - """ tominnot, joita voidaan saada palautusrvona """ - QUIT = 0 # Pelin lopetus - OPEN = 1 # Ruudun avaaminen - FLAG = 2 # Ruudun liputus - HINT = 3 # Anna vihjeet - AUTO = 4 # Pelaa automaattisesti - LEFT = 5 # Liikkumiset... - RIGHT = 6 - UP = 7 - DOWN = 8 - TOP = 9 - BOTTOM = 10 - BEGIN = 11 - END = 12 - NOOP = 13 # ei mitään - tarvitaan, ettei mätsää ansikoodeja esciin - MINE = 14 # merkkaa pommi - SAFE = 15 # merkkaa turvallinen - -# ActionKeys - Ohjelma vertaa syötteen alkua näihin ja palauttaa ekan -ActionKeys = { - "\033[A": Action.UP, "\033[D": Action.LEFT, - "\033[C": Action.RIGHT, '\033[B': Action.DOWN, "\033[5~": Action.TOP, - "\033[6~": Action.BOTTOM, "\033[7~": Action.BEGIN,"\033[8~": Action.END, - "\033[": Action.NOOP, "\033": Action.QUIT, "t": Action.SAFE, - "w": Action.UP, "a": Action.LEFT, "s": Action.DOWN, - "d": Action.RIGHT, " ": Action.OPEN, "\n": Action.OPEN, - "l": Action.QUIT, "?": Action.HINT, "b": Action.HINT, - "f": Action.FLAG, "q": Action.QUIT, "m": Action.MINE, - "\t": Action.FLAG, "9": Action.MINE, "0": Action.SAFE -} - -KEY_DESCRIPTIONS = """Näppäinasettelu: - - YLÖS, ALAS, VASEN, OIKEA, PGDN, PGUP, HOME, END, w, a, s, d - Kursorin liikuttaminen pelilaudalla - - ENTER, SPACE Avaa laatta - - f, TAB Vaihda laatan merkintää - m, 9 Merkitse miinaksi - t, 0 Merkitse turvalliseksi - - ?, b Vihje tekoälyltä - - l, q, ESC Pelin lopetus -""" - -@dataclass -class TileType: - """ ruututyyppien tallennusmuotojen kuvaus""" - text: str # Teksti - colors: [] # Lista (väri, tausta) pareja tekstin kaunistamiseen - - -TileTypes = { - Tile.BLANK: TileType( "[ ]", [(0x7,0), (0x7,0), (0x7,0)] ), - Tile.ONE: TileType( "[1]", [(0xA,0), (0xA,0), (0xA,0)] ), - Tile.TWO: TileType( "[2]", [(0xB,0), (0xB,0), (0xB,0)] ), - Tile.THREE: TileType( "[3]", [(0xD,0), (0xD,0), (0xD,0)] ), - Tile.FOUR: TileType( "[4]", [(0x9,0), (0x9,0), (0x9,0)] ), - Tile.FIVE: TileType( "[5]", [(0x9,0), (0x9,0), (0x9,0)] ), - Tile.SIX: TileType( "[6]", [(0x9,0), (0x9,0), (0x9,0)] ), - Tile.SEVEN: TileType( "[7]", [(0x9,0), (0x9,0), (0x9,0)] ), - Tile.EIGHT: TileType( "[8]", [(0x9,0), (0x9,0), (0x9,0)] ), - Tile.MINE: TileType( "[@]", [(0xF,1), (0xF,1), (0xF,1)] ), - Tile.FLAG_MINE: TileType( "[×]", [(0x8,7), (0x1,7), (0x8,7)] ), - Tile.FLAG_FREE: TileType( "[•]", [(0x8,7), (0x2,7), (0x8,7)] ), - Tile.UNOPENED: TileType( "[#]", [(0x8,7), (0x8,7), (0x8,7)] ), - Tile.FLAG_UNKNOWN: TileType( "[?]", [(0x8,7), (0x0,7), (0x8,7)] ) -} diff --git a/tui/tui.py b/tui/tui.py deleted file mode 100644 index d7f7fb3..0000000 --- a/tui/tui.py +++ /dev/null @@ -1,109 +0,0 @@ -""" tui/tui.py - runko käyttöliittymälle """ -import time -from .static import Action -from .kbd import Kbd, NoKbd -from .ansi_draw import AnsiDraw, SuppressDraw - - -class Tui(): - """ Tui - Luokka käyttäjän interaktiota varten """ - # pylint: disable = too-many-arguments, too-many-instance-attributes - def __init__(self, - bot = None, - autoplay = False, - interactive = True, - suppress = False, - height = 9, - level_name = "outo lauta", - delay = 0): - - # jos ei ole bottia pitää olla interaktiivinen - if bot is None: - autoplay = False - interactive = True - suppress = False - - # jos ei mitään näytetä ei voi olla interaktiivinen - if suppress: - interactive = False - - # automaattipeli pitää olla päällä jos ei interaktiivinen - if not interactive: - autoplay = True - - if delay and delay not in range(0,500): - delay = 50 - - self.autoplay = autoplay - self.interactive = interactive - self.suppress = suppress - self.height = height - self.level_name = level_name - self.delay = delay - - self.bot = bot(uncertain=not self.interactive) if bot else None - - self.kbd = Kbd() if self.interactive else NoKbd() - - if self.suppress: - self.draw = SuppressDraw() - else: - self.draw = AnsiDraw(height=self.height, name=self.level_name) - - def matrix_selector(self, matrix, x, y): - """ valinta matriisita """ - - # automaattipeli avaa botin vinkit heti - if self.autoplay: - action, x, y = self.bot.hint(matrix, x, y) - if action != Action.NOOP: - if self.delay: - self.draw.matrix(matrix, x, y) - time.sleep(self.delay/100) - return Action.OPEN if action==Action.SAFE else action, x, y - - - # ilman näppiskäsittelijää voidaan lopettaa - if not self.interactive: - return Action.QUIT, 0, 0 - - w, h = len(matrix), len(matrix[0]) - while True: - self.draw.matrix(matrix, x, y) - action, x, y = self.kbd.read_matrix_action(w, h, x, y) - match action: - case Action.QUIT: - return (action, x, y) - case Action.OPEN | Action.FLAG | Action.MINE | Action.SAFE: - if matrix[x][y] >= 10: - return (action, x, y) - case Action.HINT: - if self.bot is not None: - return self.bot.hint(matrix, x, y) - - def game_over(self, matrix, x, y): - """ tehtävät kun kuolee """ - self.draw.matrix(matrix, x, y) - self.draw.status_line( - f"{self.level_name}: " + - ("K " if self.suppress else f"{'Kuolit!':<30}") - ) - self.kbd.read_action() - - def game_win(self, matrix, x, y): - """ tehtävät kun voittaa """ - self.draw.matrix(matrix, x, y) - self.draw.status_line( - f"{self.level_name}: " + - ("V " if self.suppress else f"{'Voitit!':<30}") - ) - self.kbd.read_action() - - def game_end(self, matrix): - """ tehtävät ihan pelin lopuksi """ - if self.interactive: - self.draw.matrix(matrix, -1, -1) - self.draw.status_line( - f"{self.level_name}: " + - f"{'Kiitos!':<30}" - ) |