เพื่อปกป้องการตัดสินใจของใครบางคนที่ทำให้งงงันคนมักจะพูดว่าคนคนนั้นจะไปหัวของทุกคนและเล่น "หมากรุกสามมิติ" ตอนนี้เป็นโอกาสของคุณที่จะเล่นหมากรุกสามมิติ!
กฎระเบียบ
มีหมากรุก 3 มิติหลายแบบแต่สำหรับความท้าทายนี้ฉันได้ทำขึ้นมาเอง เวอร์ชันของฉันเหมือนกับหมากรุกทั่วไปยกเว้นชิ้นส่วนนั้นอยู่ภายในลูกบาศก์แทนที่จะเป็นสี่เหลี่ยมจัตุรัสและตอนนี้มีมิติของการเคลื่อนไหวเพิ่มเติม ที่จะทำให้ความท้าทายนี้ง่ายมีไม่มีเบี้ยและไม่มี castling
การเคลื่อนไหวของชิ้น
(ทิศทางเข็มทิศหมายถึงการเคลื่อนไหวที่จะเกิดขึ้นบนกระดานหมากรุกมาตรฐานขึ้นและลงหมายถึงการเคลื่อนที่ในแนวตั้งบนกระดานหมากรุก 3 มิติ)
- King - มี 26 สี่เหลี่ยมซึ่งสามารถไปในเทิร์นที่กำหนด: N, NE, E, SE, S, SW, W, NW; เช่นเดียวกับขึ้นลงและขึ้น / ลง + หนึ่งในทิศทางเข็มทิศ
- Queen - สามารถไปในทิศทางเดียวกับ King แต่เท่าที่เธอต้องการในทิศทางนั้น
- Rook - สามารถเคลื่อนที่ได้ 6 ทิศทาง: N, E, S, W, ขึ้นและลง
- บิชอป - มีทิศทางการท่องเที่ยว 8 ทิศทาง: NE + ขึ้น / ลง, SE + ขึ้น / ลง, SW + ขึ้น / ลง, NW + ขึ้น / ลง
- Knight - ย้าย 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 (White) และ kqrbn (Black) ที่มี # สำหรับคิวบ์เปล่า หรือใช้ตัวเลขสำหรับค่าต่าง ๆ
- ลองนึกถึงกระดานหมากรุกสามมิติโดยมีกระดานหลายกระดานเรียงซ้อนกันและเรียงลำดับจากบนลงล่าง จากนั้นแต่ละบอร์ดจะได้รับการจดบันทึกจากซ้ายไปขวากลับไปข้างหน้า (ด้านดำถึงด้านขาว)
- ลองนึกภาพกรณี 2x2x2 ที่กำหนดเป็นอาร์เรย์ 3D:
[ [[BQ] [##]] [[BN] [KQ]] ]
เอาท์พุต
- บูลีน (ความจริง / ค่าเท็จ) - จริงถ้ากษัตริย์สีขาวอยู่ในรุกฆาตเป็นเท็จอย่างอื่น
รุกฆาต
ราชาขาวกำลังตรวจสอบว่าชิ้นส่วนสีดำขู่ว่าจะจับมันในเทิร์นถัดไปของแบล็ก ในการออกไปข้างนอกไวท์ต้องย้ายกษัตริย์ของเขาเพื่อความปลอดภัยปกป้องมันด้วยชิ้นส่วนอื่นหรือจับชิ้นส่วนที่คุกคาม ถ้าสีขาวมีวิธีการที่จะได้รับจากการตรวจสอบไม่มีแล้วกษัตริย์สีขาวอยู่ในรุกฆาต โปรดจำไว้ว่าถ้า White ไม่ได้อยู่ในการตรวจสอบ แต่ไม่สามารถเคลื่อนย้ายโดยไม่ได้รับการตรวจสอบแล้วมันเป็นทางตันซึ่งไม่ใช่การรุกฆาต
สเปค
- คุณจะไม่ได้รับบอร์ดที่กษัตริย์สีดำพยายามที่จะ "ตรวจสอบ" ราชาสีขาวหรือกระดานที่กษัตริย์ทั้งสองอยู่ในการตรวจสอบ (สถานการณ์ที่เป็นไปไม่ได้)
กรณีทดสอบ
n = 3
[###,n##,#rr],[#b#,###,###],[###,###,bRK]
ผลลัพธ์: จริง
คำอธิบาย: กษัตริย์กำลังได้รับเช็คจากคนโกงที่ชั้นบนสุด โกงสีขาวไม่สามารถปิดกั้นการโจมตีหรือจับโกงที่คุกคามดังนั้นกษัตริย์จะต้องพยายามที่จะย้ายออกจากทาง ลองพิจารณาตัวเลือกการย้ายของกษัตริย์:
- c2 (I) - ได้รับการคุ้มกันโดยบาทหลวงที่ b3 (II)
- b2 (I) - ได้รับการปกป้องโดยอัศวินที่ a2 (III)
- c1 (II) - ปกป้องโดย rook ที่ c1 (III)
- b1 (II) - เตรียมพร้อมโดย rook ที่ b1 (III)
- c2 (II) - ได้รับการปกป้องโดยอัศวินที่ a2 (III)
- b2 (II) - ปกป้องโดยอธิการที่ a1 (I)
เนื่องจากกษัตริย์ไม่สามารถหลบหนีการตรวจสอบมันเป็นรุกฆาต!
n = 3
[b#b,###,###],[###,###,RNR],[#q#,###,#K#]
เอาท์พุท: คำอธิบายที่ผิด : กษัตริย์ได้รับเช็คจากราชินีและไม่มีท่าใดที่จะหลบหนีหรือขวางกั้นได้ อย่างไรก็ตามอัศวินสามารถจับราชินีได้
n = 3
[#q#,#b#,###],[n##,###,###],[#k#,###,#KB]
เอาท์พุท: คำอธิบายที่ผิด : สีขาวไม่มีทางที่จะจับราชินีที่คุกคามหรือย้ายกษัตริย์ของเขาไปสู่ความปลอดภัย อย่างไรก็ตามโดยการย้ายอธิการของเขาไปที่ b2 (II) White สามารถสกัดกั้นการคุกคามของราชินีได้
n = 4,
[####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]
เอาท์พุท: จริงคำอธิบาย: ในกรณีนี้กษัตริย์ได้รับเช็คจากหนึ่งในอัศวินและราชินี แม้ว่า White สามารถจับ / บล็อกหนึ่งในส่วนการตรวจสอบได้ แต่เขาไม่สามารถจับ / บล็อกทั้งสองอย่างได้ ดังนั้นไวท์ต้องพยายามย้ายกษัตริย์ออกจากเช็ค แต่เขาไม่มีทางเลือก
n = 3
[###,##b,r#r],[###,###,###],[#k#,###,#K#]
เอาท์พุท: เท็จคำอธิบาย: สีขาวไม่ได้อยู่ในการตรวจสอบ แต่มีวิธีการเคลื่อนย้ายโดยไม่ได้รับการตรวจสอบ ดังนั้นจึงเป็นทางตัน แต่ไม่ใช่รุกฆาต
เอาท์พุท: คำอธิบายที่แท้จริง : สีขาวต้องการที่จะโฉบเฉี่ยวกับราชินีของเขาเพื่อปกป้องกษัตริย์ของเขา แต่อัศวินของเขากำลังปิดกั้นเส้นทาง
เอาท์พุท: คำอธิบายที่แท้จริง : สีขาวไม่สามารถนำราชินีกับอัศวินของเขาเพราะแล้วโกงจะตรวจสอบกษัตริย์ของไวท์
เอาท์พุท: เท็จคำอธิบาย: สีขาวสามารถจับราชินีกับกษัตริย์
เอาท์พุท: คำอธิบายที่แท้จริง : คราวนี้เกมโกงกำลังปกป้องดังนั้นกษัตริย์ไม่สามารถจับราชินีได้
เอาท์พุท: เท็จคำอธิบาย: กษัตริย์สีขาวสามารถหลบหนีได้โดยการจับอัศวิน
cell.className = (i + j)%2 == 0 ? "black" : "white"
ดีกว่าในตัวอย่างหรือไม่