किसी के चौंकाने वाले फैसले का बचाव करने के लिए, लोग अक्सर कहते हैं कि वह व्यक्ति हर किसी के सिर पर जा रहा है और "3-आयामी शतरंज" खेल रहा है। अब यह 3-आयामी शतरंज खेलने का मौका है!
नियम
3 डी शतरंज के कई संस्करण हैं , लेकिन इस चुनौती के लिए मैंने अपना खुद का बनाया है। मेरा संस्करण नियमित शतरंज की तरह है सिवाय इसके कि टुकड़े वर्गों के बजाय क्यूब्स के अंदर हैं, और अब आंदोलन का एक अतिरिक्त आयाम है। इस चुनौती को सरल बनाने के लिए कोई पंजे नहीं हैं और न ही कोई कास्टिंग है ।
टुकड़ा आंदोलन
(कम्पास दिशाएँ उस गति को संदर्भित करती हैं जो एक मानक शतरंजबोर्ड पर होती है, ऊपर और नीचे 3D शतरंज बोर्ड पर लंबवत चलने का संदर्भ देती है)।
- राजा - के पास 26 वर्ग हैं जो किसी दिए गए मोड़ पर जा सकते हैं: एन, एनई, ई, एसई, एस, एसडब्ल्यू, डब्ल्यू, एनडब्ल्यू; कम्पास दिशाओं में से एक के रूप में अच्छी तरह से ऊपर, नीचे, और ऊपर / नीचे +।
- रानी - राजा के रूप में एक ही दिशा में आगे बढ़ सकती है, लेकिन जहां तक वह उन दिशाओं में चाहती है।
- Rook - 6 दिशाओं में आगे बढ़ सकता है: N, E, S, W, Up, और Down,
- बिशप - यात्रा की 8 त्रिकोणीय दिशाएं हैं: NE + ऊपर / नीचे, SE + ऊपर / नीचे, SW + ऊपर / नीचे, NW + ऊपर / नीचे
- नाइट - 2 स्थानों को एक अक्ष पर ले जाता है, फिर दूसरे पर 1 स्थान। नियमित शतरंज की तरह, नाइट एकमात्र ऐसा टुकड़ा है जो अन्य टुकड़ों पर आशा कर सकता है।
टुकड़ा परीक्षक
इस स्निपेट का उपयोग करके देखें कि 3 डी बोर्ड पर अलग-अलग टुकड़े कैसे चलते हैं ( टिप : *Test
जेएस में कार्यों को त्वरित तरीके से यह निर्धारित करने के लिए जांचें कि क्या एक वर्ग एक वैध चाल है, बस टुकड़े से इसकी पूर्ण दूरी पर आधारित है।)।
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 (काला)। या, विभिन्न मूल्यों के लिए संख्याओं का उपयोग करें।
- 3 डी शतरंज बोर्ड के बारे में सोचें क्योंकि कई बोर्ड एक-दूसरे के ऊपर ढेर हो गए हैं और ऊपर से नीचे तक सूचीबद्ध हैं। फिर, प्रत्येक अलग-अलग बोर्ड को बाएं से दाएं, पीछे से सामने (ब्लैक साइड से व्हाइट साइड) तक नोट किया गया है।
- 3D सरणी के रूप में दिए गए इस 2x2x2 मामले की कल्पना करें:
[ [[BQ] [##]] [[Bn] [KQ]] ]
उत्पादन
- बूलियन (सत्य / झूठे मूल्य) - सच है अगर सफेद राजा चेकमेट में है, तो झूठे अन्यथा।
शह और मात
सफेद राजा जांच में है कि क्या एक काला टुकड़ा ब्लैक के अगले मोड़ पर कब्जा करने की धमकी देता है। चेक से बाहर निकलने के लिए, व्हाइट को अपने राजा को सुरक्षा के लिए स्थानांतरित करने की आवश्यकता है, इसे दूसरे टुकड़े से बचाव करें, या धमकी देने वाले टुकड़े को पकड़ें। यदि व्हाइट के पास चेक से बाहर निकलने का कोई रास्ता नहीं है, तो व्हाइट किंग चेकमेट में है । याद रखें, यदि व्हाइट जांच में नहीं है, लेकिन जांच में शामिल हुए बिना नहीं चल सकता है, तो यह एक गतिरोध है , जो एक चेकमेट नहीं है।
विशिष्टता
- आपको एक बोर्ड नहीं दिया जाएगा, जहां काला राजा सफेद राजा, या एक बोर्ड की कोशिश कर रहा है, जहां दोनों राजा चेक (असंभव परिदृश्य) में हैं।
परीक्षण के मामलों
n = 3,
[###,n##,#rr],[#b#,###,###],[###,###,bRK]
आउटपुट: सच
स्पष्टीकरण: राजा को शीर्ष तल पर किश्ती से एक चेक प्राप्त हो रहा है। सफेद बदमाश हमले को रोकने या धमकी देने वाले बदमाश को पकड़ने में असमर्थ है, इसलिए राजा को रास्ते से हटने की कोशिश करनी चाहिए। आइए राजा के कदम विकल्पों पर विचार करें:
- c2 (I) - b3 पर बिशप द्वारा संरक्षित (II)
- b2 (I) - a2 (III) में नाइट द्वारा संरक्षित
- c1 (II) - c1 (III) में बदमाश द्वारा पहरा
- बी 1 (II) - बी 1 (तृतीय) में बदमाश द्वारा संरक्षित
- c2 (II) - a2 (III) में नाइट द्वारा संरक्षित
- b2 (II) - a1 (I) में बिशप द्वारा संरक्षित
चूँकि राजा चेक से बच नहीं सकता, इसलिए वह एक चेकमेट है!
n = 3,
[b#b,###,###],[###,###,RNR],[#q#,###,#K#]
आउटपुट: झूठी व्याख्या: राजा रानी से एक चेक प्राप्त कर रहा है, और उसके पास भागने या ब्लॉक करने के लिए कोई कदम नहीं है। हालांकि, नाइट रानी को पकड़ सकती है।
n = 3,
[#q#,#b#,###],[n##,###,###],[#k#,###,#KB]
आउटपुट: झूठी व्याख्या: व्हाइट में धमकी देने वाली रानी को पकड़ने या अपने राजा को सुरक्षा में ले जाने का कोई तरीका नहीं है। हालाँकि, अपने बिशप को b2 (II) में ले जाकर, व्हाइट रानी के खतरे को रोक सकता है।
एन = 4,
[####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]
आउटपुट: सच स्पष्टीकरण: इस मामले में राजा को शूरवीरों और एक रानी से एक चेक प्राप्त हो रहा है। भले ही व्हाइट चेकिंग टुकड़ों में से किसी एक को कैप्चर / ब्लॉक कर सकता है, वह दोनों को कैप्चर / ब्लॉक नहीं कर सकता है। इसलिए, व्हाइट को अपने राजा को जांच से बाहर करने की कोशिश करनी चाहिए, लेकिन उसके पास कोई विकल्प नहीं है।
n = 3,
[###,##b,r#r],[###,###,###],[#k#,###,#K#]
आउटपुट: गलत स्पष्टीकरण: व्हाइट चेक में नहीं है, लेकिन चेक में आए बिना हिलने का कोई तरीका नहीं है। इसलिए, यह एक गतिरोध है, लेकिन एक चेकमेट नहीं है।
आउटपुट: सच स्पष्टीकरण: व्हाइट अपने राजा का बचाव करने के लिए अपनी रानी के साथ झपट्टा मारना चाहेगा, लेकिन उसका शूरवीर रास्ता रोक रहा है।
आउटपुट: सच स्पष्टीकरण: श्वेत रानी को अपने शूरवीर के साथ नहीं ले जा सकते, क्योंकि तब बदमाश श्वेत राजा की जाँच करेंगे।
आउटपुट: झूठी व्याख्या: सफेद रानी अपने राजा के साथ कब्जा कर सकती है।
आउटपुट: सच स्पष्टीकरण: इस बार बदमाश रखवाली कर रहा है, इसलिए राजा रानी को नहीं पकड़ सकता।
आउटपुट: झूठी व्याख्या: श्वेत राजा शूरवीर को पकड़ने से बच सकता है।
cell.className = (i + j)%2 == 0 ? "black" : "white"
स्निपेट में बेहतर नहीं होगा ?