Javascript 打印所有可能的国际象棋骑士招式-JS
我有一个带有国际象棋骑士位置输入值的表单(例如D4)。单击“显示”后,系统应显示定义位置(例如C2 E2 F3 F5 E6 C6 B3 B5)的所有可能移动(坐标)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'
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)
}