回顾:形状计算器
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 25 课,共 65 课。
挑战
中等构建一个形状计算器,用于处理真实形状、层级结构之外的类形状对象,以及无法测量的对象。
Shape是抽象类,包含抽象方法area() -> float、perimeter() -> float和shape_name() -> String。它的普通方法describe()会返回包含两位小数的NAME: area A, perimeter P。Circle(radius)、Rectangle(width、height)和Triangle(边a、b、c)都继承Shape。它们的名称分别是Circle、Rectangle和Triangle。圆的面积为PI * r * r,周长为2 * PI * r。对于三角形,使用海伦公式:令s = (a + b + c) / 2,面积为sqrt(s * (s - a) * (s - b) * (s - c))。CustomShape不会继承Shape。它有custom_name和size;area()为size * size,perimeter()为4 * size,而describe()使用与Shape相同的格式,并采用它的自定义名称。ShapeCalculator有两个静态函数。对于Shape,process(thing)会返回[Shape]加上describe()的结果;对于任何其他拥有describe()方法的对象,会返回[Duck]加上describe()的结果;其他情况下则返回Cannot measure this object。total_area(things)会累加每个拥有area()方法的对象的area()。
提供的代码会读取后续对象的数量,然后每行读取一个对象:circle R、rectangle W H、triangle A B C、custom NAME SIZE 或 unknown(一个普通的 RefCounted 对象)。代码会为每个对象输出 process() 的结果和总面积。对于 circle 5、custom Hexa 3 和 unknown,输出如下:
[Shape] Circle: area 78.54, perimeter 31.42
[Duck] Hexa: area 9.00, perimeter 12.00
Cannot measure this object
Total area: 87.54你的代码应写在 shape.gd、circle.gd、rectangle.gd、triangle.gd、custom_shape.gd 和 shape_calculator.gd 中。main.gd 包含提供的输入/输出代码,不能编辑。
亲手试试
extends Node
func _ready():
# 提供的输入输出代码:保持原样。
var count := int(OS.read_string_from_stdin())
var things := []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "circle":
things.append(Circle.new(float(p[1])))
elif p[0] == "rectangle":
things.append(Rectangle.new(float(p[1]), float(p[2])))
elif p[0] == "triangle":
things.append(Triangle.new(float(p[1]), float(p[2]), float(p[3])))
elif p[0] == "custom":
things.append(CustomShape.new(p[1], float(p[2])))
else:
things.append(RefCounted.new())
for thing in things:
print(ShapeCalculator.process(thing))
print("Total area: %.2f" % ShapeCalculator.total_area(things))
面向对象编程中的所有课
自己练习: GDScript 在线编译器