brute-force

This commit is contained in:
Alfred Baumann
2026-06-08 11:41:48 +02:00
parent 7b7df0f7a8
commit 6de80582d9
3 changed files with 47 additions and 10 deletions

View File

@@ -1,8 +1,10 @@
import os import os
from time import sleep
from typing import override from typing import override
import pygame import pygame
from src.algorithms.bruteforce import BruteForceSolver
from src.net import NetGame from src.net import NetGame
# pyright: reportUnusedCallResult=false, reportAny=false # pyright: reportUnusedCallResult=false, reportAny=false
@@ -59,7 +61,9 @@ class PieceSprite(pygame.sprite.Sprite):
class NetGUI: class NetGUI:
game: NetGame game: NetGame
window: pygame.Surface window: pygame.Surface
pieceSprites: pygame.sprite.Group[PieceSprite] # pyright: ignore[reportInvalidTypeArguments] pieceSprites: pygame.sprite.Group[
PieceSprite # pyright: ignore[reportInvalidTypeArguments]
]
def __init__(self, width: int, height: int): def __init__(self, width: int, height: int):
self.game = NetGame(width, height) self.game = NetGame(width, height)
@@ -74,7 +78,7 @@ class NetGUI:
self.pieceSprites.add(PieceSprite(x, y)) self.pieceSprites.add(PieceSprite(x, y))
def run_game(self): def run_game(self):
while True: while not self.game.solved():
events = pygame.event.get() events = pygame.event.get()
for event in events: for event in events:
@@ -82,20 +86,20 @@ class NetGUI:
raise SystemExit raise SystemExit
elif event.type == LEFT_TURN: elif event.type == LEFT_TURN:
self.game.turn_ccw(event.x, event.y) self.game.turn_ccw(event.x, event.y)
if self.game.solved():
raise SystemExit # TODO: Richtiger Spiel schluss, nicht einfach schliessen
elif event.type == RIGHT_TURN: elif event.type == RIGHT_TURN:
self.game.turn_cw(event.x, event.y) self.game.turn_cw(event.x, event.y)
if self.game.solved():
raise SystemExit
elif event.type == LOCK: elif event.type == LOCK:
self.game.lock(event.x, event.y) self.game.lock(event.x, event.y)
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_b:
BruteForceSolver(self.game).solve()
self.pieceSprites.update(self.game, events) self.pieceSprites.update(self.game, events)
for sprite in self.pieceSprites: for sprite in self.pieceSprites:
self.window.blit(sprite.image, sprite.rect) self.window.blit(sprite.image, sprite.rect)
pygame.display.flip() pygame.display.flip()
sleep(2)
NetGUI(13, 13).run_game() NetGUI(5, 5).run_game()

View File

@@ -0,0 +1,28 @@
from itertools import chain, pairwise
from src.net import NetGame
from src.netTypes import Direction
class BruteForceSolver:
game: NetGame
def __init__(self, game: NetGame) -> None:
self.game = game
for x in range(game.height):
for y in range(game.width):
self.game.set_direction(x, y, Direction.UP)
def solve(self) -> None:
attempts = 0
while not self.game.solved():
attempts += 1
print(f"{attempts}/{4 ** (self.game.width * self.game.height)}")
self.game.turn_cw(0, 0)
for prev, curr in pairwise(
chain(
*self.game.get_field()
) # 2d-liste zu 1d machen, damit man einfacher über alle zellen iterieren kann
):
if prev.direction == Direction.UP:
curr.turn_cw()

View File

@@ -7,8 +7,6 @@ from random import choice
from src.interface import parse_description from src.interface import parse_description
from src.netTypes import Piece, Direction, Coordinate from src.netTypes import Piece, Direction, Coordinate
DEMO_FIELD = parse_description("5x5:c7634887c213e5b8db3e69282")
class Grid: class Grid:
pieces: list[list[Piece]] pieces: list[list[Piece]]
@@ -70,9 +68,13 @@ class Grid:
class NetGame: class NetGame:
_grid: Grid _grid: Grid
width: int
height: int
def __init__(self, width: int, height: int) -> None: def __init__(self, width: int, height: int) -> None:
self._grid = Grid(width, height) self._grid = Grid(width, height)
self.width = width
self.height = height
def get_field(self) -> list[list[Piece]]: def get_field(self) -> list[list[Piece]]:
return self._grid.pieces return self._grid.pieces
@@ -85,9 +87,12 @@ class NetGame:
def turn_ccw(self, x: int, y: int) -> None: def turn_ccw(self, x: int, y: int) -> None:
self._grid.pieces[x][y].turn_ccw() self._grid.pieces[x][y].turn_ccw()
def lock(self, x: int, y: int) -> None: def lock(self, x: int, y: int) -> None:
self._grid.pieces[x][y].locked = not self._grid.pieces[x][y].locked self._grid.pieces[x][y].locked = not self._grid.pieces[x][y].locked
def set_direction(self, x: int, y: int, dir: Direction) -> None:
self._grid.pieces[x][y].direction = dir
def solved(self): def solved(self):
return self._grid.solved() return self._grid.solved()