Grossteil vom GUI vom Minesweeper porten, muss noch fertiggestellt werden
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
.envrc
|
.envrc
|
||||||
.direnv
|
.direnv
|
||||||
|
__pycache__/
|
||||||
|
|||||||
BIN
assets/1.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
assets/1on.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
assets/2.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
assets/2on.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
assets/3.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
assets/3on.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
assets/4.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
assets/4on.bmp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
89
src/GUI.py
Normal file
@@ -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()
|
||||||
18
src/net.py
@@ -15,10 +15,10 @@ class PieceType(IntEnum):
|
|||||||
|
|
||||||
|
|
||||||
class Direction(IntEnum):
|
class Direction(IntEnum):
|
||||||
UP = auto()
|
UP = 0
|
||||||
LEFT = auto()
|
|
||||||
DOWN = auto()
|
|
||||||
RIGHT = auto()
|
RIGHT = auto()
|
||||||
|
DOWN = auto()
|
||||||
|
LEFT = auto()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_offset(dx: int, dy: int) -> Direction:
|
def from_offset(dx: int, dy: int) -> Direction:
|
||||||
@@ -139,10 +139,12 @@ class Grid:
|
|||||||
dx = x - nx
|
dx = x - nx
|
||||||
dy = y - ny
|
dy = y - ny
|
||||||
if (
|
if (
|
||||||
Direction.from_offset(-dx, -dy)
|
Direction.from_offset(dx, dy)
|
||||||
in self.pieces[x + dx][y + dy].connected_directions()
|
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:
|
for nx, ny in connectedNeighbors:
|
||||||
if connected[nx][ny]:
|
if connected[nx][ny]:
|
||||||
@@ -172,7 +174,3 @@ class NetGame:
|
|||||||
|
|
||||||
def solved(self):
|
def solved(self):
|
||||||
return self._grid.solved()
|
return self._grid.solved()
|
||||||
|
|
||||||
|
|
||||||
g = NetGame(5, 5)
|
|
||||||
print(g.solved())
|
|
||||||
|
|||||||