JavaScript中的机器人模拟器
全部, 我正在尝试用JS编写一个简单的解决方案 我有一个程序,目前打印出一个简单模拟的方向。但我想做的是在循环时嵌入x和y坐标 例如:JavaScript中的机器人模拟器,javascript,for-loop,Javascript,For Loop,全部, 我正在尝试用JS编写一个简单的解决方案 我有一个程序,目前打印出一个简单模拟的方向。但我想做的是在循环时嵌入x和y坐标 例如: 例如,我有一个类似“LLRAA”的字符串代码。这就是它的意思,以{x,y}={0,0}开始面向“北”的索引。所以在循环中,当我看到L:Move Left=West和第二个字符时,L是Left:Move to South,看到R=Move Right=West。现在在西边,如果它看到A,它意味着将x坐标减少1,所以坐标将是{-1,0},并且仍然在西边。对于下一次
功能机器人模拟器(param){
设计数器=0;
设d=“”;
设x=0;
设y=0;
//也可以使用此工具查看轴承的方向是顺时针移动还是逆时针移动
for(设i=0;i0){
如果(计数器%4==0){
d=“北方”;
}
否则如果(计数器%4==1){
d=“东”;
}
否则如果(计数器%4==2){
d=“南方”;
}
否则如果(计数器%4==3){
d=“西部”;
}
}
//如果计数为负数,则表示方向为逆时针方向
如果(计数器<0){
如果(计数器%4==0)
d=“北方”;
否则如果(计数器%4==-1)
d=“西部”;
否则如果(计数器%4==-2)
d=“南方”;
否则如果(计数器%4==-3)
d=“东”;
}
}
返回d;
返回(“x:+x+”y:+y);
}
日志(机器人模拟器(“RRLLL”)代码>请检查这是否适用于您:-
function robotSimulator(param) {
let counter = 0;
let d = "";
let x = 0;
let y = 0;
//Using this too see if the direction for the bearing is a clockwise movement or anticlockwise one
for (let i = 0; i < param.length; i++) {
if (param[0] == "\n") {
return null;
}
else if (param[i] == 'L') {
counter--;
}
else if (param[i] == 'R') {
counter++;
}
else if (param[i] == 'A') {
x--;
}
//If count is positive, then it means it is moving clockwise direction
if (counter > 0) {
if (counter % 4 == 0) {
d = "North";
}
else if (counter % 4 == 1) {
d = "East";
}
else if (counter % 4 == 2) {
d = "South";
}
else if (counter % 4 == 3) {
d = "West";
}
}
//If count is negative that means the direction is anticlockwise
if (counter < 0) {
if (counter % 4 == 0)
d = "North";
else if (counter % 4 == -1)
d = "West";
else if (counter % 4 == -2)
d = "South";
else if (counter % 4 == -3)
d = "East";
}
}
return `{x: ${x}, y: ${y}, bearing: ${d}}`
}
console.log(robotSimulator("LLRAA"));
功能机器人模拟器(param){
设计数器=0;
设d=“”;
设x=0;
设y=0;
//也可以使用此工具查看轴承的方向是顺时针移动还是逆时针移动
for(设i=0;i0){
如果(计数器%4==0){
d=“北方”;
}
否则如果(计数器%4==1){
d=“东”;
}
否则如果(计数器%4==2){
d=“南方”;
}
否则如果(计数器%4==3){
d=“西部”;
}
}
//如果计数为负数,则表示方向为逆时针方向
如果(计数器<0){
如果(计数器%4==0)
d=“北方”;
否则如果(计数器%4==-1)
d=“西部”;
否则如果(计数器%4==-2)
d=“南方”;
否则如果(计数器%4==-3)
d=“东”;
}
}
返回`{x:${x},y:${y},方向角:${d}`
}
日志(机器人模拟器(“LLRAA”);
我建议将机器人的运动与其规则解耦。
具体来说,您可以定义对象中的规则(对状态转换进行编码),即给定一些指令时机器人的状态如何变化。
for循环部分(在这里,我使用Array.prototype.reduce
来累积最终的robot状态)可以保留下来,用于迭代字符串中的每条指令并计算robot的新状态
IMO通过将状态转换逻辑放在一个单独的对象中,当/如果您希望您的机器人支持新指令时,可以更容易地进行重构
功能机器人模拟器(param){
if(param.length==0 | | param[0]==“\n”){
返回null;
}
//每个方向都有一个名称,还定义了如何移动。
常量方向=[
{name:“North”,move:({x,y})=>({x,y:y-1}),
{名称:“东”,移动:({x,y})=>({x:x+1,y}),
{name:“South”,move:({x,y})=>({x,y:y+1}),
{name:“West”,move:({x,y})=>({x:x-1,y}),
];
const numDirections=directions.length;
//标准化方向(`counter`在示例中使用负索引。
常量normaliseDirection=(d)=>d>=0
?d%个方向
:numDirections-Math.abs(d%numDirections);
//每个命令都映射到更新当前状态的函数。
//state是x,y(位置)和方向的对象(在您的示例中为'counter'。
//在为机器人添加更多说明时,可以更新此对象
//根据需要。
常量applyMove={
“L”:({x,y,d})=>({x,y,d:normaliseDirection(d-1)}),
“R”:({x,y,d})=>({x,y,d:normaliseDirection(d+1)}),
“A”:({x,y,d})=>{
常量{x:newX,y:newY}=方向[d]。移动({x,y});
返回{x:newX,y:newY,d:normaliseDirection(d)};
},
};
//循环执行每条指令,使用“applyMove”更新状态,
//并返回更新状态。
常量初始状态={
x:0,y:0,d:0,
};
const finalState=Array.from(param).reduce((currState,action)=>{
如果(!(应用移动中的操作)){
//处理错误
抛出新错误(`Unknown action:'${action}``);
}
返回applyMove[动作](当前状态);
},初始状态);
常数