校园导航系统

该代码示例展示了一个基于Python的校园导航系统,利用turtle库绘制校园地图,并实现了Dijkstra算法来计算两点间的最短路径。用户可以通过输入起点和终点获取导航信息,系统还提供了地点介绍功能。
摘要由CSDN通过智能技术生成
# 校园导航系统

import heapq
import turtle as t

graph = {
    '后勤服务楼': {'西苑': 3, '文体中心': 5},
    '西苑': {'后勤服务楼': 3, '操场': 3, '文体中心': 3},
    '操场': {'文体中心': 1, '南门': 4, '文理大楼': 2, '西苑': 3},
    '文体中心': {'南门': 4, '操场': 1, '西苑': 3, '后勤服务楼': 3},
    '南门': {'文理大楼': 6, '图书馆': 7, '文体中心': 4, '操场': 4},
    '文理大楼': {'计算机学院楼': 5, '图书馆': 3, '南门': 6, '操场': 2},
    '计算机学院楼': {'图书馆': 5, '北苑': 7, '文理大楼': 5},
    '图书馆': {'海韵湖': 1, '南门': 7, '文理大楼': 3, '计算机学院楼': 5},
    '海韵湖': {'北苑': 1, '图书馆': 1},
    '北苑': {'海韵湖': 1, '计算机学院楼': 7}
}  # 地点及地点间距离信息


def dt():
    nodes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    node_positions = {
        '0': ((-200, 120), '后勤服务楼'),
        '1': ((-120, 200), '西苑'),
        '2': ((-70, 80), '操场'),
        '3': ((-90, 50), '文体中心'),
        '4': ((-30, -80), '南门'),
        '5': ((0, 80), '文理大楼'),
        '6': ((100, 170), '计算机学院楼'),
        '7': ((100, 50), '图书馆'),
        '8': ((150, 160), '海韵湖'),
        '9': ((200, 190), '北苑'),
    }
    edges = [('0', '1'), ('0', '3'), ('1', '2'), ('1', '3'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'),
             ('4', '5'), ('4', '7'), ('5', '6'), ('5', '7'), ('6', '7'), ('6', '9'), ('7', '8'), ('8', '9')]
    screen = t.Screen()
    screen.setup(500, 500)
    pen = t.Turtle()
    pen.hideturtle()
    pen.penup()
    edges_c = {'edge1': '300', 'edge2': '500', 'edge3': '300', 'edge4': '300',
               'edge5': '100', 'edge6': '400', 'edge7': '200', 'edge8': '400',
               'edge9': '600', 'edge10': '700', 'edge11': '500', 'edge12': '300',
               'edge13': '500', 'edge14': '700', 'edge15': '100', 'edge16': '100', }
    for node in nodes:
        (x, y), name = node_positions[node]
        pen.goto(x, y)
        pen.dot(20, 'yellow')
        pen.write(name, align='center')
    for start, end in edges:
        (x1, y1), _ = node_positions[start]
        (x2, y2), _ = node_positions[end]
        pen.goto(x1, y1)
        pen.pendown()
        pen.pensize(1)
        pen.goto(x2, y2)
        pen.penup()
        pen.goto((x1 + x2) / 2, (y1 + y2) / 2)
        pen.dot(1)
        pen.write(edges_c.get('edge{}'.format(edges.index((start, end)) + 1)), align='center')
    screen.mainloop()


def know():  # 地点介绍
    print("请输入您想要了解的地点序号: ")
    key = int(input())
    if key == 0:
        print("您的选择为:后勤服务楼\n您可以在这里得到一些后勤服务")
    elif key == 1:
        print("您的选择为:西苑\n西苑以物美价廉为特色,食堂里有兰州拉面、盖浇饭、水饺馄饨等美食,您可以在这里尽情品尝!")
    elif key == 2:
        print("您的选择为:操场\n这里包含有网球场、篮球场、足球场等,您可以在这里运动!")
    elif key == 3:
        print("您的选择为:文体中心\n这里包含有室内兵乓球馆、室内篮球馆、健美操馆等,您可以在这里运动!")
    elif key == 4:
        print("您的选择为:南门\n您可以在这里出校,看看校外,领略十里长山的美!")
    elif key == 5:
        print("您的选择为:文理大楼\n这里是决赛场地,您可以到这里看看,熟悉一下环境。")
    elif key == 6:
        print("您的选择为:计算机学院楼\n这里有很多计算机专业的老师,如果您有一些疑问,可以在这里得到解决!")
    elif key == 7:
        print("您的选择为:图书馆\n这里有许多书籍、自习室,您可以在这里看书学习。")
    elif key == 8:
        print("您的选择为:海韵湖\n海韵湖在校园北侧,倚靠着云书山,风景优美,四周有彩虹跑道,您可以在这里散散步放松心情!")
    elif key == 9:
        print("您的选择为:北苑\n北苑以种类丰富为特色,这里有特色小吃、风味料理等,您可以在这里尽情品尝!")
    else:
        print("很抱歉,系统暂时没有收录这个地点的信息。")


def dijkstra(graph, start, end):  # 最短距离、路径
    # 初始化距离字典和路径字典
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    paths = {start: []}
    visited = set()
    queue = [(0, start)]
    # 逐步扩展最短路径
    while queue:
        (current_distance, current_node) = heapq.heappop(queue)
        if current_node == end:
            return distances[end], paths[end]
        if current_node in visited:
            continue
        visited.add(current_node)
        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                paths[neighbor] = paths[current_node] + [(current_node, neighbor)]
                heapq.heappush(queue, (distance, neighbor))
    return float('inf'), []


def navigation_program():  # 用户输入的起点和终点,调用dijkstra(),得到最短距离、路径并输出
    start = input("请输入起点:")
    end = input("请输入终点:")
    # 使用 Dijkstra 算法计算最短距离和路径
    distance, path = dijkstra(graph, start, end)

    # 输出结果
    if distance == float('inf'):
        print(f"没有从{start}到{end}的路径!")
    else:
        print(f"最短距离为:{distance * 100}m")
        print(f"最短路径为:{' -> '.join([node for node, _ in path] + [end])}")
    print()


def distance_menu():  # 校园导航菜单
    print('=================校园导航=================')
    print('1. 校园地图')
    print('2. 校园地点简介')
    print('3. 导航')
    print('0. 退出程序')
    print('=============================================')


def school_distance():  # 校园导航系统功能
    while True:
        distance_menu()
        choice = input("请输入要执行的操作序号(0-2):")
        if choice == '1':   # 绘制校园地图
            dt()
        elif choice == '2':   # 地点介绍
            print("0: 后勤服务楼, 1: 西苑, 2: 操场, 3: 文体中心, 4: 南门, 5: 文理大楼,"
                  " 6: 计算机学院楼,7: 图书馆, 8: 海韵湖, 9: 北苑")
            know()
        elif choice == '3':  # 导航
            print("后勤服务楼, 西苑, 操场, 文体中心, 南门, 文理大楼, 计算机学院楼, 图书馆, 海韵湖, 北苑")
            navigation_program()
        elif choice == '0':
            print("程序已退出。")
            break
        else:
            print("输入错误,请重新输入!")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值