JavaScript中的机器人模拟器

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},并且仍然在西边。对于下一次

全部,

我正在尝试用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},并且仍然在西边。对于下一次迭代,将x减少-1,因此它将为{-2,0}
  • 所以最终的输出是{“x:”+x+“y:”+“方位:”+d}={x:-2,y:0,方位:West}

    下面是我的测试代码:

    功能机器人模拟器(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[动作](当前状态);
    },初始状态);
    常数