邮件机器人

邮件机器人

​ 邮件递送机器人,取件和投递包裹。机器人将在村庄周围移动。各个地方都有包裹,每个包裹都寄往其他地方。机器人在包裹到达目的地时捡起包裹,并在到达目的地时交付包裹。

我们可以按照类似的方式来创建一个描述地图的对象 villageGraph:

const villageGraph = {
A['P','C','T','B']B['A','T']C:['A','B'],
D:['E','T'],
E:['G','D'],
F:['G','H'],
G:['S','F','E'],
H:['P','T','S'],
S:['G','T','H'],
T:['S','D','B','A'],
P:['H','A']
}

这个对象描述了一个由 A、B、C、D、E、F、G、H、I、J、K 十一个位置组成的地图,每个位置之间可以相互到达,而且有些位置上会有包裹(后面会用一个数组来表示)。

接下来我们创建一个数组 parcels 来存储地图上所有的包裹:

const parcels = [
 {place: 'A', address: 'B'},
 {place: 'C', address: 'F'},
 {place: 'D', address: 'K'},
 {place: 'E', address: 'J'},
 {place: 'H', address: 'A'},
 {place: 'I', address: 'B'},
 {place: 'J', address: 'D'},
 {place: 'K', address: 'H'}
];

这个数组里面有 8 个包裹,每个包裹都有一个 place 属性表示当前所在位置,以及一个 address 属性表示要邮寄到的地址。

接着我们创建一个机器人对象 robot,并给它一个 move 方法来模拟机器人的移动:

const robot = {
 place: 'A',
 parcels: [],
 move(nextPlace) {
  // 1. 判断是否需要拾取包裹
  for (let i = 0; i < parcels.length; i++) {
   let parcel = parcels[i];
   if (parcel.place === this.place) {
    // 拾取包裹
    this.parcels.push(parcel);
    console.log(`机器人拾取了一个包裹,从 ${this.place} 前往 ${nextPlace}`);
    // 从 parcels 数组中删除这个包裹
    parcels.splice(i, 1);
   }
  }

判断是否需要邮寄包裹

for (let i = 0; i < this.parcels.length; i++) {
   let parcel = this.parcels[i];
   if (parcel.address === this.place) {
    // 邮寄包裹
    console.log(`机器人邮寄了一个包裹,从 ${this.place} 前往 ${nextPlace}`);
    // 从 parcels 数组中删除这个包裹
    this.parcels.splice(i, 1);
   }
  }

移动机器人到下一个位置

this.place = nextPlace;
  console.log(`机器人移动到了 ${this.place}`);
 }
};

这个机器人对象有一个 place 属性表示当前所在位置,一个 parcels 属性表示已经拿到的包裹,以及一个 move 方法来模拟机器人的移动。在 move 方法中,我们首先遍历 parcels 数组,看看当前位置是否有包裹需要拾取,如果有就拾取包裹并从 parcels 数组中删除这个包裹。然后再遍历 this.parcels 数组,看看有没有包裹需要邮寄到当前位置,如果有就邮寄包裹并从 this.parcels 数组中删除这个包裹。最后,我们将机器人的位置更新为下一个位置,并在控制台输出机器人的位置。

我们可以用一个循环来模拟整个过程:

for (let i = 0; parcels.length > 0; i++) {
 let nextPlace = villageGraph[robot.place][Math.floor(Math.random() * villageGraph[robot.place].length)];
 robot.move(nextPlace);
}

这个循环会一直进行,直到所有的包裹都被邮寄出去。在每次循环中,我们先计算出机器人要去的下一个位置 nextPlace,然后调用 robot.move(nextPlace) 让机器人移动。当所有的包裹都被邮寄出去后,循环就会结束。

完整代码

const villageGraph = {
A['P','C','T','B']B['A','T']C:['A','B'],
D:['E','T'],
E:['G','D'],
F:['G','H'],
G:['S','F','E'],
H:['P','T','S'],
S:['G','T','H'],
T:['S','D','B','A'],
P:['H','A']
}const robot = {
 place: 'A',
 parcels: [],
 move(nextPlace) {
  // 1. 判断是否需要拾取包裹
for (let i = 0; i < parcels.length; i++) {
  let parcel = parcels[i];
    if (parcel.place === this.place) {
    // 拾取包裹
    this.parcels.push(parcel);
    console.log(`机器人拾取了一个包裹,从 ${this.place} 前往 ${nextPlace}`);
    // 从 parcels 数组中删除这个包裹
    parcels.splice(i, 1);
   }
  }
     
for (let i = 0; i < this.parcels.length; i++) {
 let parcel = this.parcels[i];
   if (parcel.address === this.place) {
    // 邮寄包裹
    console.log(`机器人邮寄了一个包裹,从 ${this.place} 前往 ${nextPlace}`);
    // 从 parcels 数组中删除这个包裹
   this.parcels.splice(i, 1);
   }
  } 
     
this.place = nextPlace;
console.log(`机器人移动到了 ${this.place}`);
 }
};

for (let i = 0; parcels.length > 0; i++) {
   let nextPlace = villageGraph[robot.place][Math.floor(Math.random() * villageGraph[robot.place].length)];
 robot.move(nextPlace);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值