From d21764188d4869fe5f37690468ff32ae913a49ae Mon Sep 17 00:00:00 2001 From: CheesePlated <93665570+CheesePlated@users.noreply.github.com> Date: Thu, 14 May 2026 20:31:22 +0200 Subject: [PATCH] Grossteil vom GUI vom Minesweeper porten, muss noch fertiggestellt werden --- .gitignore | 1 + assets/1.bmp | Bin 0 -> 3274 bytes assets/1on.bmp | Bin 0 -> 3274 bytes assets/2.bmp | Bin 0 -> 3274 bytes assets/2on.bmp | Bin 0 -> 3274 bytes assets/3.bmp | Bin 0 -> 3274 bytes assets/3on.bmp | Bin 0 -> 3274 bytes assets/4.bmp | Bin 0 -> 3274 bytes assets/4on.bmp | Bin 0 -> 3274 bytes src/GUI.py | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ src/net.py | 18 +++++----- 11 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 assets/1.bmp create mode 100644 assets/1on.bmp create mode 100644 assets/2.bmp create mode 100644 assets/2on.bmp create mode 100644 assets/3.bmp create mode 100644 assets/3on.bmp create mode 100644 assets/4.bmp create mode 100644 assets/4on.bmp create mode 100644 src/GUI.py diff --git a/.gitignore b/.gitignore index 772944e..3967aa5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .envrc .direnv +__pycache__/ diff --git a/assets/1.bmp b/assets/1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bcc8e4e3b9eda49257dd2911f27b6c90dea73ea5 GIT binary patch literal 3274 zcmZ?rJ;lQS23kl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6{~raTAut*OqaiRF0%U~% vs0ba!LpKaajdb+5CRIPF>PPJ(HN^0%9}Q3Z;X|tIXn2wuV))e$weSQ088vI^ literal 0 HcmV?d00001 diff --git a/assets/1on.bmp b/assets/1on.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c37660890edbe452a6148a76159114efb84b0f30 GIT binary patch literal 3274 zcmZ?rJ;lQS23kl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6{~raTAut*OqaiRF0%U~% zs0gJe{{J6TWDj3VPFTXigFL;YMLWn2Wcx_dO}gq)`$!Knd^$$M6JO|%E;kyUq=y+k I9YZZV0o@P}Q~&?~ literal 0 HcmV?d00001 diff --git a/assets/2.bmp b/assets/2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..040e15147edbc4d1854c4d46c1b877eadb1f647d GIT binary patch literal 3274 zcmZ?rJ;lQS23kl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6|0fZEv>;;=wUewI*)B4i zJ8Bkl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6|0fYZw1BjMTtc#T5^V$8 z0=8q+K9U0thlbJc#1SxL3Xg^-nE{7G+h};=2pBSjN5hlMfWx6}G(2$x44J~C;Ynt| T;m|f3o;U)AOySY+#2;_~W+-a- literal 0 HcmV?d00001 diff --git a/assets/3.bmp b/assets/3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d1687ffdad8df4e4808e23fbcdcf8709d376f96a GIT binary patch literal 3274 zcmZ?rJ;lQS23kl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6{~raTAut*OqaiRF0(1!h zP?1XsCe@LY*hNnDFw*QJH9kmHj~L*qGsC}e{7=HDm;fX(dNR=H8Pf|k+zj{i; F698E>`&j@0 literal 0 HcmV?d00001 diff --git a/assets/3on.bmp b/assets/3on.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8c351d077dd903579f52786b0aca79617d6008a2 GIT binary patch literal 3274 zcmZ?rJ;lQS23kl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6{~raTAut*OqaiRF0(1!h zP?1XsCe@LUA|6!ClZ#2SaUks@CtOMM9WWHZRVE}XA#74jAWi+KeWZmKA=RVdNhpL! QlOGLF(!z_7>Y)~%0BHzn_y7O^ literal 0 HcmV?d00001 diff --git a/assets/4.bmp b/assets/4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3a057e5e68c70a7965265a5333efbd062b3f11e6 GIT binary patch literal 3274 zcmZ?rJ;lQS23kl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6{~raTAut3(0F-no!K8W_ zWLF0RH(8jRY&L2i?yw#WPt4RinqEfJ3udaoEi#&3sGnXyVM;E>9aE&qpxaNHZqikc O+DCer;nOkH!V>^BPIb-z literal 0 HcmV?d00001 diff --git a/assets/4on.bmp b/assets/4on.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2399ff70bd032004d0b4ae9dbdcc0c03aa195990 GIT binary patch literal 3274 zcmZ?rJ;lQS23kl0Lm-tK`@XD1^*csAPB_&@8lj-+<)k+M&J%P zQMuOFjK;>s!f9z~YCz03bLLD=TdwQO8ZrGwFx?=U1(^e6{~raTAut3(0F-no!K8W_ zl2t(2g>+0#HXF4McQ}uRCuZs$O)sPA1v6FP78y-1)K4#c3HN^0%A8O$V0NzKVu>b%7 literal 0 HcmV?d00001 diff --git a/src/GUI.py b/src/GUI.py new file mode 100644 index 0000000..87fbf92 --- /dev/null +++ b/src/GUI.py @@ -0,0 +1,89 @@ +import os +from typing import override +import pygame +from src.net import NetGame + +# pyright: reportUnusedCallResult=false, reportAny=false + +LEFT_TURN = pygame.USEREVENT + 1 +RIGHT_TURN = pygame.USEREVENT + 2 + + +class PieceSprite(pygame.sprite.Sprite): + image: pygame.Surface + rect: pygame.Rect + x: int + y: int + + def __init__(self, x: int, y: int) -> None: + super().__init__() + self.image = pygame.Surface((28, 28)) + self.rect = self.image.get_rect() + self.rect.x = 30 * x + 1 + self.rect.y = 30 * y + 1 + self.x = x + self.y = y + + @override + def update(self, game: NetGame, events: list[pygame.event.Event]): + piece = game.get_piece(self.x, self.y) + image = pygame.image.load(os.path.join("assets", f"{piece.type}.bmp")).convert() + image = pygame.transform.rotate(image, -90 * piece.direction) + self.image.blit(image, (0, 0)) + for event in events: + if event.type == pygame.MOUSEBUTTONUP: + if not self.rect.collidepoint(*event.pos): + continue + if event.button == 1: + pygame.event.post( + pygame.event.Event(LEFT_TURN, {"x": self.x, "y": self.y}) + ) + elif event.button == 3: + pygame.event.post( + pygame.event.Event(RIGHT_TURN, {"x": self.x, "y": self.y}) + ) + + +class NetGUI: + game: NetGame + window: pygame.Surface + pieceSprites: pygame.sprite.Group[PieceSprite] + + def __init__(self): + self.game = NetGame(5, 5) + pygame.init() + self.window = pygame.display.set_mode((5 * 60, 5 * 60)) + pygame.display.update + assert pygame.display.get_window_size() == self.window.get_size() + self.window.fill("#ffffff") + pygame.display.set_caption("Net") + + self.pieceSprites = pygame.sprite.Group() + for x in range(5): + for y in range(5): + self.pieceSprites.add(PieceSprite(x, y)) + + def run_game(self): + while True: + events = pygame.event.get() + + for event in events: + if event.type == pygame.QUIT: + raise SystemExit + elif event.type == LEFT_TURN: + self.game.turn_ccw(event.x, event.y) + if self.game.solved(): + raise SystemExit + elif event.type == RIGHT_TURN: + self.game.turn_cw(event.x, event.y) + if self.game.solved(): + raise SystemExit + + self.pieceSprites.update(self.game, events) + for sprite in self.pieceSprites: + self.window.blit(sprite.image, sprite.rect) + + pygame.display.flip() + + +NetGUI().run_game() diff --git a/src/net.py b/src/net.py index 9ddb893..861f4ff 100644 --- a/src/net.py +++ b/src/net.py @@ -15,10 +15,10 @@ class PieceType(IntEnum): class Direction(IntEnum): - UP = auto() - LEFT = auto() - DOWN = auto() + UP = 0 RIGHT = auto() + DOWN = auto() + LEFT = auto() @staticmethod def from_offset(dx: int, dy: int) -> Direction: @@ -139,10 +139,12 @@ class Grid: dx = x - nx dy = y - ny if ( - Direction.from_offset(-dx, -dy) - in self.pieces[x + dx][y + dy].connected_directions() + Direction.from_offset(dx, dy) + in self.pieces[nx][ny].connected_directions() + and Direction.from_offset(-dx, -dy) + in self.pieces[x][y].connected_directions() ): - connectedNeighbors.append((x + dx, y + dy)) + connectedNeighbors.append((nx, ny)) for nx, ny in connectedNeighbors: if connected[nx][ny]: @@ -172,7 +174,3 @@ class NetGame: def solved(self): return self._grid.solved() - - -g = NetGame(5, 5) -print(g.solved())