Spaces:
Running
Running
Update index.html
Browse files- index.html +48 -35
index.html
CHANGED
@@ -154,28 +154,12 @@
|
|
154 |
cursor: grabbing;
|
155 |
}
|
156 |
|
157 |
-
.coordinates {
|
158 |
-
position: absolute;
|
159 |
-
font-size: 0.8rem;
|
160 |
-
color: #95a5a6;
|
161 |
-
}
|
162 |
-
|
163 |
-
.file {
|
164 |
-
bottom: -1.5rem;
|
165 |
-
left: calc(var(--square-size) * 0.5);
|
166 |
-
}
|
167 |
-
|
168 |
-
.rank {
|
169 |
-
left: -1.5rem;
|
170 |
-
top: calc(var(--square-size) * 0.5);
|
171 |
-
}
|
172 |
-
|
173 |
@media (max-width: 1024px) {
|
174 |
.container {
|
175 |
grid-template-columns: 1fr;
|
176 |
grid-template-rows: auto auto;
|
177 |
}
|
178 |
-
|
179 |
.board-container {
|
180 |
margin: auto;
|
181 |
}
|
@@ -186,13 +170,12 @@
|
|
186 |
<div class="container">
|
187 |
<div class="board-container">
|
188 |
<div class="chessboard" id="board"></div>
|
189 |
-
<div class="coordinates" id="coordinates"></div>
|
190 |
</div>
|
191 |
<div class="controls">
|
192 |
<div class="status-panel">
|
193 |
<h3>Position Analysis</h3>
|
194 |
<p id="status">White to move</p>
|
195 |
-
<p id="evaluation">Evaluation: 0.0</p>
|
196 |
</div>
|
197 |
<div class="move-list" id="moveList">
|
198 |
<!-- Moves will be inserted here -->
|
@@ -209,6 +192,18 @@
|
|
209 |
this.currentPlayer = 'white';
|
210 |
this.selectedPiece = null;
|
211 |
this.moveHistory = [];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
212 |
this.initializeBoard();
|
213 |
}
|
214 |
|
@@ -217,7 +212,7 @@
|
|
217 |
['β', 'β', 'β', 'β', 'β', 'β', 'β', 'β'],
|
218 |
['β', 'β', 'β', 'β', 'β', 'β', 'β', 'β'],
|
219 |
[null, null, null, null, null, null, null, null],
|
220 |
-
[null, null, null, null, null, null, null, null],
|
221 |
[null, null, null, null, null, null, null, null],
|
222 |
[null, null, null, null, null, null, null, null],
|
223 |
['β', 'β', 'β', 'β', 'β', 'β', 'β', 'β'],
|
@@ -225,6 +220,7 @@
|
|
225 |
];
|
226 |
}
|
227 |
|
|
|
228 |
initializeBoard() {
|
229 |
const boardElement = document.getElementById('board');
|
230 |
boardElement.innerHTML = '';
|
@@ -251,6 +247,7 @@
|
|
251 |
this.updateStatus();
|
252 |
}
|
253 |
|
|
|
254 |
handleSquareClick(event) {
|
255 |
const square = event.target.closest('.square');
|
256 |
const row = parseInt(square.dataset.row);
|
@@ -263,11 +260,11 @@
|
|
263 |
}
|
264 |
}
|
265 |
|
|
|
266 |
selectPiece(row, col) {
|
267 |
const piece = this.board[row][col];
|
268 |
if (!piece) return;
|
269 |
|
270 |
-
// Remove previous selection
|
271 |
document.querySelectorAll('.square').forEach(sq => {
|
272 |
sq.classList.remove('selected');
|
273 |
sq.classList.remove('valid-move');
|
@@ -276,10 +273,10 @@
|
|
276 |
document.querySelector(`[data-row="${row}"][data-col="${col}"]`).classList.add('selected');
|
277 |
this.selectedPiece = { row, col };
|
278 |
|
279 |
-
// Show valid moves
|
280 |
this.showValidMoves(row, col);
|
281 |
}
|
282 |
|
|
|
283 |
tryMove(toRow, toCol) {
|
284 |
if (this.isValidMove(this.selectedPiece.row, this.selectedPiece.col, toRow, toCol)) {
|
285 |
this.makeMove(this.selectedPiece.row, this.selectedPiece.col, toRow, toCol);
|
@@ -293,11 +290,14 @@
|
|
293 |
this.selectedPiece = null;
|
294 |
}
|
295 |
|
|
|
296 |
isValidMove(fromRow, fromCol, toRow, toCol) {
|
297 |
-
//
|
298 |
-
|
|
|
299 |
}
|
300 |
|
|
|
301 |
makeMove(fromRow, fromCol, toRow, toCol) {
|
302 |
const piece = this.board[fromRow][fromCol];
|
303 |
this.board[fromRow][fromCol] = null;
|
@@ -314,23 +314,36 @@
|
|
314 |
this.updateMoveList();
|
315 |
}
|
316 |
|
|
|
317 |
showValidMoves(row, col) {
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
327 |
}
|
328 |
|
|
|
329 |
updateStatus() {
|
330 |
-
document.getElementById('status').textContent =
|
|
|
331 |
this.currentPlayer.slice(1)} to move`;
|
332 |
}
|
333 |
|
|
|
334 |
updateMoveList() {
|
335 |
const moveList = document.getElementById('moveList');
|
336 |
moveList.innerHTML = '';
|
@@ -359,6 +372,7 @@
|
|
359 |
moveList.scrollTop = moveList.scrollHeight;
|
360 |
}
|
361 |
|
|
|
362 |
formatMove(move) {
|
363 |
const files = 'abcdefgh';
|
364 |
const ranks = '87654321';
|
@@ -369,7 +383,6 @@
|
|
369 |
const game = new ChessGame();
|
370 |
|
371 |
function analyzePosition() {
|
372 |
-
// Simulated analysis
|
373 |
const eval = (Math.random() * 2 - 1).toFixed(2);
|
374 |
document.getElementById('evaluation').textContent = `Evaluation: ${eval}`;
|
375 |
}
|
|
|
154 |
cursor: grabbing;
|
155 |
}
|
156 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
@media (max-width: 1024px) {
|
158 |
.container {
|
159 |
grid-template-columns: 1fr;
|
160 |
grid-template-rows: auto auto;
|
161 |
}
|
162 |
+
|
163 |
.board-container {
|
164 |
margin: auto;
|
165 |
}
|
|
|
170 |
<div class="container">
|
171 |
<div class="board-container">
|
172 |
<div class="chessboard" id="board"></div>
|
|
|
173 |
</div>
|
174 |
<div class="controls">
|
175 |
<div class="status-panel">
|
176 |
<h3>Position Analysis</h3>
|
177 |
<p id="status">White to move</p>
|
178 |
+
<p id="evaluation">Evaluation: 0.0</p>
|
179 |
</div>
|
180 |
<div class="move-list" id="moveList">
|
181 |
<!-- Moves will be inserted here -->
|
|
|
192 |
this.currentPlayer = 'white';
|
193 |
this.selectedPiece = null;
|
194 |
this.moveHistory = [];
|
195 |
+
this.validMoves = [
|
196 |
+
{type: 'K', move: {dx: [-1,0,1], dy: [-1,0,1]}},
|
197 |
+
{type: 'Q', move: {dx: [-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7],
|
198 |
+
dy: [-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7]}},
|
199 |
+
{type: 'R', move: {dx: [-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7],
|
200 |
+
dy: [0]}},
|
201 |
+
{type: 'B', move: {dx: [-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7],
|
202 |
+
dy: [-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7]}},
|
203 |
+
{type: 'N', move: {dx: [-2,-2,-1,-1,1,1,2,2],
|
204 |
+
dy: [-1,1,-2,2,-2,2,-1,1]}},
|
205 |
+
{type: 'P', move: {dx: [0], dy: [-1,1]}}
|
206 |
+
];
|
207 |
this.initializeBoard();
|
208 |
}
|
209 |
|
|
|
212 |
['β', 'β', 'β', 'β', 'β', 'β', 'β', 'β'],
|
213 |
['β', 'β', 'β', 'β', 'β', 'β', 'β', 'β'],
|
214 |
[null, null, null, null, null, null, null, null],
|
215 |
+
[null, null, null, null, null, null, null, null],
|
216 |
[null, null, null, null, null, null, null, null],
|
217 |
[null, null, null, null, null, null, null, null],
|
218 |
['β', 'β', 'β', 'β', 'β', 'β', 'β', 'β'],
|
|
|
220 |
];
|
221 |
}
|
222 |
|
223 |
+
// Initialize the board display
|
224 |
initializeBoard() {
|
225 |
const boardElement = document.getElementById('board');
|
226 |
boardElement.innerHTML = '';
|
|
|
247 |
this.updateStatus();
|
248 |
}
|
249 |
|
250 |
+
// Handle square clicks
|
251 |
handleSquareClick(event) {
|
252 |
const square = event.target.closest('.square');
|
253 |
const row = parseInt(square.dataset.row);
|
|
|
260 |
}
|
261 |
}
|
262 |
|
263 |
+
// Select a piece to move
|
264 |
selectPiece(row, col) {
|
265 |
const piece = this.board[row][col];
|
266 |
if (!piece) return;
|
267 |
|
|
|
268 |
document.querySelectorAll('.square').forEach(sq => {
|
269 |
sq.classList.remove('selected');
|
270 |
sq.classList.remove('valid-move');
|
|
|
273 |
document.querySelector(`[data-row="${row}"][data-col="${col}"]`).classList.add('selected');
|
274 |
this.selectedPiece = { row, col };
|
275 |
|
|
|
276 |
this.showValidMoves(row, col);
|
277 |
}
|
278 |
|
279 |
+
// Try to make a move
|
280 |
tryMove(toRow, toCol) {
|
281 |
if (this.isValidMove(this.selectedPiece.row, this.selectedPiece.col, toRow, toCol)) {
|
282 |
this.makeMove(this.selectedPiece.row, this.selectedPiece.col, toRow, toCol);
|
|
|
290 |
this.selectedPiece = null;
|
291 |
}
|
292 |
|
293 |
+
// Check if move is valid
|
294 |
isValidMove(fromRow, fromCol, toRow, toCol) {
|
295 |
+
// Simplified validation
|
296 |
+
const piece = this.board[fromRow][fromCol];
|
297 |
+
return piece !== null;
|
298 |
}
|
299 |
|
300 |
+
// Execute a move
|
301 |
makeMove(fromRow, fromCol, toRow, toCol) {
|
302 |
const piece = this.board[fromRow][fromCol];
|
303 |
this.board[fromRow][fromCol] = null;
|
|
|
314 |
this.updateMoveList();
|
315 |
}
|
316 |
|
317 |
+
// Show valid moves for selected piece
|
318 |
showValidMoves(row, col) {
|
319 |
+
const piece = this.board[row][col];
|
320 |
+
const moves = this.getValidMoves(piece, row, col);
|
321 |
+
|
322 |
+
moves.forEach(move => {
|
323 |
+
const square = document.querySelector(
|
324 |
+
`[data-row="${move.row}"][data-col="${move.col}"]`
|
325 |
+
);
|
326 |
+
if (square) square.classList.add('valid-move');
|
327 |
+
});
|
328 |
+
}
|
329 |
+
|
330 |
+
// Get valid moves for a piece
|
331 |
+
getValidMoves(piece, row, col) {
|
332 |
+
// Simplified move generation
|
333 |
+
return [{row: row + 1, col}, {row: row - 1, col},
|
334 |
+
{row, col: col + 1}, {row, col: col - 1}]
|
335 |
+
.filter(pos => pos.row >= 0 && pos.row < 8 &&
|
336 |
+
pos.col >= 0 && pos.col < 8);
|
337 |
}
|
338 |
|
339 |
+
// Update game status display
|
340 |
updateStatus() {
|
341 |
+
document.getElementById('status').textContent =
|
342 |
+
`${this.currentPlayer.charAt(0).toUpperCase() +
|
343 |
this.currentPlayer.slice(1)} to move`;
|
344 |
}
|
345 |
|
346 |
+
// Update move list display
|
347 |
updateMoveList() {
|
348 |
const moveList = document.getElementById('moveList');
|
349 |
moveList.innerHTML = '';
|
|
|
372 |
moveList.scrollTop = moveList.scrollHeight;
|
373 |
}
|
374 |
|
375 |
+
// Format move for display
|
376 |
formatMove(move) {
|
377 |
const files = 'abcdefgh';
|
378 |
const ranks = '87654321';
|
|
|
383 |
const game = new ChessGame();
|
384 |
|
385 |
function analyzePosition() {
|
|
|
386 |
const eval = (Math.random() * 2 - 1).toFixed(2);
|
387 |
document.getElementById('evaluation').textContent = `Evaluation: ${eval}`;
|
388 |
}
|