云计算百科
云计算领域专业知识百科平台

简单模拟判断机器人应该采取什么动作

在这里插入图片描述

代码逐行解析

这段代码实现了一个简单的「指令驱动移动」程序:根据用户输入的指令串(只含 F/B/L/R),让一个点从原点 (0, 0) 出发逐步移动,并打印出完整路线、最终坐标和总步数。

1. compute_route(commands) —— 核心移动逻辑

def compute_route(commands):
"""按指令串逐步移动,返回记录每一步位置的列表。"""
x, y = 0, 0
route = [(x, y)]
for ch in commands:
if ch == 'F':
y += 1
elif ch == 'B':
y -= 1
elif ch == 'L':
x -= 1
elif ch == 'R':
x += 1
else:
continue
route.append((x, y))
return route

  • x, y = 0, 0:初始化坐标,从原点出发。
  • route = [(x, y)]:用列表记录路线,先把起点放进去。
  • for ch in commands:逐个字符遍历指令串。
  • 四个方向分支:
    • F(Forward)→ y += 1,向上走一步;
    • B(Backward)→ y -= 1,向下走一步;
    • L(Left)→ x -= 1,向左走一步;
    • R(Right)→ x += 1,向右走一步;
    • else: continue:遇到其他字符直接跳过,不产生移动。
  • 每执行一条有效指令,就把新坐标 (x, y) 追加进 route。
  • 最终返回 route,即每一步的位置列表。

2. show_result(commands) —— 打印完整结果

def show_result(commands):
"""计算并打印一条指令串的完整路线与结果。"""
route = compute_route(commands)
final_x, final_y = route[–1]
steps = len(route) – 1
route_text = " → ".join("({}, {})".format(px, py) for px, py in route)
print("输入指令:{}".format(commands))
print("路线:{}".format(route_text))
print("最终坐标:({}, {})".format(final_x, final_y))
print("总步数:{}".format(steps))
if final_x == 0 and final_y == 0:
print("已回到起点")
else:
print("未回到起点")
print("-" * 40)

  • route = compute_route(commands):调用上面的函数拿到完整路线。
  • final_x, final_y = route[-1]:取列表最后一个元素,即最终坐标。
  • steps = len(route) – 1:总步数 = 路线点数 – 1(去掉起点本身)。
  • route_text:用 " → " 把每个坐标点拼接成可读的路线字符串。
  • 依次打印:输入指令、路线、最终坐标、总步数。
  • 判断是否回到原点 (0, 0),并输出对应提示。
  • print("-" * 40):打印分隔线,便于多条指令结果之间区分。

3. main() 与程序入口

def main():
commands = input("请输入指令串(只含 F/B/L/R):").strip().upper()
show_result(commands)

if __name__ == "__main__":
main()

  • input(…):提示用户输入指令串。
  • .strip():去掉首尾空白字符。
  • .upper():统一转成大写,避免用户输入小写 f/b/l/r 时匹配不上。
  • show_result(commands):调用打印函数输出结果。
  • if __name__ == "__main__"::保证只有直接运行本文件时才执行 main(),被其他模块导入时不会自动运行。

运行示例

输入 FFLBR,输出如下:
在这里插入图片描述
输入FLBR,输出如下:
在这里插入图片描述

避障决策程序解析

这段代码实现了一个「避障决策」程序:根据每组传感器测得的距离和当前电量,自动判断小车应该执行哪种动作,并统计各类动作的执行次数。

1. 数据准备

distances = [80, 35, 10, 80, 20, 50]
batteries = [60, 60, 60, 15, 20, 20]
ACTIONS = ["正常前进", "减速前进", "停止避障", "停止并充电"]

  • distances:列表,存放 6 组障碍物距离(单位 cm)。
  • batteries:列表,存放对应的 6 组电量(单位 %)。
  • ACTIONS:列表,定义四种可能的动作名称,供后续统计使用。

2. decide_action(distance, battery) —— 决策核心

def decide_action(distance, battery):
"""根据一组(距离, 电量)返回应执行的动作文字。"""
if battery < 20:
return "停止并充电"
if distance < 20:
return "停止避障"
if distance < 50:
return "减速前进"
return "正常前进"

  • 函数接收两个参数:distance(距离)和 battery(电量)。
  • 判断顺序从上到下,先满足哪个条件就返回哪个动作:
    • 电量低于 20% → 无论距离多远,都返回「停止并充电」(电量优先);
    • 距离小于 20cm → 障碍物太近,返回「停止避障」;
    • 距离小于 50cm → 距离较近,返回「减速前进」;
    • 其余情况 → 距离充足,返回「正常前进」。

3. main() —— 主流程

def main():
stats = {name: 0 for name in ACTIONS}
for index in range(len(distances)):
distance = distances[index]
battery = batteries[index]
action = decide_action(distance, battery)
stats[action] += 1
print("第{}组:距离 {}cm,电量 {}%,动作:{}".format(
index + 1, distance, battery, action))
print("-" * 40)
summary = ",".join("{} {}次".format(name, stats[name]) for name in ACTIONS)
print("统计结果:{},四项合计{}次。".format(summary, len(distances)))

  • stats = {name: 0 for name in ACTIONS}:用字典推导式创建统计表,把四种动作的计数都初始化为 0。
  • for index in range(len(distances)):按索引遍历 6 组数据。
  • distance = distances[index]、battery = batteries[index]:按相同索引取出对应的距离和电量。
  • action = decide_action(distance, battery):调用决策函数得到该组应执行的动作。
  • stats[action] += 1:把对应动作的计数加 1。
  • print(…):打印当前组的编号、距离、电量和决策结果。
  • print("-" * 40):打印分隔线。
  • summary:用 ",".join(…) 把四种动作的统计结果拼接成字符串。
  • 最后打印统计结果,并用 len(distances) 验证四项合计次数等于数据组数。

4. 程序入口

if __name__ == "__main__":
main()

  • 保证只有直接运行本文件时才执行 main(),被其他模块导入时不会自动运行。

运行结果推演

逐组分析:

组距离电量决策
1 80 60 正常前进
2 35 60 减速前进
3 10 60 停止避障
4 80 15 停止并充电
5 20 20 减速前进
6 50 20 正常前进

统计结果:正常前进 2 次,减速前进 2 次,停止避障 1 次,停止并充电 1 次,四项合计 6 次。

在这里插入图片描述在这里插入图片描述

赞(0)
未经允许不得转载:网硕互联帮助中心 » 简单模拟判断机器人应该采取什么动作
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!