Để bảo vệ quyết định khó hiểu của ai đó, mọi người thường nói rằng người đó đang vượt qua đầu mọi người và chơi cờ vua 3 chiều. Bây giờ là cơ hội của bạn để chơi cờ 3 chiều!
Quy tắc
Có nhiều biến thể của Cờ vua 3D , nhưng đối với thử thách này, tôi đã tự tạo ra. Phiên bản của tôi giống như cờ vua thông thường ngoại trừ các quân cờ nằm trong các hình khối thay vì hình vuông, và bây giờ có thêm một chiều chuyển động. Để làm cho thử thách này đơn giản, không có con tốt và không có lâu đài .
Phong trào mảnh
(Hướng la bàn đề cập đến chuyển động sẽ xảy ra trên bàn cờ tiêu chuẩn, Lên và Xuống đề cập đến việc di chuyển theo chiều dọc trên bàn cờ 3D).
- King - có 26 ô vuông có thể đi vào một lượt cho trước: N, NE, E, SE, S, SW, W, NW; cũng như lên, xuống và lên / xuống + một trong các hướng la bàn.
- Nữ hoàng - có thể di chuyển cùng hướng với Nhà vua, nhưng theo như những gì cô ấy muốn theo những hướng đó.
- Rook - có thể di chuyển theo 6 hướng: N, E, S, W, Up và Down,
- Giám mục - có 8 hướng đi ba chiều: NE + Lên / Xuống, SE + Lên / Xuống, SW + Lên / Xuống, Tây Bắc + Lên / Xuống
- Hiệp sĩ - di chuyển 2 không gian một trục, sau đó 1 không gian trên một không gian khác. Cũng giống như cờ vua thông thường, hiệp sĩ là quân cờ duy nhất có thể nhảy qua các quân cờ khác.
Kiểm tra mảnh
Sử dụng đoạn mã này để xem cách các mảnh khác nhau di chuyển trên bảng 3D ( mẹo : kiểm tra các *Test
chức năng trong JS để biết cách nhanh chóng để xác định xem hình vuông có phải là di chuyển hợp lệ hay không, chỉ đơn giản dựa trên khoảng cách tuyệt đối của nó so với mảnh.):
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>
Thử thách
Đưa ra một bảng n x n x n , xác định xem vua trắng có ở trong tướng không.
Đầu vào
- (Tùy chọn) n 2 - kích thước của bảng
- Ban trò chơi
- Có thể ở dạng 1d- 2d- hoặc 3d- hoặc định dạng tương tự khác. Ký hiệu có thể ở bất kỳ định dạng đơn giản. Ví dụ: KQRBN (Trắng) và kqrbn (Đen) với # cho các hình khối trống. Hoặc, sử dụng số cho các giá trị khác nhau.
- Hãy nghĩ về bàn cờ 3D khi nhiều bàn xếp chồng lên nhau và được liệt kê từ trên xuống dưới. Sau đó, mỗi bảng riêng lẻ được ký hiệu từ trái sang phải, trở lại mặt trước (Mặt đen sang Mặt trắng).
- Hãy tưởng tượng trường hợp 2x2x2 này được đưa ra dưới dạng mảng 3D:
[ [[bq] [##]] [[bn] [KQ]] ]
Bảng "trên cùng": bảng "dưới cùng":
Đầu ra
- boolean (giá trị trung thực / giả) - đúng nếu vua trắng ở trong checkmate, sai khác.
Chiếu tướng
Vua trắng đang kiểm tra xem một mảnh đen có đe dọa bắt nó trong lượt tiếp theo của Đen không. Để thoát khỏi tầm kiểm soát, White cần phải di chuyển vị vua của mình đến nơi an toàn, bảo vệ nó bằng một mảnh khác hoặc bắt giữ mảnh đe dọa. Nếu Trắng không có cách nào thoát khỏi kiểm tra, thì vua trắng đang ở trong tù . Hãy nhớ rằng, nếu Trắng không kiểm tra, nhưng không thể di chuyển mà không kiểm tra, thì đó là một sự bế tắc , không phải là một người kiểm tra.
Đặc điểm kỹ thuật
- Bạn sẽ không được trao một bảng mà vua đen đang cố gắng "kiểm tra" vua trắng, hoặc một bảng nơi cả hai vị vua đang kiểm tra (kịch bản không thể).
Các trường hợp thử nghiệm
n = 3,
[###,n##,#rr],[#b#,###,###],[###,###,bRK]
Đầu ra: đúng
Giải thích: Nhà vua đang nhận được một tấm séc từ tân binh trên tầng cao nhất. Các tân binh trắng không thể chặn cuộc tấn công hoặc bắt giữ các tân binh đe dọa, vì vậy nhà vua phải cố gắng di chuyển ra khỏi đường. Hãy xem xét các lựa chọn di chuyển của nhà vua:
- c2 (I) - được giám mục bảo vệ tại b3 (II)
- b2 (I) - được bảo vệ bởi hiệp sĩ tại a2 (III)
- c1 (II) - được bảo vệ bởi tân binh tại c1 (III)
- b1 (II) - được bảo vệ bởi tân binh tại b1 (III)
- c2 (II) - được bảo vệ bởi hiệp sĩ tại a2 (III)
- b2 (II) - được giám mục bảo vệ tại a1 (I)
Vì nhà vua không thể thoát khỏi kiểm tra, đó là một người kiểm tra!
n = 3,
[b#b,###,###],[###,###,RNR],[#q#,###,#K#]
Đầu ra: sai Giải thích: Nhà vua đang nhận được một tấm séc từ nữ hoàng, và không có động thái nào để trốn thoát hay chặn lại. Tuy nhiên, hiệp sĩ có thể bắt được nữ hoàng.
n = 3,
[#q#,#b#,###],[n##,###,###],[#k#,###,#KB]
Đầu ra: sai Giải thích: White không có cách nào bắt được nữ hoàng đang đe dọa hoặc chuyển vị vua của mình đến nơi an toàn. Tuy nhiên, bằng cách chuyển giám mục của mình sang b2 (II), White có thể ngăn chặn mối đe dọa của nữ hoàng.
n = 4,
[####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]
Đầu ra: đúng Giải thích: Trong trường hợp này, nhà vua đang nhận được một tấm séc từ một trong các hiệp sĩ và một nữ hoàng. Mặc dù Trắng có thể chụp / chặn một trong các mảnh kiểm tra, anh ta không thể chụp / chặn cả hai. Do đó, White phải cố gắng di chuyển vị vua của mình ra khỏi tầm kiểm soát, nhưng anh ta không có lựa chọn nào khác.
n = 3,
[###,##b,r#r],[###,###,###],[#k#,###,#K#]
Đầu ra: sai Giải thích: Màu trắng không nằm trong kiểm tra, nhưng không có cách nào di chuyển mà không được kiểm tra. Do đó, nó là một bế tắc, nhưng không phải là một người kiểm tra.
Đầu ra: đúng Giải thích: White muốn tham gia cùng với nữ hoàng của mình để bảo vệ vị vua của mình, nhưng hiệp sĩ của anh ta đang chặn đường.
Kết quả: đúng Giải thích: Trắng không thể đưa nữ hoàng đi theo hiệp sĩ của mình, bởi vì sau đó, tân binh sẽ kiểm tra vua của White.
Kết quả: sai Giải thích: Trắng có thể bắt nữ hoàng cùng với vua của mình.
Đầu ra: đúng Giải thích: Lần này tân binh đang canh gác, nên nhà vua không thể bắt được nữ hoàng.
Đầu ra: sai Giải thích: Vua trắng có thể trốn thoát bằng cách bắt các hiệp sĩ.
cell.className = (i + j)%2 == 0 ? "black" : "white"
tốt hơn trong đoạn trích?