邮件机器人
邮件递送机器人,取件和投递包裹。机器人将在村庄周围移动。各个地方都有包裹,每个包裹都寄往其他地方。机器人在包裹到达目的地时捡起包裹,并在到达目的地时交付包裹。
我们可以按照类似的方式来创建一个描述地图的对象 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);
}