Есть несколько проблем с вашей попыткой:
- Не создавайте отдельные переменные для каждой части, как
darkPawn1
.Вместо этого разместите эти объекты в массиве представления доски. firstPawnMove
получает строковое значение "ture", что немного странно (вы намеревались "true"?).Во-первых, вы можете использовать логические значения в JavaScript (true
без кавычек).Во-вторых, вы захотите зарегистрировать текущую позицию каждой фигуры, и когда она у вас есть, вам больше не понадобится firstPawnMove
, так как она может быть получена непосредственно из текущей позиции пешки и ее цвета. - Дайте объектам объекта атрибут
color
if (side + 'Pawn' + number + '.firstPawnMove' == 'false') {
- это неправильное условие.Это всегда будет ложью.Вы, вероятно, намеревались получить динамический доступ к одной из переменных, например darkPawn1
, но, поскольку я предлагаю отойти от этой концепции переменных, эта точка больше не актуальна if (side = 'dark') {
назначает 'dark'
для side
.Вы намеревались сделать ==
. top: '-=' + 50 + 'px'
недопустимым JavaScript.Возможно, вы намеревались применить некоторые изменения к какому-либо свойству CSS, но для этого требуется совершенно другой синтаксис - ... несколько других вещей, которые можно улучшить ...
Чтобы исправитьСитуацию, которую вам нужно начинать с нуля, так как большая часть вашего дизайна и кода должна быть изменена в любом случае.
Вот один из способов реализовать простую шахматную доску.Он использует класс для фигуры, квадрата и доски.Экземпляр Board имеет квадратные экземпляры, которые, в свою очередь, могут иметь экземпляр Piece или нет.Некоторые методы позволяют выполнять рендеринг, выполнение ходов и получение списка ходов.
Это, конечно, только начало.Вам придется распространить его на другие проверки, функции, взаимодействие с пользователем и т. Д.
class Piece {
constructor(letter) {
this.letter = letter;
this.type = letter.toLowerCase(); // k, q, b, n, r or p
this.isWhite = letter !== this.type; // Capital <==> white
this.square = null;
this.name = { k: "king", q: "queen", b: "bishop", n: "knight", r: "rook", p: "pawn" }[this.type];
}
remove() {
if (this.square) this.square.piece = null;
this.square = null;
return this;
}
moveTo(square) {
this.remove();
if (square.piece) square.piece.remove();
this.square = square;
square.piece = this;
return this;
}
moveList() {
let squares;
const {square} = this;
if (!square) return [];
if (this.type == "p") {
squares = (square.row === (this.isWhite ? 6 : 1) ? [1,2] : [1]).map(i =>
square.board.rows[square.row+(this.isWhite ? -i : i)][square.column]
);
// TODO: Pawn capturing moves should be generated here
} else {
// TODO: Other pieces' moves should be generated here
}
return squares;
}
}
class Square {
constructor(board, row, column) {
this.board = board;
this.row = row;
this.column = column;
this.name = "abcdefgh"[column]+(8-row);
this.piece = null;
}
toString() {
return this.name;
}
}
class Board {
constructor(arr) {
this.rows = arr.map((chars, row) => {
return Array.from(chars, (chr, column) => {
const square = new Square(this, row, column);
if (chr !== ".") (new Piece(chr)).moveTo(square);
this[square.name] = square;
return square;
})
});
}
html() {
return '<table class="chessboard">' + this.rows.map(row =>
"<tr>" + row.map(({piece}) =>
'<td><div class="' + (piece ? piece.letter : "") + '"></div></td>'
).join`` + "</tr>"
).join`` + "</table>";
}
}
// Create a chess board instance with pieces in their initial positions
const board = new Board([
"rnbqkbnr",
"pppppppp",
"........",
"........",
"........",
"........",
"PPPPPPPP",
"RNBQKBNR"
]);
// Show the board
document.querySelector("#container").innerHTML = board.html();
// Get the piece object at b2
const piece = board.b2.piece;
// Output info about that piece
console.log(piece.name + " at " + piece.square + " can move to " + piece.moveList());
// Perform a move
piece.moveTo(board.b4);
// Wait a bit and then show board again
setTimeout(() => document.querySelector("#container").innerHTML = board.html(), 500);
.chessboard { border: 1px solid; border-collapse: collapse; border-spacing: 0; }
.chessboard td { width: 18px; height: 18px; }
.chessboard tr:nth-child(2n) td:nth-child(2n+1),
.chessboard tr:nth-child(2n+1) td:nth-child(2n) { background: silver; }
.chessboard div { background-size: contain; width: 100%; height: 100% }
.k { background: url(https://upload.wikimedia.org/wikipedia/commons/e/e3/Chess_kdt60.png); }
.q { background: url(https://upload.wikimedia.org/wikipedia/commons/a/af/Chess_qdt60.png); }
.b { background: url(https://upload.wikimedia.org/wikipedia/commons/8/81/Chess_bdt60.png); }
.n { background: url(https://upload.wikimedia.org/wikipedia/commons/f/f1/Chess_ndt60.png); }
.r { background: url(https://upload.wikimedia.org/wikipedia/commons/a/a0/Chess_rdt60.png); }
.p { background: url(https://upload.wikimedia.org/wikipedia/commons/c/cd/Chess_pdt60.png); }
.K { background: url(https://upload.wikimedia.org/wikipedia/commons/3/3b/Chess_klt60.png); }
.Q { background: url(https://upload.wikimedia.org/wikipedia/commons/4/49/Chess_qlt60.png); }
.B { background: url(https://upload.wikimedia.org/wikipedia/commons/9/9b/Chess_blt60.png); }
.N { background: url(https://upload.wikimedia.org/wikipedia/commons/2/28/Chess_nlt60.png); }
.R { background: url(https://upload.wikimedia.org/wikipedia/commons/5/5c/Chess_rlt60.png); }
.P { background: url(https://upload.wikimedia.org/wikipedia/commons/0/04/Chess_plt60.png); }
<div id="container"></div>