Para defender la desconcertante decisión de alguien, la gente suele decir que esa persona está pasando por encima de la cabeza de todos y jugando al "ajedrez tridimensional". ¡Ahora es tu oportunidad de jugar ajedrez tridimensional!
Reglas
Hay muchas variantes del ajedrez 3D , pero para este desafío he inventado el mío. Mi versión es como el ajedrez normal, excepto que las piezas están dentro de cubos en lugar de cuadrados, y ahora tienen una dimensión adicional de movimiento. Para que esto sea simple desafío hay ningún peones y sin enroque .
Movimiento de la pieza
(Las direcciones de la brújula se refieren al movimiento que ocurriría en un tablero de ajedrez estándar, arriba y abajo se refieren a moverse verticalmente en el tablero de ajedrez 3D).
- Rey : tiene 26 casillas a las que puede ir en un turno dado: N, NE, E, SE, S, SW, W, NW; así como arriba, abajo y arriba / abajo + una de las direcciones de la brújula.
- Reina : puede moverse en las mismas direcciones que el Rey, pero tan lejos como quiera en esas direcciones.
- Torre - puede moverse en 6 direcciones: N, E, S, W, Arriba y Abajo,
- obispo : tiene 8 direcciones de viaje triagonales: NE + arriba / abajo, SE + arriba / abajo, SW + arriba / abajo, NW + arriba / abajo
- Caballero : mueve 2 espacios en un eje, luego 1 espacio en otro. Al igual que el ajedrez normal, el caballero es la única pieza que puede saltar sobre otras piezas.
Probador de piezas
Use este fragmento para ver cómo se mueven las diferentes piezas en el tablero 3D ( consejo : consulte las *Test
funciones en el JS para ver formas rápidas de determinar si un cuadrado es un movimiento válido, simplemente en función de su distancia absoluta de la pieza):
const color = "Black";
const pieces = ["N","B","R","Q","K"];
const urls = ["https://image.ibb.co/gyS9Cx/Black_N.png","https://image.ibb.co/dknnzc/Black_B.png","https://image.ibb.co/kb3hXx/Black_R.png","https://image.ibb.co/hGO5kH/Black_Q.png","https://image.ibb.co/jApd5H/Black_K.png"];
var dragPiece;
var size = 3;
var index = 0;
function start() {
Array.prototype.add = function(a) {return [this[0]+a[0],this[1]+a[1],this[2]+a[2]]};
document.getElementById("n").onchange=function() {
size = parseInt(this.value);
var s = document.getElementsByClassName("selected");
var pos;
if(s.length > 0) {
pos = s[0].pos;
}
document.body.removeChild(document.body.firstChild);
createBoards();
if(pos != null && valid(...pos)) {
cellAt(...pos).click();
}
};
createBoards();
}
function createBoards() {
var boards = document.createElement("div");
boards.style.counterReset = "board-count "+(size+1);
boards.name=size;
for(var x = 0;x<size;x++) {
var t = document.createElement("table");
for(var i = 0;i<size;i++) {
var row = document.createElement("tr");
row.className="row";
for(var j = 0;j<size;j++) {
var cell = document.createElement("td");
cell.className = (size+i+j)%2 == 1 ? "black" : "white";
var im = document.createElement("img");
im.draggable = true;
im.ondragstart = function(e) {dragPiece = this;e.dataTransfer.setData("piece",this.parentElement.name);
this.parentElement.classList.add("start");
this.classList.add("dragged");
};
im.ondragend = function(e) {this.parentElement.classList.remove("start");this.classList.remove("dragged");};
im.hidden = true;
cell.appendChild(im);
cell.pos = [j,i,x];
cell.ondragover = function(e) {e.preventDefault();};
cell.ondragenter = function(e) {this.classList.add("drag");};
cell.ondragleave = function(e) {this.classList.remove("drag");};
cell.ondrop = function(e) { e.preventDefault();this.classList.remove("drag");
if(this != dragPiece.parentElement && this.firstChild.hidden ){
dragPiece.hidden=true;
setPiece(this,e.dataTransfer.getData("piece"));
}
};
cell.onclick = function() {
if(this.firstChild.hidden == false && this.classList.contains("selected")) {
index++;
if(index == pieces.length) index = 0;
}
setPiece(this,pieces[index]);
};
row.appendChild(cell);
}
t.appendChild(row);
}
boards.appendChild(t);
}
document.body.insertBefore(boards,document.body.firstChild);
}
function clearHighlighted() {
var sel = document.getElementsByClassName("highlighted");
while(sel.length > 0) {
sel[0].classList.remove("highlighted");
}
}
function setPiece(cell,piece) {
var s=document.getElementsByClassName("selected");
if(s.length > 0){ s[0].firstChild.hidden=true;s[0].classList.remove("selected");}
cell.classList.add("selected");
cell.firstChild.hidden = false;
cell.name = piece;
cell.firstChild.src = urls[index];
clearHighlighted();
showMoves(cell,piece);
}
function showMoves(cell,piece) {
if(piece=="K") selector(cell,kingTest)
else if(piece=="N") selector(cell,knightTest);
else if(piece=="Q") selector(cell,queenTest);
else if(piece=="R") selector(cell,rookTest);
else if(piece=="B") selector(cell,bishopTest);
}
function cellAt(col,row,board) {
return document.body.firstChild.children[board].children[row].children[col];
}
function valid(col,row,board) {
return 0<=col && col<size && 0<=row && row<size && 0<=board && board<size;
}
function select(cell) {
if(cell != null && cell.firstChild.hidden) cell.classList.add("highlighted");
}
function rookTest(dist) {
var d = [].concat(dist).sort();
return d[0] == 0 && d[1] == 0;
}
function knightTest(dist) {
var d = [].concat(dist).sort();
return d[0] == 0 && d[1] == 1 && d[2] == 2;
}
function kingTest(dist) {
return dist[0] <= 1 && dist[1] <= 1 && dist[2] <= 1;
}
function bishopTest(dist) {
return dist[0]==dist[1] && dist[1]==dist[2];
}
function queenTest(dist) {
var d = [].concat(dist).sort();
return rookTest(dist) || bishopTest(dist) || (d[0]==0 && d[1]==d[2]) ;
}
function dist(cell,x,y,z) {
return [Math.abs(cell.pos[0]-x),Math.abs(cell.pos[1]-y),Math.abs(cell.pos[2]-z)];
}
function selector(cell,test) {
for(var i = 0;i<size;i++) {
for(var j = 0;j<size;j++) {
for(var k = 0;k<size;k++) {
if(test(dist(cell,k,j,i))) {
var c = cellAt(k,j,i);
if(c != cell) select(c);
}
}
}
}
}
table
{
padding: 10px;
display:inline-block;
}
table:after
{
counter-increment: board-count -1;
content: "("counter(board-count,upper-roman)")";
float:right;
}
td
{
width:28px;
height:28px;
border: 1px solid;
cursor: pointer;
}
.black
{
background-color: rgba(127,127,127,0.6);
}
.white
{
background-color: white;
}
.start {
background-color: rgba(0,204,0,0.6);
}
.highlighted {
background-color: rgba(0,255,0,0.6);
}
.drag
{
background-color: rgba(0,204,255,0.6);
}
.selected {
background-color: green;
cursor: grab;
}
.selected img
{
display:block;
}
.dragged {
cursor: grabbing;
}
<body data-size=3 onload="start()"
<label for="n">Size: </label><select id="n">
<option>2</option>
<option selected>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
</select>
<div>Click or drag to place the piece. Click on the piece to change its type.</div>
</body>
Reto
Dado un n x n x n tabla , determina si el rey blanco está en jaque mate.
Entrada
- (Opcional) n ≥ 2 - el tamaño del tablero
- El tablero de juego
- Puede estar en forma de matriz 1d- 2d- o 3d, u otro formato similar. La notación puede estar en cualquier formato simple. Por ejemplo, KQRBN (Blanco) y kqrbn (Negro) con # para cubos vacíos. O use números para los diferentes valores.
- Piense en el tablero de ajedrez 3D como múltiples tableros apilados uno encima del otro y listados de arriba a abajo. Luego, cada tablero individual se anota de izquierda a derecha, de atrás hacia adelante (del lado negro al lado blanco).
- Imagine este caso 2x2x2 dado como una matriz 3D:
[ [[bq] [##]] [[bn] [KQ]] ]
tablero "superior": tablero "inferior":
Salida
- booleano (valor de verdad / falsedad): verdadero si el rey blanco está en jaque mate, falso de lo contrario.
Mate
El rey blanco está bajo control si una pieza negra amenaza con capturarlo en el próximo turno de las negras. Para salir de control, las blancas necesitan mover a su rey a un lugar seguro, defenderlo con otra pieza o capturar la pieza amenazante. Si las blancas no tienen forma de salir de control, entonces el rey blanco está en jaque mate . Recuerde, si las blancas no están en jaque, pero no pueden moverse sin entrar en jaque, entonces es un punto muerto , que no es un jaque mate.
Especificación
- No se te dará un tablero donde el rey negro está tratando de "controlar" al rey blanco, o un tablero donde ambos reyes están bajo control (escenarios imposibles).
Casos de prueba
n = 3,
[###,n##,#rr],[#b#,###,###],[###,###,bRK]
Salida: verdadero
Explicación: El rey está recibiendo un cheque de la torre en el piso superior. La torre blanca no puede bloquear el ataque o capturar la torre amenazante, por lo que el rey debe intentar apartarse del camino. Consideremos las opciones de movimiento del rey:
- c2 (I) - custodiado por el obispo en b3 (II)
- b2 (I) - custodiado por un caballero en a2 (III)
- c1 (II) - custodiado por la torre en c1 (III)
- b1 (II) - custodiado por la torre en b1 (III)
- c2 (II) - custodiado por un caballero en a2 (III)
- b2 (II) - custodiado por el obispo en a1 (I)
¡Ya que el rey no puede escapar del cheque, es un jaque mate!
n = 3,
[b#b,###,###],[###,###,RNR],[#q#,###,#K#]
Salida: falso Explicación: El rey recibe un cheque de la reina y no tiene movimientos para escapar o bloquear. Sin embargo, el caballero puede capturar a la reina.
n = 3,
[#q#,#b#,###],[n##,###,###],[#k#,###,#KB]
Salida: falso Explicación: Las blancas no tienen forma de capturar a la reina amenazante o de mover a su rey a un lugar seguro. Sin embargo, al mover a su alfil a b2 (II), las blancas pueden bloquear la amenaza de la reina.
n = 4,
[####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]
Salida: verdadera Explicación: en este caso, el rey recibe un cheque de uno de los caballeros y una reina. Aunque las Blancas pueden capturar / bloquear una de las piezas de verificación, no puede capturar / bloquear ambas. Por lo tanto, las blancas deben tratar de sacar a su rey de control, pero no tiene opciones.
n = 3,
[###,##b,r#r],[###,###,###],[#k#,###,#K#]
Salida: falso Explicación: El blanco no está bajo control, pero no tiene forma de moverse sin entrar en control. Por lo tanto, es un punto muerto, pero no un jaque mate.
Resultado: verdadero Explicación: A White le gustaría acercarse a su reina para defender a su rey, pero su caballero está bloqueando el camino.
Salida: verdadera Explicación: las blancas no pueden llevarse a la reina con su caballero, porque entonces la torre controlará al rey de las blancas.
Resultado: falso Explicación: El blanco puede capturar a la reina con su rey.
Salida: verdadera Explicación: Esta vez la torre está vigilando, por lo que el rey no puede capturar a la reina.
Resultado: falso Explicación: El rey blanco puede escapar capturando al caballero.
cell.className = (i + j)%2 == 0 ? "black" : "white"
sería mejor en el fragmento?