Robbie the Map Reader
Robbie 是一个探索火星的机器人。他收到了一份地图文件
geo_features.txt
,你需要用 Python 编写两个模块来帮助 Robbie:📁 文件结构与功能要求:
1. geo_features.py
— 定义地质特征类
- ✅ 编写一个抽象基类
GeoFeature
,用于表示通用的地质特征。
- ✅ 派生类包括:
Mountain
Lake
Crater
- ✅ 每个类都应记录位置、名称、类型和相应的数值属性(高度、深度、周长)。
2. task1.py
— 实现命令行交互系统
- ✅ 读取并解析
geo_features.txt
文件内容: - 第一行是地图大小(
n_rows
,n_cols
) - 后续行是地质特征(位置、类型、名称、数值)
- ✅ 构建二维地图并存储所有特征
- ✅ 提供命令行交互支持以下指令:
show map
:显示地图字符矩阵(. m l c)info Y X
:显示指定位置的特征详情或提示“no information found”quit
:退出程序,打印 “goodbye”
geo_features.py
✅ 实现方法总结
1. 类层级结构与职责
类名 | 描述 | 说明 |
Location | 表示地图上的一个坐标点 | 封装了 Y , X 两个整数坐标 |
Size | 表示地图的整体尺寸 | 含 height , width |
GeoFeature | 抽象基类(地理特征) | 存储所有地理实体的公共字段和行为 |
Mountain | 山 | 继承自 GeoFeature ,单位是高度(height ),特征类型名是mountain |
Lake | 湖泊 | 继承自 GeoFeature ,单位是深度(depth ),特征类型名是lake |
Crater | 陨石坑 | 继承自 GeoFeature ,单位是周长(perimeter ),特征类型名是crater |
2. 功能方法说明
✅ GeoFeature.__init__()
- 初始化所有子类共用的信息:
location
:Location(Y, X)
description
: 地理特征的描述integer
: 数值,如高度、深度、周长unit
: 单位(由子类设定)type_
: 特征类型名(由子类设定)
✅ GeoFeature.get_icon()
- 返回类型名的首字母,供地图展示图标使用(如
"M"
表示山)
✅ GeoFeature.__str__()
- 打印实例时显示格式为:
✅ 三个子类:Mountain
, Lake
, Crater
- 分别传入对应的单位和类型名,调用父类初始化方法
task1.py
✅ 实现方法总结
1. 类结构与职责
Main
类:负责加载地理数据文件并将每个地形元素对象存储到info_map
中。
main()
函数:命令行界面,支持展示地图、查看指定坐标信息。
2. 功能实现步骤
Main.__init__()
- 读取数据文件
/home/geo_features.txt
,第一行是地图尺寸(width,height
),后续每行是一个地形元素。
- 构建
geo_features.Size
对象存储地图尺寸。
- 通过
add_element()
处理后续每行地形信息。
Main.add_element(line)
- 把每行文本分割为
loca_y, loca_x, type_, description, integer
- 类型字段(
mountain
,lake
,crater
)决定创建哪种子类对象(如geo_features.Mountain
)
- 存储于字典
info_map[(y, x)] = object
Main.__str__()
- 遍历地图区域,若某点有元素,调用其
get_icon()
方法打印其标识符,否则打印.
(空地)
- 实现地图可视化输出
Main.get_info(Y, X)
- 返回指定坐标的信息对象或提示
"no information found"
main()
函数:
- 简易命令行交互:
show map
:打印地图info Y X
:打印某点的信息quit
:退出
总结
Inheritance(继承) 和 Polymorphism(多态) 在本任务(OOP 类)中有着不可撼动的重要性,做好代码的基础结构,不仅能减少重复代码、提升可维护性,还能使不同地质特征的行为统一处理,提升程序的扩展性和可读性。为后续题目的拓展留出操作空间!我们第一题问题不大,秒了。