Um die verblüffende Entscheidung einer Person zu verteidigen, wird oft gesagt, dass diese Person über alle Köpfe geht und „dreidimensionales Schach“ spielt. Jetzt ist es Ihre Chance, dreidimensionales Schach zu spielen!
Regeln
Es gibt viele Varianten von 3D-Schach , aber für diese Herausforderung habe ich meine eigene erfunden. Meine Version ist wie normales Schach, nur dass die Figuren in Würfeln anstatt in Quadraten liegen und jetzt eine zusätzliche Dimension der Bewegung haben. Um diese Herausforderung zu vereinfachen, gibt es keine Bauern und keine Rochade .
Stückbewegung
(Kompassrichtungen beziehen sich auf Bewegungen, die auf einem Standardschachbrett auftreten würden, Auf und Ab beziehen sich auf vertikale Bewegungen auf dem 3D-Schachbrett.)
- König - hat 26 Felder, die er in einem Zug erreichen kann: N, NE, E, SE, S, SW, W, NW; sowie nach oben, unten und oben / unten + eine der Kompassrichtungen.
- Königin - kann sich in die gleichen Richtungen wie der König bewegen, aber so weit sie will in diese Richtungen.
- Turm - kann sich in 6 Richtungen bewegen: N, E, S, W, Oben und Unten,
- Bischof - hat 8 dreieckige Fahrtrichtungen: NE + Auf / Ab, SE + Auf / Ab, SW + Auf / Ab, NW + Auf / Ab
- Ritter - bewegt 2 Felder auf einer Achse und dann 1 Feld auf einer anderen. Genau wie beim normalen Schach ist der Ritter das einzige Stück, das über andere Teile springen kann.
Stückprüfgerät
Verwenden Sie dieses Snippet, um zu sehen, wie sich die verschiedenen Teile auf dem 3D-Brett bewegen ( Tipp : Sehen Sie sich die *Test
Funktionen im JS an, um schnell zu bestimmen, ob ein Quadrat ein gültiger Zug ist, einfach basierend auf seiner absoluten Entfernung vom Teil.):
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>
Herausforderung
Bei einem gegebenen n x n x n Brett, festzustellen , ob der weiße König in niederlage ist.
Eingang
- (Optional) n ≥ 2 - die Größe der Platine
- Das Spielbrett
- Kann in Form eines 1d-, 2d- oder 3d-Arrays oder eines ähnlichen Formats vorliegen. Notation kann in jedem einfachen Format sein. Zum Beispiel KQRBN (Weiß) und kqrbn (Schwarz) mit # für leere Würfel. Oder verwenden Sie Zahlen für die verschiedenen Werte.
- Stellen Sie sich das 3D-Schachbrett als mehrere übereinander gestapelte und von oben nach unten aufgeführte Bretter vor. Dann wird jede einzelne Platine von links nach rechts, von hinten nach vorne (von der schwarzen Seite zur weißen Seite) notiert.
- Stellen Sie sich diesen 2x2x2-Fall als 3D-Array vor:
[ [[bq] [##]] [[Mrd.] [KQ]] ]
Ausgabe
- Boolescher Wert (wahrheitsgemäßer / falscher Wert) - wahr, wenn sich der weiße König im Schachmatt befindet, sonst falsch.
Schachmatt
Der weiße König ist in Schach, wenn eine schwarze Figur sie in der nächsten Runde von Schwarz zu erobern droht. Um außer Kontrolle zu geraten, muss Weiß seinen König in Sicherheit bringen, ihn mit einer anderen Figur verteidigen oder die bedrohliche Figur erobern. Wenn Weiß nicht außer Kontrolle geraten kann, befindet sich der weiße König im Schachmatt . Denken Sie daran, wenn Weiß nicht in Schach ist, sich aber nicht bewegen kann, ohne in Schach zu geraten, ist es ein Patt , das kein Schachmatt ist.
Spezifikation
- Sie erhalten keine Tafel, auf der der schwarze König versucht, den weißen König zu "kontrollieren", oder eine Tafel, auf der beide Könige in Kontrolle sind (unmögliche Szenarien).
Testfälle
n = 3,
[###,n##,#rr],[#b#,###,###],[###,###,bRK]
Ausgabe: wahr
Erklärung: Der König erhält einen Scheck vom Turm in der obersten Etage. Der weiße Turm kann den Angriff nicht abwehren oder den drohenden Turm erobern, daher muss der König versuchen, sich aus dem Weg zu räumen. Betrachten wir die Zugoptionen des Königs:
- c2 (I) - bewacht vom Bischof bei b3 (II)
- b2 (I) - bewacht von einem Ritter bei a2 (III)
- c1 (II) - bewacht von Turm bei c1 (III)
- b1 (II) - bewacht von Turm bei b1 (III)
- c2 (II) - bewacht von einem Ritter bei a2 (III)
- b2 (II) - bewacht vom Bischof bei a1 (I)
Da der König dem Scheck nicht entkommen kann, ist es ein Schachmatt!
n = 3,
[b#b,###,###],[###,###,RNR],[#q#,###,#K#]
Ausgabe: false Erläuterung: Der König erhält einen Scheck von der Königin und hat keine Bewegungen, mit denen er entkommen oder blocken kann. Der Ritter kann jedoch die Königin fangen.
n = 3,
[#q#,#b#,###],[n##,###,###],[#k#,###,#KB]
Ausgabe: false Erläuterung: Weiß hat keine Möglichkeit, die bedrohliche Königin zu erobern oder seinen König in Sicherheit zu bringen. Indem Weiß seinen Läufer nach b2 (II) versetzt, kann er die Bedrohung der Königin abwehren.
n = 4,
[####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]
Ausgabe: wahr Erläuterung: In diesem Fall erhält der König einen Scheck von einem der Ritter und einer Königin. Obwohl Weiß eines der Kontrollstücke erfassen / blockieren kann, kann er nicht beide erfassen / blockieren. Deshalb muss Weiß versuchen, seinen König außer Kontrolle zu bringen, aber er hat keine Wahl.
n = 3,
[###,##b,r#r],[###,###,###],[#k#,###,#K#]
Ausgabe: falsch Erläuterung: Weiß ist nicht in Schach, kann sich jedoch nicht bewegen, ohne in Schach zu geraten. Daher ist es ein Patt, aber kein Schachmatt.
Ausgabe: wahr Erklärung: Weiß würde gerne mit seiner Königin vorbeischauen, um seinen König zu verteidigen, aber sein Ritter blockiert den Weg.
Ausgabe: wahr Erklärung: Weiß kann die Königin nicht mit seinem Ritter nehmen, weil dann der Turm den König von Weiß prüft.
Ausgabe: falsch Erklärung: Weiß kann die Königin mit seinem König fangen.
Ausgabe: true Erläuterung: Diesmal bewacht der Turm, sodass der König die Königin nicht fangen kann.
Ausgabe: false Erläuterung: Der weiße König kann entkommen, indem er den Ritter gefangen nimmt.
cell.className = (i + j)%2 == 0 ? "black" : "white"
besser im Snippet?