Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 打印所有可能的国际象棋骑士招式-JS_Javascript - Fatal编程技术网

Javascript 打印所有可能的国际象棋骑士招式-JS

Javascript 打印所有可能的国际象棋骑士招式-JS,javascript,Javascript,我有一个带有国际象棋骑士位置输入值的表单(例如D4)。单击“显示”后,系统应显示定义位置(例如C2 E2 F3 F5 E6 C6 B3 B5)的所有可能移动(坐标) let form=document.getElementById(“棋子骑士”) 让btn=document.getElementById(“按钮”) btn.addEventListener(“点击”,棋盘骑士) 函数棋子(单元格){ var可能坐标=[]; 变量xCoordinates=['A','B','C','D','E'

我有一个带有国际象棋骑士位置输入值的表单(例如D4)。单击“显示”后,系统应显示定义位置(例如C2 E2 F3 F5 E6 C6 B3 B5)的所有可能移动(坐标)

let form=document.getElementById(“棋子骑士”)
让btn=document.getElementById(“按钮”)
btn.addEventListener(“点击”,棋盘骑士)
函数棋子(单元格){
var可能坐标=[];
变量xCoordinates=['A','B','C','D','E','F','G','H'];
var cellX=xCoordinates.indexOf(cell[0])+1;
var cellY=parseInt(单元格[1]);
var cellXpositions=[cellX+2,cellX-2,cellX+1,cellX-
1.
].过滤器(功能(单元位置){
返回(cellPosition>0&&cellPosition<9);
})
var cellYpositions=[cellY+2,cellY-2,cellY+1,cellY-
1.
].过滤器(功能(单元位置){
返回(cellPosition>0&&cellPosition<9);
})
对于(var i=0;i


Show
您必须将
单元格
传递给函数,否则脚本无法读取单元格的属性

// your button calls the function without passing the cell
chessKnight() 

// but the function expects a cell
function chessKnight(cell) {
   console.log(cell)
}
您可以通过读取表单的值来修复它

HTML

更新

我添加了一个从输入字段获取行和列的函数。这是通过使用
fromCharCode
charCodeAt
将字母转换为数字,反之亦然

一旦将行和列作为数字,就可以进行计算。完成计算后,再次将数字转换回字母

在这个解决方案中,我有一系列可能的骑士招式(一个骑士通常有8个招式),但是你也可以用一个数学函数来解决这个问题

let form=document.getElementById(“棋子骑士”)
让knightBtn=document.getElementById(“按钮”)
让结果=document.getElementById(“结果”)
knightBtn.addEventListener(“单击”,显示可能移动)
函数showPossibleMoves(){
让单元格=form.value
//将字母转换成数字
设x=parseInt(cell.substring(0,1).charCodeAt()-64)
设y=parseInt(cell.substring(1,2))
让骑士移动=[
{x:2,y:-1},{x:2,y:1},{x:1,y:-2},{x:1,y:2},
{x:-2,y:-1},{x:-2,y:1},{x:-1,y:-2},{x:-1,y:2}
]
让possibleMoves=[]
for(让m的骑士动作){
设row=String.fromCharCode(x+m.x+64)
设列=y+m.y
可能移动。推送(行+“”+列)
}
log('可能的坐标:',可能的移动);
result.innerHTML=possibleMoves.toString()
}

骑士招式

您可以使用一个坐标系,其中一个位置由一个整数表示:行为3位,列为3位,每个前面加1位以检测溢出/下溢。所以一个位置用8位编码

它允许短代码:

功能棋子(pos){
pos=pos[1]-1+(“ABCDEFGH.indexOf(pos[0].toUpperCase())pos+i)//添加到当前位置
.filter(i=>!(i&0x88))//检测不足/溢出,即板外
.map(i=>“ABCDEFGH”[i>>4]+((i&7)+1));//转换为输出格式
}
//I/O处理:
const knight=document.getElementById(“chessKnight”);
const btn=document.getElementById(“按钮”);
const output=document.getElementById(“输出”);
btn.addEventListener(“单击”,()=>{
常量移动=棋子骑士(骑士值);
output.textContent=`${moves.length}可能的移动:${moves}`;
});

显示

类型错误:单元格未定义
。只要运行你自己的代码片段,你就有了答案。谢谢你的帮助!我按照你的建议编辑了代码,现在没有显示错误,但是也没有看到输出。这是因为表单字段中的
C4
只是一个字符串,所以不能使用
cell[0]
cell[1]
将C和4与
C4
分开。相反,您可以使用
cell.substring(0,1)
cell.substring(1,2)
来获取这些值。
<input id="chessKnight" type="text">
<button id="button">Show</button>    
let form = document.getElementById("chessKnight")
let btn = document.getElementById("button")
btn.addEventListener("click", chessKnight)

function chessKnight() {
   var cell = form.value
   console.log(cell)
}