diff --git a/app/routes/__pycache__/main_routes.cpython-311.pyc b/app/routes/__pycache__/main_routes.cpython-311.pyc index 6d84cda..e097a85 100644 Binary files a/app/routes/__pycache__/main_routes.cpython-311.pyc and b/app/routes/__pycache__/main_routes.cpython-311.pyc differ diff --git a/app/routes/main_routes.py b/app/routes/main_routes.py index 3524549..102dcaa 100644 --- a/app/routes/main_routes.py +++ b/app/routes/main_routes.py @@ -1,5 +1,6 @@ from flask import Blueprint, jsonify, render_template, request from flask_login import login_required, current_user +import random main_bp = Blueprint("main", __name__) @@ -61,4 +62,14 @@ def solve(): board[row] = -1 backtrack(0) - return jsonify(solutions) \ No newline at end of file + return jsonify(solutions) + +@main_bp.route("/solve_rooks") +def solve_rooks_route(): + return jsonify(solve_rooks(8)) + +def solve_rooks(n=8): + solution = list(range(n)) + random.shuffle(solution) + return solution + diff --git a/app/static/css/dashboard.css b/app/static/css/dashboard.css index 76ace99..19f7438 100644 --- a/app/static/css/dashboard.css +++ b/app/static/css/dashboard.css @@ -140,4 +140,16 @@ body { background: #f1f5f9; margin: 4px 0; border-radius: 6px; +} + +.mode-switch { + margin-bottom: 15px; +} + +.mode-switch .btn { + margin: 5px; +} + +.btn.active { + background: #22c55e; } \ No newline at end of file diff --git a/app/static/js/dashboard.js b/app/static/js/dashboard.js new file mode 100644 index 0000000..d51e68c --- /dev/null +++ b/app/static/js/dashboard.js @@ -0,0 +1,199 @@ +let mode = "queens"; // oder "rooks" + +function setMode(newMode) { + mode = newMode; + resetBoard(); + + document.getElementById("btnQueens").classList.remove("active"); + document.getElementById("btnRooks").classList.remove("active"); + + if (mode === "queens") { + document.getElementById("btnQueens").classList.add("active"); + } else { + document.getElementById("btnRooks").classList.add("active"); + } + + drawBoard(); +} + +let board = Array(8).fill(-1); +const boardDiv = document.getElementById("board"); + +function getConflicts() { + let conflicts = []; + + for (let r1 = 0; r1 < 8; r1++) { + if (board[r1] === -1) continue; + + for (let r2 = r1 + 1; r2 < 8; r2++) { + if (board[r2] === -1) continue; + + let c1 = board[r1]; + let c2 = board[r2]; + + // ๐Ÿ”ด Tรผrme: nur gleiche Spalte + if (mode === "rooks") { + if (c1 === c2) { + conflicts.push([r1, c1]); + conflicts.push([r2, c2]); + } + } + + // ๐Ÿ”ด Damen: Spalte + Diagonale + else if (mode === "queens") { + if ( + c1 === c2 || + Math.abs(c1 - c2) === Math.abs(r1 - r2) + ) { + conflicts.push([r1, c1]); + conflicts.push([r2, c2]); + } + } + } + } + + return conflicts; +} + +function checkSolution() { + const status = document.getElementById("statusMessage"); + + const allPlaced = board.every(col => col !== -1); + + if (!allPlaced) { + status.textContent = "โ— Noch nicht alle Figuren platziert."; + status.style.color = "orange"; + return; + } + + const conflicts = getConflicts(); + + if (conflicts.length > 0) { + status.textContent = "โŒ Es gibt Konflikte!"; + status.style.color = "red"; + return; + } + + status.textContent = "๐ŸŽ‰ Perfekt gelรถst!"; + status.style.color = "green"; +} + +function drawBoard() { + boardDiv.innerHTML = ""; + boardDiv.className = "board-grid"; + + const conflicts = getConflicts(); + const letters = ["A", "B", "C", "D", "E", "F", "G", "H"]; + + for (let row = -1; row < 8; row++) { + for (let col = -1; col < 8; col++) { + + const cell = document.createElement("div"); + + // ๐Ÿ”น Ecke oben links + if (row === -1 && col === -1) { + cell.classList.add("label"); + } + + // ๐Ÿ”น Buchstaben (oben) + else if (row === -1) { + cell.textContent = letters[col]; + cell.classList.add("label"); + } + + // ๐Ÿ”น Zahlen (links) + else if (col === -1) { + cell.textContent = 8 - row; + cell.classList.add("label"); + } + + // ๐Ÿ”น echtes Spielfeld + else { + cell.classList.add("cell"); + + if ((row + col) % 2 === 0) { + cell.classList.add("white"); + } else { + cell.classList.add("black"); + } + + if (board[row] === col) { + cell.textContent = (mode === "queens") ? "โ™›" : "โ™œ"; + + if (conflicts.some(([r, c]) => r === row && c === col)) { + cell.classList.add("invalid"); + } + } + + cell.onclick = () => placeQueen(row, col); + } + + boardDiv.appendChild(cell); + } + } + + updateQueenList(); +} + +function placeQueen(row, col) { + if (board[row] === col) { + board[row] = -1; + } else { + board[row] = col; + } + drawBoard(); + updateQueenList(); +} + +async function solve() { + + if (mode === "rooks") { + const res = await fetch("/solve_rooks"); + const solution = await res.json(); + + board = solution; + drawBoard(); + return; + } + + // Damen (wie vorher) + const res = await fetch("/solve"); + const solution = await res.json(); + + board = Array.isArray(solution[0]) ? solution[0] : solution; + drawBoard(); +} + + +function resetBoard() { + const status = document.getElementById("statusMessage"); + board = Array(8).fill(-1); + drawBoard(); + updateQueenList(); + status.textContent = ""; +} + +drawBoard(); + +function updateQueenList() { + const list = document.getElementById("queenList"); + list.innerHTML = ""; + + const letters = ["A", "B", "C", "D", "E", "F", "G", "H"]; + + let count = 1; + + for (let row = 0; row < 8; row++) { + if (board[row] !== -1) { + let col = board[row]; + + let pos = letters[col] + (8 - row); + + const li = document.createElement("li"); + li.textContent = `${mode === "queens" ? "Dame" : "Turm"} ${count}: ${pos}`; + + list.appendChild(li); + count++; + } + } +} \ No newline at end of file diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html index 1884b05..9db3807 100644 --- a/app/templates/dashboard.html +++ b/app/templates/dashboard.html @@ -45,163 +45,33 @@ +
+ + +
+ +

โ™Ÿ๏ธ 8-Damen Spiel

+

+
+
+

๐Ÿ“‹ Damen Positionen

+ +
- - -
-

๐Ÿ“‹ Damen Positionen

- -
- - +