diff --git a/main.pyw b/main.pyw index e9db8a2..0adb62a 100644 --- a/main.pyw +++ b/main.pyw @@ -11,9 +11,10 @@ window = Window(resizable=True, visible=False) button_normal_image = pyglet.image.load("./assets/test_button_normal.png") button_hover_image = pyglet.image.load("./assets/test_button_hover.png") +# performance and button test + hello_world_scene = HelloWorldScene() -# performance and button test for x in range(10): for y in range(10): button = Button( @@ -22,7 +23,7 @@ for x in range(10): font_size=10, on_release=lambda self, *a, **b: setattr(self, "width", self.width + 10), normal_image=button_normal_image, - hover_image=button_hover_image, + hover_image=button_hover_image ) hello_world_scene.add_widget(button) diff --git a/source/core/Board.py b/source/core/Board.py index 3663822..f59b4c9 100644 --- a/source/core/Board.py +++ b/source/core/Board.py @@ -1,6 +1,6 @@ import numpy as np -from source.core import Boat +from source.core.Boat import Boat from source.core.enums import Orientation, BombState from source.core.error import InvalidBoatPosition, PositionAlreadyShot from source.utils import copy_array_offset @@ -9,11 +9,22 @@ from source.utils import copy_array_offset class Board: __slots__ = ("_width", "_height", "_boats", "_bombs") - def __init__(self, width: int, height: int = None) -> None: + def __init__( + self, + width: int, + height: int = None, + boats: dict[Boat, tuple[int, int]] = None, + bombs: np.array = None + ) -> None: + self._width: int = width self._height: int = width if height is None else height - self._boats: dict[Boat, tuple[int, int]] = {} # associate the boats to their position - self._bombs: np.array = np.ones((self._width, self._height), dtype=np.bool_) + + # associate the boats to their position + self._boats: dict[Boat, tuple[int, int]] = {} if boats is None else boats + + # position that have been shot by a bomb + self._bombs: np.array = np.ones((self._width, self._height), dtype=np.bool_) if bombs is None else bombs def __repr__(self) -> str: return f"<{self.__class__.__name__} width={self._width}, height={self._height}>" @@ -106,6 +117,23 @@ class Board: return board + def to_json(self) -> dict: + return { + "width": self._width, + "height": self._height, + "boats": [[boat.to_json(), position] for boat, position in self._boats.items()], + "bombs": self._bombs.tolist() + } + + @classmethod + def from_json(cls, json_: dict) -> "Board": + return Board( + width=json_["width"], + height=json_["height"], + boats={Boat.from_json(boat_json): tuple(position) for boat_json, position in json_["boats"]}, + bombs=np.array(json_["bombs"], dtype=np.bool_) + ) + if __name__ == "__main__": board = Board(5) diff --git a/source/core/Boat.py b/source/core/Boat.py index 6c815f9..d576d90 100644 --- a/source/core/Boat.py +++ b/source/core/Boat.py @@ -10,6 +10,9 @@ class Boat: self.orientation = orientation self.length = length + def __repr__(self): + return f"<{self.__class__.__name__} orientation={self.orientation}, length={self.length}>" + def get_matrice(self, value: int = 1) -> np.array: """ :return: the boat represented as a matrice @@ -21,8 +24,18 @@ class Boat: dtype=np.ushort ) - def __repr__(self): - return f"<{self.__class__.__name__} orientation={self.orientation}, length={self.length}>" + def to_json(self) -> dict: + return { + "length": self.length, + "orientation": self.orientation.to_json(), + } + + @classmethod + def from_json(cls, json_: dict) -> "Boat": + return Boat( + length=json_["length"], + orientation=Orientation.from_json(json_["orientation"]), + ) if __name__ == "__main__": diff --git a/source/core/enums/orientation.py b/source/core/enums/orientation.py index d5a9fb1..46ca347 100644 --- a/source/core/enums/orientation.py +++ b/source/core/enums/orientation.py @@ -4,3 +4,10 @@ from enum import Enum class Orientation(Enum): HORIZONTAL = "H" VERTICAL = "V" + + def to_json(self) -> str: + return str(self.value) + + @classmethod + def from_json(cls, json_: str) -> "Orientation": + return cls(json_) diff --git a/source/core/error/InvalidBoatPosition.py b/source/core/error/InvalidBoatPosition.py index 8e31422..c93772a 100644 --- a/source/core/error/InvalidBoatPosition.py +++ b/source/core/error/InvalidBoatPosition.py @@ -1,4 +1,4 @@ -from source import Boat +from source.core.Boat import Boat class InvalidBoatPosition(Exception): diff --git a/source/gui/widget/Button.py b/source/gui/widget/Button.py index 57f3c25..bf440bf 100644 --- a/source/gui/widget/Button.py +++ b/source/gui/widget/Button.py @@ -27,8 +27,9 @@ class Button(Widget): normal_image: pyglet.image.AbstractImage = None, hover_image: pyglet.image.AbstractImage = None, - batch: pyglet.graphics.Batch = None, - group: pyglet.graphics.Group = None, + text_batch: pyglet.graphics.Batch = None, + normal_batch: pyglet.graphics.Batch = None, + hover_batch: pyglet.graphics.Batch = None, *args, **kwargs ): @@ -38,21 +39,21 @@ class Button(Widget): # TODO: add an image when the mouse click ? # TODO: make x, y, width, height, font_size optionally function to allow dynamic sizing - # initialise the default value for the property + # initialise the value for the property self._x, self._y, self._width, self._height = x, y, width, height # the label used for the text self._label = pyglet.text.Label( - anchor_x="center", - anchor_y="center", + anchor_x="center", anchor_y="center", + batch=text_batch, *args, **kwargs ) # hovering and background self._hovering = False - self._normal_sprite = Sprite(normal_image) - self._hover_sprite = Sprite(hover_image) + self._normal_sprite = Sprite(normal_image, batch=normal_batch) + self._hover_sprite = Sprite(hover_image, batch=hover_batch) # the event when the button is clicked self.on_press: Optional[Callable[["Self", "Window", "Scene", int, int, int, int], None]] = on_press diff --git a/source/reseau_test/client.py b/source/reseau_test/client.py new file mode 100644 index 0000000..bfe6ee4 --- /dev/null +++ b/source/reseau_test/client.py @@ -0,0 +1,24 @@ +import json +import socket + +from source.core.Board import Board +from source.core.Boat import Boat +from source.core.enums import Orientation + + +board = Board(5) +board.add_boat(Boat(3, Orientation.VERTICAL), (0, 4)) +board.add_boat(Boat(4, Orientation.HORIZONTAL), (4, 1)) +board.bomb((2, 2)) + +board_json = json.dumps(board.to_json()) + + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect(("127.0.0.1", 7878)) + + s.send(board_json.encode()) + + data = s.recv(1024) + + print(data) diff --git a/source/reseau_test/server.py b/source/reseau_test/server.py new file mode 100644 index 0000000..138747c --- /dev/null +++ b/source/reseau_test/server.py @@ -0,0 +1,18 @@ +import json +import socket + +from source.core.Board import Board + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("127.0.0.1", 7878)) + s.listen() + conn, addr = s.accept() + + message = conn.recv(1024) + conn.send(b"SALUT") + + print(conn, addr, message) + + board_json = json.loads(message) + print(Board.from_json(board_json)) +