Menu
CoddyTech

復習 - 図形計算機

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 25/65。

challenge icon

チャレンジ

中級

実際の図形、階層の外にある図形のようなオブジェクト、測定できないオブジェクトを扱う図形計算機を作成してください。

  • 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オンラインコンパイラ