L3-Bataille-Navale/source/gui/scene/HistoryGame.py

96 lines
2.8 KiB
Python

import json
from pathlib import Path
from typing import TYPE_CHECKING
from source.gui import widget, texture
from source.gui.position import vw, vh, vw_center
from source.gui.scene.abc import BaseGame
if TYPE_CHECKING:
from source.gui.window import Window
class HistoryGame(BaseGame):
def __init__(self, window: "Window", history_path: Path, **kwargs):
with open(history_path, "r", encoding="utf8") as file:
history_data = json.load(file)
super().__init__(
window,
boats_length=[],
name_ally=history_data["name_ally"],
name_enemy=history_data["name_enemy"],
board_ally_data=history_data["grid_ally"],
board_enemy_data=history_data["grid_enemy"],
history=history_data["history"],
**kwargs
)
self.history_path = history_path
from source.gui.scene import MainMenu
self.button_quit.add_listener("on_click_release", lambda *_: window.set_scene(MainMenu))
self.move_number: int = 0 # numéro du mouvement en cours
self.grid_ally.board.clear_bombs()
self.grid_ally.refresh_board()
self.grid_enemy.board.clear_bombs()
self.grid_enemy.refresh_board()
self.previous = self.add_widget(
widget.Button,
x=20*vw, y=10*vh, width=20*vw, height=10*vh,
label_text="Précédent",
style=texture.Button.Style1
)
self.previous.add_listener("on_click_release", lambda *_: self.previous_move())
self.next = self.add_widget(
widget.Button,
x=60*vw, y=10*vh, width=20*vw, height=10*vh,
label_text="Suivant",
style=texture.Button.Style1
)
self.next.add_listener("on_click_release", lambda *_: self.next_move())
self.text_move = self.add_widget(
widget.Text,
x=vw_center, y=12*vh,
anchor_x="center",
font_size=28,
)
self._refresh_move_text()
def _refresh_move_text(self):
self.text_move.text = f"{self.move_number} / {len(self.history)}"
self._refresh_score_text()
def previous_move(self):
# si le mouvement est au minimum, ignore
if self.move_number <= 0: return
self.move_number -= 1
turn, cell = self.history[self.move_number]
(self.grid_enemy if turn else self.grid_ally).remove_bomb(cell)
self._refresh_move_text()
def next_move(self):
# si le mouvement est au maximum, ignore
if self.move_number >= len(self.history): return
self.move_number += 1
turn, cell = self.history[self.move_number-1]
(self.grid_enemy if turn else self.grid_ally).place_bomb(cell)
self._refresh_move_text()