game finished, removed folderAddition as it is unfinished.

This commit is contained in:
serialexperiments0815 2025-12-06 15:47:33 +01:00
parent b6a7c7aed1
commit b7aba483f7
4 changed files with 98 additions and 46 deletions

View file

@ -5,53 +5,109 @@ from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PIL import Image from PIL import Image
import random import random
from data.settingswindow import SettingsWindow
class JigsawPiece(QGraphicsPixmapItem): class JigsawPiece(QGraphicsPixmapItem):
number = 0 number = 0
allPieces = []
def __init__(self, pixmap, correctPos): def __init__(self, pixmap, startPos, resultRow, resultCol):
super().__init__() super().__init__()
self.setPixmap(pixmap) self.setPixmap(pixmap)
self.correctPos = correctPos
if(startPos != (0,0)):
self.startPos = startPos
else:
self.startPos = (1,1)
self.setFlags( self.setFlags(
QGraphicsPixmapItem.ItemIsMovable | QGraphicsPixmapItem.ItemIsMovable |
QGraphicsPixmapItem.ItemIsSelectable QGraphicsPixmapItem.ItemIsSelectable
) )
self.setPos(0, 0)
JigsawPiece.number += 1 JigsawPiece.number += 1
self.number = JigsawPiece.number self.number = JigsawPiece.number
self.row = resultRow
self.col = resultCol
self.cluster = {self} self.cluster = {self}
JigsawPiece.allPieces.append(self)
def mousePressEvent(self, event): def mousePressEvent(self, event):
if event.button() == Qt.LeftButton: if event.button() == Qt.LeftButton:
self.dragPosition = event.pos()
print(event.pos(), self.correctPos, " ", self.number) print("Momentane Position: {", self.getPositionX() , " - ", self.getPositionY(), "} Piece number: ", self.number, " Row: ", self.row, " Col: ", self.col, " Starting pos:", self.startPos)
def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton and self.dragPosition: if event.buttons() == Qt.LeftButton and self.pos():
delta = self.mapToParent(event.pos()) - self.dragPosition - self.pos() delta = self.mapToParent(event.pos()) - self.pos()
for piece in self.cluster: for self in self.cluster:
piece.setPos(piece.pos() + delta) self.setPos(self.pos() + delta)
def mouseReleaseEvent(self, event): def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton: if event.button() == Qt.LeftButton:
firstRow = 0 neighbors = self.getDistanceToNeighborPieces()
lastRow = (PuzzleWindow.getRows) print(len(JigsawPiece.allPieces))
print(firstRow, lastRow) for item in neighbors:
if (self.number): print(f"Neighbor {item[0]} {item[3]}: distance x{item[1]}. y{item[2]}")
None self.checkPieceCluster()
def getPositionX(self):
return self.pos().x()
def getPositionY(self):
return self.pos().y()
def getNeighbors(self):
neighbors = []
for piece in JigsawPiece.allPieces:
if piece == self:
continue
if((piece.row - self.row) == 0 and (piece.col - self.col) == 1):
neighbors.append((piece, "right"))
if((piece.row - self.row) == 1 and (piece.col - self.col) == 0):
neighbors.append((piece, "down"))
if((piece.row - self.row) == 0 and (piece.col - self.col) == -1):
neighbors.append((piece, "left"))
if((piece.row - self.row) == -1 and (piece.col - self.col) == 0):
neighbors.append((piece, "up"))
return neighbors
def getDistanceToNeighborPieces(self):
neighbors = self.getNeighbors()
neighborDistances = [[neighbor, neighbor.getPositionX() - self.getPositionX(), neighbor.getPositionY() - self.getPositionY(), direction] for neighbor, direction in neighbors]
return neighborDistances
def checkPieceCluster(self):
distanceCheck = self.getDistanceToNeighborPieces()
for neighbor, dx, dy, direction in distanceCheck:
if direction == "right" and dx <= 150 and dx >= 110 and dy >= -5 and dy <= 5:
self.setPieceCluster(neighbor)
if(direction == "down" and dy <= 165 and dy >= 150 and dx >= -5 and dx <= 5):
self.setPieceCluster(neighbor)
if(direction == "left" and dx >= -125 and dx <= -100 and dy >= -5 and dy <= 5):
self.setPieceCluster(neighbor)
if(direction == "up" and dy <= -150 and dy >= -160 and dx >= -5 and dx <= 5):
self.setPieceCluster(neighbor)
def setPieceCluster(self, neighbor):
newCluster = self.cluster | neighbor.cluster
for cluster in newCluster:
cluster.cluster = newCluster
class PuzzleWindow(QGraphicsScene): class PuzzleWindow(QGraphicsScene):
def __init__(self, filePath, rows, cols): def __init__(self, filePath, rows, cols):
super().__init__() super().__init__()
self.filePath = filePath self.filePath = filePath
self.rows = rows self.rows = rows
print(self.rows-1) print("ROWS: ", self.rows-1)
self.cols = cols self.cols = cols
print(self.cols-1) print("COLS: ", self.cols-1)
if (filePath != None): if (filePath != None):
self.createPuzzle(rows, cols) self.createPuzzle(rows, cols)
@ -74,7 +130,7 @@ class PuzzleWindow(QGraphicsScene):
else: else:
for i in range(rows): for i in range(self.rows):
for j in range(cols): for j in range(cols):
box = (j*pieceW, i*pieceH, (j+1)*pieceW, (i+1)*pieceH) box = (j*pieceW, i*pieceH, (j+1)*pieceW, (i+1)*pieceH)
@ -83,17 +139,10 @@ class PuzzleWindow(QGraphicsScene):
data = pieceImg.tobytes("raw", "RGB") data = pieceImg.tobytes("raw", "RGB")
qimage = QImage(data, width, height, 3 * width, QImage.Format_RGB888) qimage = QImage(data, width, height, 3 * width, QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qimage) pixmap = QPixmap.fromImage(qimage)
piece = JigsawPiece(pixmap, (j*pieceW, i*pieceH)) piece = JigsawPiece(pixmap, (j*pieceW, i*pieceH), i, j)
print(f"Piecenumber: {piece.number} | Row: {i} Col: {j} | H: {pieceImg.height} W: {pieceImg.width}") print(f"Piecenumber: {piece.number} | Row: {i} Col: {j} | H: {pieceImg.height} W: {pieceImg.width}")
piece.setPos(random.randint(0, w-pieceW), random.randint(0, h-pieceH)) piece.setPos(random.randint(0, w-pieceW), random.randint(0, h-pieceH))
self.addItem(piece) self.addItem(piece)
piece.setPos(random.randint(0, int(self.width()-pieceW)), random.randint(0, int(self.height()-pieceH))) piece.setPos(random.randint(1, int(self.width()-pieceW)), random.randint(1, int(self.height()-pieceH)))
print("1111")
def getRows(self):
return self.rows
def getCols(self):
return self.cols

