Birinin şaşırtıcı kararını savunmak için insanlar genellikle o kişinin herkesin başına geçtiğini ve “3 boyutlu satranç” oynadığını söyler. Şimdi 3 boyutlu satranç oynama şansın!
kurallar
3D Satranç'ın birçok çeşidi var , ama bu meydan okuma için kendimi uydurdum. Benim versiyonum da normal satranç taşları gibidir, ancak parçalar kareler yerine küplerin içindedir ve artık ek bir hareket boyutu vardır. Orada bu meydan basit hale getirmek için hiçbir piyonlar ve Rok .
Parça Hareketi
(Pusula yönleri, standart bir satranç tahtasında gerçekleşecek hareketi, Yukarı ve Aşağı 3D satranç tahtasında dikey olarak hareket etmeyi belirtir).
- King - verilen bir dönüşte gidebileceği 26 kareye sahip: N, NE, E, SE, S, SW, W, NW; yanı sıra yukarı, aşağı ve yukarı / aşağı + pusula yönlerinden birini.
- Kraliçe - Kral ile aynı yönde hareket edebilir, ancak istediği kadarıyla bu yönde hareket edebilir.
- Kale - 6 yönde hareket edebilir: N, E, S, W, Yukarı ve Aşağı,
- Piskopos - 8 üçgensel hareket yönü var: NE + Yukarı / Aşağı, SE + Yukarı / Aşağı, SW + Yukarı / Aşağı, NW + Yukarı / Aşağı
- Şövalye - bir eksende 2 boşluk, ardından bir boşlukta 1 boşluk. Tıpkı normal satranç taşları gibi, şövalye diğer parçalara atlayabilecek tek parça.
Parça Test Cihazı
Farklı parçaların 3B panosunda nasıl hareket ettiğini görmek için bu pasajı kullanın ( ipucu : *Test
bir karenin geçerli bir hareket olup olmadığını belirlemek için JS'deki fonksiyonlara hızlıca bakın.
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>
Meydan okuma
Bir n x n x n levha verildiğinde , beyaz kralın eş arkadaşı olup olmadığını belirleyin.
Giriş
- (İsteğe bağlı) n ≥ 2 - tahta boyutu
- Oyun tahtası
- 1d - 2d veya 3d dizi veya benzeri bir formatta olabilir. Gösterim, herhangi bir basit biçimde olabilir. Örneğin, boş küpler için # ile KQRBN (Beyaz) ve kqrbn (Siyah). Veya farklı değerler için sayılar kullanın.
- 3D satranç tahtasını, üst üste yığılmış ve yukarıdan aşağıya doğru listelenmiş çoklu panolar olarak düşünün. Daha sonra, her bir tahta soldan sağa, arkadan öne (Siyah taraftan Beyaz tarafa) not edilir.
- 3B dizi olarak verilen bu 2x2x2 vakasını hayal edin:
[ [[Bq] [##]] [[Bn] [KQ]] ]
Çıktı
- boolean (truthy / falsy value) - beyaz kralın eş arkadaşı olması durumunda doğru, aksi takdirde yanlış.
Şah Mat
Beyaz kral, bir siyah parçanın bir sonraki dönüşünde onu ele geçirme tehdidi altında olup olmadığını kontrol ediyor. Kontrolden çıkmak için White'ın kralı güvenliğe götürmesi, başka bir taşla savunması veya tehdit edici parçayı ele geçirmesi gerekiyor. White'ın kontrolden çıkmanın bir yolu yoksa, o zaman beyaz kral eşdedir . Unutmayın, Beyaz kontrol altında değilse de kontrol edilmeden hareket edemiyorsa , bu bir kontrol arkadaşı olmayan bir çıkmazdır .
Şartname
- Kara kralın beyaz kralı "kontrol etmeye" çalıştığı bir tahta veya her iki kralın da kontrol altında olduğu bir tahta (imkansız senaryolar) verilmez.
Test Kılıfları
n = 3,
[###,n##,#rr],[#b#,###,###],[###,###,bRK]
Çıktı: doğru
Açıklama: Kral, üst kattaki kaleden bir çek alıyor. Beyaz kale saldırıyı engelleyemiyor veya tehdit edici rotayı yakalayamıyor, bu yüzden kral yoldan çekilmeye çalışmalı. Kralın hareket seçeneklerini düşünelim:
- c2 (I) - b3 (II) 'de piskopos tarafından korunmaktadır
- b2 (I) - a2 (III) 'deki şövalye tarafından korunan
- c1 (II) - c1 (III) deki kale tarafından korunmaktadır
- b1 (II) - b1 (III) deki kale tarafından korunmaktadır
- c2 (II) - a2 (III) de şövalye tarafından korunmaktadır
- b2 (II) - a1 (I) 'de piskopos tarafından korunan
Kral çeklerden kaçamayacağından, bu bir çek arkadaşı!
n = 3,
[b#b,###,###],[###,###,RNR],[#q#,###,#K#]
Çıktı: yanlış Açıklama: Kral kraliçeden bir çek alıyor ve kaçmak veya engellemek için hamle yapmıyor. Ancak, şövalye kraliçeyi ele geçirebilir.
n = 3,
[#q#,#b#,###],[n##,###,###],[#k#,###,#KB]
Çıktı: yanlış Açıklama: Beyaz, tehdit altındaki kraliçeyi ele geçirme veya kralı güvenli hale getirme yoluna sahip değildir. Ancak, piskoposunu b2'ye (II) getirerek, Beyaz kraliçenin tehdidini engelleyebilir.
n = 4,
[####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]
Çıktı: doğru Açıklama: Bu durumda kral, şövalyelerden birinden ve bir kraliçeden bir çek alıyor. Beyaz kontrol parçalarından birini yakalayabilse / engelleyebilse de, ikisini birden yakalayamaz / engelleyemez. Bu nedenle, Beyaz kralını kontrolden çıkarmaya çalışmalı, ancak başka seçeneği yok.
n = 3,
[###,##b,r#r],[###,###,###],[#k#,###,#K#]
Çıktı: yanlış Açıklama: Beyaz kontrol altında değil, kontrol edilmeden hareket etmenin bir yolu yok. Bu nedenle, bir çıkmaz, ancak bir çek arkadaşı değil.
Çıktı: doğru Açıklama: Beyaz, kralını savunmak için kraliçesi ile dokunmak istiyor, ancak şövalyesi yolu tıkıyor.
Çıktı: doğru Açıklama: Beyaz, şövalyeyle kraliçeyi alamaz, çünkü o zaman kale Beyazın kralını kontrol eder.
Çıktı: yanlış Açıklama: Beyaz kraliçeyi kralıyla birlikte yakalayabilir.
Çıktı: doğru Açıklama: Bu sefer kale koruyor, böylece kral kraliçeyi ele geçiremiyor.
Çıktı: yanlış Açıklama: Beyaz kral şövalyeyi ele geçirerek kaçabilir.
cell.className = (i + j)%2 == 0 ? "black" : "white"
pasajda daha iyi olmaz mıydı ?