import math
from jupyturtle import (
Turtle,
make_turtle,
)مسائل في التغليف والتعميم وإعادة الهيكلة
لتكون المسائل قريبة من الحسّ والبصر، سنستخدم مكتبة jupyturtle كما في دفتر التطبيقات.
التهيئة: ثبّت الحزمة إن لزم، ثم نفّذ خلية الاستيراد التالية قبل الحلول.
بعد كل تمرين (حيث يظهر عنوان اختبار مرئي) نفّذ الخلية البرمجية التالية لترى إن كان رسمك يطابق المتوقع.
uv add jupyturtleالمتغير delay يتم تمريره للتحكم بسرعة الرسم:
# Control speed of drawing
fps = 10
delay = 1 / fps1. رسم مستطيل
الفكرة: استخدم حلقة وانعطافات السلحفاة لتتبّع محيط المستطيل.
المطلوب: نفّذ الدالة rectangle(t, width, height) لترسم مستطيلًا بالأطوال المعطاة.
def rectangle(t: Turtle, width: float, height: float) -> None:
passاختبار مرئي: نفّذ الخلية التالية بعد إكمال rectangle.
t = make_turtle(delay=delay)
rectangle(t, 80, 40)2. رسم معين
الفكرة: المَعِين يُرسم بمدّ متعاقبة مع زاويتي انعطاف متكاملتين (تكملان 180°).
المطلوب: نفّذ الدالة rhombus(t, length, angle) لترسم معينًا بطول ضلع length وزاوية داخلية angle (بالدرجات).
def rhombus(t: Turtle, length: float, angle: float) -> None:
passاختبار مرئي: نفّذ الخلية التالية بعد إكمال rhombus.
t = make_turtle(delay=delay)
rhombus(t, 70, 60)3. تعميم بمتوازي أضلاع
الفكرة: أعد استخدام منطق الرسم المشترك بين أشكال متعددة.
المطلوب: نفّذ parallelogram(t, side1, side2, angle)، ثم أعد كتابة rectangle وrhombus بحيث تستدعيان parallelogram (المستطيل معين بزاوية 90°، والمعين بضلعين متساويين).
def parallelogram(t: Turtle, side1: float, side2: float, angle: float) -> None:
pass
def rectangle(t: Turtle, width: float, height: float) -> None:
pass
def rhombus(t: Turtle, length: float, angle: float) -> None:
passاختبار مرئي: مستطيل، ثم معين، ثم متوازي أضلاع عام — بعد إكمال التعريفات الثلاثة.
t = make_turtle(delay=delay, width=400)
t.pen_up()
t.forward(-120)
t.pen_down()
rectangle(t, 80, 40)
t.pen_up()
t.forward(100)
t.pen_down()
rhombus(t, 50, 60)
t.pen_up()
t.forward(80)
t.pen_down()
parallelogram(t, 80, 50, 60)4. دالة القفز jump
الفكرة: اجمع تسلسلًا متكررًا من أوامر السلحفاة في دالة واحدة.
المطلوب: اكتب الدالة jump(t, length) التي تنفّذ بالترتيب: pen_up() ثم forward(length) ثم pen_down() — بحيث تتحرك بمسافة length دون رسم، وتنتهي والقلم للأسفل.
يمكنك بعدها استخدام jump لفصل أشكال متجاورة بدل تكرار الثلاثة أوامر.
def jump(t: Turtle, length: float) -> None:
passاختبار مرئي: نفس الأشكال السابقة باستخدام jump بدل تكرار pen_up / pen_down.
t = make_turtle(
delay=delay,
width=400,
)
jump(t, -120)
rectangle(t, 80, 40)
jump(t, 100)
rhombus(t, 50, 60)
jump(t, 80)
parallelogram(t, 80, 50, 60)5. «فطيرة» من مثلثات متكررة
الفكرة: ابنِ شكلًا أكبر بتكرار أداة رسم صغيرة (قطعة مثلثية).
المطلوب:
- نفّذ
triangle(t, r, angle)لترسم قطعة مثلثية واحدة (كما في النص الأصلي للفصل). - نفّذ
draw_pie(t, n, r)لتكرار هذه القطعةnمرّة وتكوين فطيرة كاملة.
def triangle(t: Turtle, r: float, angle: float) -> None:
pass
def draw_pie(t: Turtle, n: int, r: float) -> None:
passاختبار مرئي (مثلث واحد): نُسرّع الرسم بقيمة delay أصغر.
tri_fps = 40
tri_delay = 1 / tri_fps
t_tri = make_turtle(delay=tri_delay)
triangle(t_tri, 60, 20)اختبار مرئي (فطائر): ثلاث فطائر بأعداد أضلاع مختلفة؛ يفترض أن تكون jump قد عرّفتَها في التمرين السابق.
size = 40
margin = 2 * size + 20
t = make_turtle(
delay=delay,
width=50 + (size + margin) * 3,
)
t.pen_up()
t.forward(-80)
t.pen_down()
draw_pie(t, 5, size)
jump(t, margin)
draw_pie(t, 6, size)
jump(t, margin)
draw_pie(t, 7, size)6. زهرة بأوراق
الفكرة: اجمع زهرة كاملة بتكرار رسم ورقة واحدة.
المطلوب: باستخدام الدالة arc المعطاة في الخلية التالية، نفّذ petal(t, r, angle) لرسم ورقة واحدة، ثم flower(t, n, r, angle) لتجميع n ورقة في زهرة.
def arc(t: Turtle, r: float, angle: float) -> None:
for i in range(r):
t.forward(r, i * 2)اختبار مرئي: الدالة arc المعطاة (مرجع قبل رسم الورقة).
t = make_turtle(delay=delay)
arc(t, 10, 36)def petal(t: Turtle, r: float, angle: float) -> None:
pass
def flower(t: Turtle, n: int, r: float, angle: float) -> None:
passاختبار مرئي: ورقة واحدة بـ petal.
t = make_turtle(delay=delay)
petal(t, 10, 36)اختبار مرئي: زهرة كاملة؛ لوحة أكبر كما في دفتر الفصل.
t = make_turtle(
delay=delay,
height=400,
width=400,
)
flower(t, 8, 10, 36)7. حلزون
البرنامج التالي (من نفس الفصل) يوضّح رسم مضلّع ودائرة تقريبية باستخدام السلحفاة — اقرأه كسياق، ثم انتقل للمطلوب.
المطلوب: اكتب الدالة spiral(t, n, length, gap) التي ترسم حلزونًا: في كل خطوة تمشي length ثم تنعطف بزاوية ثابتة، وتزيد length بمقدار gap للخطوة التالية (كرر n مرّة).
def polygon(t: Turtle, n: int, length: float) -> None:
angle = 360 / n
for i in range(n):
t.forward(length)
t.left(angle)
def circle(t: Turtle, radius: float) -> None:
circumference = 2 * math.pi * radius
n = 10
length = circumference / n
polygon(t, n, length)
# مثال: t = make_turtle(delay=delay); t.jump_to(120, 120); circle(t, 60)اختبار مرئي (اختياري): دائرة تقريبية باستخدام polygon وcircle من خلية السياق.
t = make_turtle(delay=delay)
t.jump_to(120, 120)
circle(t, 60)def spiral(t: Turtle, n: int, length: float, gap: float) -> None:
passاختبار مرئي: الحلزون بعد إكمال spiral.
t = make_turtle(delay=delay)
spiral(t, 50, 5, 0.2)