復習 - 図形計算機
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 25/65。
チャレンジ
中級実際の図形、階層の外にある図形のようなオブジェクト、測定できないオブジェクトを扱う図形計算機を作成してください。
Shapeは抽象クラスで、抽象メソッドarea() -> float、perimeter() -> float、shape_name() -> Stringを持ちます。通常のメソッドdescribe()は、小数点以下2桁で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には2つの静的関数があります。process(thing)は、Shapeの場合は[Shape]にdescribe()を続けたものを、describe()メソッドを持つその他のオブジェクトの場合は[Duck]にdescribe()を続けたものを返し、それ以外の場合はCannot measure this objectを返します。total_area(things)は、area()メソッドを持つすべてのオブジェクトのarea()を合計します。
提供されているコードは、後に続くオブジェクトの数を読み取り、その後、各オブジェクトを1行ずつ読み取ります。入力形式は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オンラインコンパイラ