from textual.reactive import reactive from textual.widget import Widget from textual.app import ComposeResult from datetime import datetime import random from asyncio import sleep from BingoField import BingoField class BingoBoard(Widget): fields = reactive([], recompose = True) def __init__(self) -> None: self.fieldstate = [False for _ in range(25)] super().__init__() self.fields = [ 'Deko aufgehängt', '6 Stunden Schlaf', 'Tschunk getrunken', 'Spaß gehabt', 'Sticker getauscht', 'DECT genutzt', 'Hardware gehackt', 'Kabel vergessen', 'Halle gesucht', '$dinge gelötet', 'Code geschrieben', 'Neue Leute kennengelernt', 'Wasser getrunken', 'Waffel gegessen', 'Corona Test gemacht', '2 Mahlzeiten gegessen', 'Fairydust bewundert', 'Talk angeschaut', 'CCC Merch getragen', 'getrollt', 'In der Lounge getanzt', 'Etwas Neues ausprobiert', 'Maske getragen', 'geduscht', 'Gulasch gegessen' ] self.default_fields = self.fields self.roll_board(int(datetime.now().timestamp())) def roll_board(self, seed): self.seed = seed random.seed(seed) self.fields = random.sample(self.default_fields, len(self.fields)) def watch_fields(self, new_state) -> None: self.fieldstate = [False for _ in range(25)] for idx, field in enumerate(self.query(BingoField)): field.text = new_state[idx] def compose(self) -> ComposeResult: """Create child widgets for the app.""" for _ in range(25): yield BingoField(_, self.fields[_]) async def on_bingo_field_selected(self, message: BingoField.Selected) -> None: self.fieldstate[message.num] = message.selected if self.is_bingo(): self.screen.styles.animate("background", 'red', duration=0.25) await sleep(0.25) self.screen.styles.animate("background", 'orange', duration=0.25) await sleep(0.25) self.screen.styles.animate("background", 'yellow', duration=0.25) await sleep(0.25) self.screen.styles.animate("background", 'green', duration=0.25) await sleep(0.25) self.screen.styles.animate("background", 'lightblue', duration=0.25) await sleep(0.25) self.screen.styles.animate("background", 'blue', duration=0.25) await sleep(0.25) self.screen.styles.animate("background", 'purple', duration=0.25) await sleep(0.25) self.screen.styles.animate("background", '#1c1c1c', duration=0.25) def is_bingo(self): array = [ self.fieldstate[i:i+5] for i in range(0, len(self.fieldstate), 5)] # check rows bingo = any( [ all(row) for row in array ] ) # check cols bingo = bingo or any([ all(self.fieldstate[num::5]) for num in range(5)]) # check bottom left to upper right bingo = bingo or all([ self.fieldstate[4], self.fieldstate[8], self.fieldstate[12], self.fieldstate[16], self.fieldstate[20] ]) # check top left to bottom right bingo = bingo or all([ self.fieldstate[0], self.fieldstate[6], self.fieldstate[12], self.fieldstate[18], self.fieldstate[24] ]) return bingo