summaryrefslogtreecommitdiff
path: root/tui/tui.py
blob: f91db05e8a1cf95b88e1bcd971fc8627597a5eaf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
""" tui/tui.py - runko käyttöliittymälle """
# pylint: disable = multiple-imports
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
    def __init__(self,
                bot = None,
                autoplay = False,
                interactive = True,
                suppress = False,
                height = 9):

        self.autoplay = autoplay
        self.interactive = interactive
        self.suppress = suppress
        self.height = height

        # jos ei oo bottia pitää olla interaktiivinen
        if bot is None:
            self.autoplay = False
            self.interactive = True
            self.suppress = False

        # jos ei mitään näytetä ei voi olla interaktiivinen
        self.interactive = False if self.suppress else self.interactive

        # automaattipeli pitää olla päällä jos ei interaktiivinen
        self.autoplay = self.autoplay if self.interactive else True

        self.bot = bot(uncertain=not self.interactive) if bot else None

        if self.interactive:
            self.kbd = Kbd()
        else:
            self.kbd = NoKbd()

        if self.suppress:
            self.draw = SuppressDraw()
        else:
            self.draw = AnsiDraw(height=self.height)

    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:
                self.draw.matrix(matrix, -1, -1)
                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.BOMB | 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(
            "K  " if self.suppress else "Peli ohitse! Kuolit!"
        )
        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(
            "V  " if self.suppress else "Peli ohitse! Voitit!"
        )
        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("Kiitos!             ")