사람들의 당혹스러운 결정을 방어하기 위해 사람들은 종종 그 사람이 모든 사람의 머리 위로 가서“3 차원 체스”를하고 있다고 말합니다. 이제 3 차원 체스를 즐길 수 있습니다!
규칙
3D Chess 에는 많은 변형 이 있지만이 도전을 위해 나는 내 자신을 구성했습니다. 내 버전은 정사각형 대신 큐브 안에 조각이 있고 추가 차원의 움직임이 있다는 점을 제외하고는 일반 체스와 같습니다. 이 도전을 간단하게하기 위해 폰 과 캐스터 링 이 없습니다 .
조각 운동
(나침반 방향은 표준 체스 판에서 발생하는 움직임을 말하고 위와 아래는 3D 체스 판에서 수직으로 움직이는 것을 나타냅니다).
- 킹 -주어진 차례에 갈 수있는 26 개의 사각형이 있습니다 : N, NE, E, SE, S, SW, W, NW; 위, 아래, 위 / 아래 + 나침반 방향 중 하나입니다.
- 여왕 -왕과 같은 방향으로 움직일 수 있지만 원하는 방향으로 움직일 수 있습니다.
- 루크 -6 방향으로 이동할 수 있습니다 : N, E, S, W, 위, 아래,
- 주교 -8 개의 삼각 이동 방향이 있습니다 : NE + 위 / 아래, SE + 위 / 아래, SW + 위 / 아래, NW + 위 / 아래
- 기사 -한 축씩 2 칸 이동 한 다음 다른 축에서는 1 칸 이동합니다. 일반 체스와 마찬가지로 기사는 다른 조각을 뛰어 넘을 수있는 유일한 조각입니다.
피스 테스터
이 스 니펫을 사용하여 3D 보드에서 다른 조각이 어떻게 움직이는 지 확인하십시오 ( 팁 : *Test
조각과의 절대 거리를 기준으로 사각형이 유효한 이동인지 확인하는 빠른 방법은 JS 의 기능을 확인하십시오 ).
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>
도전
n x n x n 보드가 주어지면 백인 왕이 장군인지 확인하십시오.
입력
- (선택 사항) n ≥ 2-보드 크기
- 게임 보드
- 1d-2d 또는 3d- 배열의 형태이거나 다른 유사한 형식 일 수 있습니다. 표기법은 간단한 형식 일 수 있습니다. 예를 들어, 빈 큐브의 경우 KQRBN (흰색) 및 kqrbn (검은 색)이 #입니다. 또는 다른 값에 숫자를 사용하십시오.
- 3D 체스 보드는 여러 개의 보드가 서로 쌓여 있고 위에서 아래로 나열되는 것으로 생각하십시오. 그런 다음 각 개별 보드는 왼쪽에서 오른쪽으로, 뒤로 (전면에서 검은 색에서 흰색으로) 표시됩니다.
- 이 2x2x2 사례가 3D 배열로 주어진다고 상상해보십시오.
[ [[bq] [##]] [[bn] [KQ]] ]
산출
- 부울 (거짓 / 거짓 값)-흰색 왕이 장군 인 경우 true, 그렇지 않으면 false
장군
다음 왕은 블랙 피스가 블랙의 다음 턴에서 블랙 피스를 포획하겠다고 위협 하는지 점검 합니다. 점검에서 벗어나기 위해서는 White가 그의 왕을 안전으로 옮기거나 다른 조각으로 방어하거나 위협하는 조각을 포착해야합니다. White가 점검에서 벗어날 수 없다면, White king은 checkmate에 있습니다. White가 체크 되지 않았지만 체크하지 않고 움직일 수 없다면, 그것은 교착 상태 가 아니며, 체크 메이트가 아닙니다.
사양
- 당신은 흑 왕이 백인 왕을 "체크"하려고하는 보드 나 두 왕이 모두 점검하는 보드를받을 수 없습니다 (불가능한 시나리오).
테스트 사례
n = 3,
[###,n##,#rr],[#b#,###,###],[###,###,bRK]
출력 : true
설명 : 왕이 최상층의 사기꾼에게 수표를 받고 있습니다. 흰 사기꾼은 공격을 막거나 위협하는 사기꾼을 붙잡을 수 없으므로 왕은 길을 벗어나려고 노력해야합니다. 왕의 이동 옵션을 고려해 봅시다.
- c2 (I)-b3 (II)에서 감독에 의해 보호
- b2 (I)-기사 a2 (III)에 의해 보호
- c1 (II)-c1 (III)에서 루크에 의해 보호
- b1 (II)-b1 (III)에서 루크에 의해 보호
- c2 (II)-기사 a2 (III)에 의해 보호
- b2 (II)-감독 a1 (I)에 의해 감시
왕은 수표를 피할 수 없기 때문에 수표입니다!
n = 3,
[b#b,###,###],[###,###,RNR],[#q#,###,#K#]
출력 : false 설명 : 왕이 여왕으로부터 수표를 받고 있으며 탈출하거나 막을 움직임이 없습니다. 그러나 기사는 여왕을 붙잡을 수 있습니다.
n = 3,
[#q#,#b#,###],[n##,###,###],[#k#,###,#KB]
출력 : false 설명 : 화이트는 위협하는 여왕을 사로 잡거나 왕을 안전으로 옮기는 방법이 없습니다. 그러나 그의 감독을 b2 (II)로 옮기면 White는 여왕의 위협을 차단할 수 있습니다.
n = 4,
[####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]
출력 : true 설명 :이 경우 왕은 기사 중 하나와 여왕으로부터 점검을 받고 있습니다. White는 점검 항목 중 하나를 캡처 / 차단할 수 있지만 둘 다 캡처 / 차단할 수는 없습니다. 따라서 화잇은 왕을 체크 아웃하지 말아야하지만 선택의 여지가 없다.
n = 3,
[###,##b,r#r],[###,###,###],[#k#,###,#K#]
출력 : false 설명 : 흰색이 점검되지 않지만 점검하지 않고 이동하는 방법이 없습니다. 따라서 교묘 한 사람이지만 검열 관은 아닙니다.
출력 : true 설명 : 백인이 왕을 방어하기 위해 여왕과 대결하고 싶지만 기사가 길을 막고 있습니다.
출력 : true 설명 : 화이트는 기사와 함께 여왕을 데려 갈 수 없습니다. 루크가 화이트의 왕을 확인하기 때문입니다.
출력 : false 설명 : 흰색은 왕과 함께 여왕을 붙잡을 수 있습니다.
출력 : true 설명 : 이번에는 사기꾼이 지키고 있기 때문에 왕이 여왕을 붙잡을 수 없습니다.
출력 : false 설명 : 기사를 사로 잡으면 백인 왕이 탈출 할 수 있습니다.
cell.className = (i + j)%2 == 0 ? "black" : "white"
스 니펫에서 더 좋지 않을까요?