View file

@ -2,9 +2,9 @@ import os, json
class JSONHandling: class JSONHandling:
def __init__(self): def __init__(self):
if os.path.exists("settings.json"): self.settingsFile = "settings.json"
self.settingsFile = "settings.json"
else: if not os.path.exists(self.settingsFile):
data = {"color": "Blue", "puzzlePieces": 50} data = {"color": "Blue", "puzzlePieces": 50}
with open("settings.json", "w") as f: with open("settings.json", "w") as f:
json.dump(data, f) json.dump(data, f)
@ -13,13 +13,11 @@ class JSONHandling:
return self.settingsFile return self.settingsFile
def getDataFull(self): def getDataFull(self):
if os.path.exists("settings.json"):
try: try:
with open(self.settingsFile) as f: with open(self.settingsFile, "r") as f:
rValue = json.load(f) return json.load(f)
return rValue
except Exception: except Exception:
pass return {}
def setData(self, attribute, parameter): def setData(self, attribute, parameter):
data = self.getDataFull() data = self.getDataFull()
@ -29,4 +27,4 @@ class JSONHandling:
def getData(self, attribute): def getData(self, attribute):
data = self.getDataFull() data = self.getDataFull()
return data[attribute] return data.get(attribute)

View file

@ -25,7 +25,7 @@ class MainWindow(QMainWindow):
leftLayout.setContentsMargins(0, 0, 0, 0) leftLayout.setContentsMargins(0, 0, 0, 0)
leftLayout.setSpacing(5) leftLayout.setSpacing(5)
self.scene = PuzzleWindow(None, self.settingsWindow.piecesToGrid(self.settings.getData("puzzlePieces"))[0], self.settingsWindow.piecesToGrid(self.settings.getData("puzzlePieces"))[1]) self.scene = PuzzleWindow(None, self.settingsWindow.getGridRows(), self.settingsWindow.getGridCols())
self.view = QGraphicsView(self.scene) self.view = QGraphicsView(self.scene)
self.view.setStyleSheet(f"background-color: {self.settings.getData("color")}; border: 1px solid black;") self.view.setStyleSheet(f"background-color: {self.settings.getData("color")}; border: 1px solid black;")
leftLayout.addWidget(self.view) leftLayout.addWidget(self.view)
@ -51,8 +51,8 @@ class MainWindow(QMainWindow):
addImageAction = puzzleMenu.addAction("Add Image") addImageAction = puzzleMenu.addAction("Add Image")
selectedImage = addImageAction.triggered.connect(lambda: self.handlerInput("image")) selectedImage = addImageAction.triggered.connect(lambda: self.handlerInput("image"))
addFolderAction = puzzleMenu.addAction("Add Folder") #addFolderAction = puzzleMenu.addAction("Add Folder")
selectedFolder = addFolderAction.triggered.connect(lambda: self.handlerInput("folder")) #selectedFolder = addFolderAction.triggered.connect(lambda: self.handlerInput("folder"))
puzzleAction.setMenu(puzzleMenu) puzzleAction.setMenu(puzzleMenu)
@ -71,13 +71,12 @@ class MainWindow(QMainWindow):
selectedImage = self.imageConversion.openImageFile() selectedImage = self.imageConversion.openImageFile()
if selectedImage: if selectedImage:
self.constructPuzzle(selectedImage) self.constructPuzzle(selectedImage)
elif typeInput == "folder": #elif typeInput == "folder":
selectedFolder = self.imageConversion.openFolder() # selectedFolder = self.imageConversion.openFolder()
if selectedFolder: # if selectedFolder:
self.constructPuzzle(selectedFolder) # self.constructPuzzle(selectedFolder)
def constructPuzzle(self, input): def constructPuzzle(self, input):
print(input) self.scene = PuzzleWindow(input, self.settingsWindow.getGridRows(), self.settingsWindow.getGridCols())
self.scene = PuzzleWindow(input, self.settingsWindow.piecesToGrid(self.settings.getData("puzzlePieces"))[0], self.settingsWindow.piecesToGrid(self.settings.getData("puzzlePieces"))[1])
self.view.setScene(self.scene) self.view.setScene(self.scene)

View file

@ -73,3 +73,9 @@ class SettingsWindow(QDialog):
cols = math.ceil(math.sqrt(totalPieces)) cols = math.ceil(math.sqrt(totalPieces))
rows = math.ceil(totalPieces / cols) rows = math.ceil(totalPieces / cols)
return rows, cols return rows, cols
def getGridRows(self):
return self.piecesToGrid(self.settings.getData("puzzlePieces"))[0]
def getGridCols(self):
return self.piecesToGrid(self.settings.getData("puzzlePieces"))[1]