Menu
CoddyTech

回顾:形状计算器

本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 25 课,共 65 课。

challenge icon

挑战

中等

构建一个形状计算器,用于处理真实形状、层级结构之外的类形状对象,以及无法测量的对象。

  • 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 在线编译器