جدول المحتويات:

إرشادات البرمجة الشيقة للمصمم - التحكم في عملية البرنامج - بيان الحلقة: 8 خطوات
إرشادات البرمجة الشيقة للمصمم - التحكم في عملية البرنامج - بيان الحلقة: 8 خطوات

فيديو: إرشادات البرمجة الشيقة للمصمم - التحكم في عملية البرنامج - بيان الحلقة: 8 خطوات

فيديو: إرشادات البرمجة الشيقة للمصمم - التحكم في عملية البرنامج - بيان الحلقة: 8 خطوات
فيديو: جوناثان بلو: الوعي وتصميم اللعبة والإرادة الحرة 2024, يوليو
Anonim
إرشادات برمجة مثيرة للاهتمام للمصمم - التحكم في عملية البرنامج - بيان الحلقة
إرشادات برمجة مثيرة للاهتمام للمصمم - التحكم في عملية البرنامج - بيان الحلقة

التحكم في عملية البرنامج- بيان الحلقة

من هذا الفصل ، ستتواصل مع بيان حلقة معرفية هام وقوي.

قبل قراءة هذا الفصل ، إذا كنت تريد رسم 10000 دائرة في البرنامج ، فلا يمكنك فعل ذلك إلا بطريقة رهيبة. وهذا يعني كتابة 10000 سطر من رمز القطع الناقص. هؤلاء المصممون الكسالى من الكود الذين يريدون تحسين الكفاءة بكل الوسائل ، بالتأكيد لن يسمحوا بحدوث ذلك. لذلك ، يتم إنشاء بيان الحلقة. مع هذا البيان ، يمكنك أن تشعر بشكل حدسي بقوة أتمتة الكمبيوتر.

الخطوة 1: للحصول على Loop

هناك الكثير من عبارات الحلقة ، وأكثرها استخدامًا هو For Loop. نعلم جميعًا أن وظيفة السحب تعمل باستمرار في التداول. ابدأ من الجملة الأولى في البداية ، وسوف تنفذ من أعلى إلى أسفل حتى الجملة الأخيرة. بعد انتهاء العملية ، ستبدأ مرة أخرى من الجملة الأولى. للبيان يشبه إلى حد ما رسم الوظيفة. يمكن تنفيذ الكود الموجود داخل العبارة بشكل متكرر.

هنا هيكلها النحوي:

لـ (التعبير 1 ؛ التعبير 2 ؛ التعبير 3) {

جسم الحلقة

}

من الواضح أن الجمل داخل جسم الحلقة هي ما توقعناه أن يتم تنفيذها بشكل متكرر. يستخدم التعبير 1 لتهيئة وتعيين القيمة الأولى لمتغير الحلقة. التعبير 2 لشرط الحلقة. سيقوم التعبير 3 بتحديث قيمة متغير الحلقة.

ما هو متغير الحلقة؟ إنه في الواقع مكافئ لمتغير محلي. دعنا نلقي نظرة على كتابة كاملة.

لـ (int i = 0 ؛ i <10 ؛ i ++) {

جسم الحلقة

}

من أجل تحقيق وظيفة الحلقة ، تعتمد العبارة بشكل أساسي على متغير محلي ، والذي سيتم استخدامه عند إنهاء الحلقة. المتغير المحلي في المثال أعلاه هو i. اكتمل التعبير 1 تهيئة المتغير المحلي. في وقت لاحق ، في كل مرة تعمل فيها الحلقة لمرة واحدة ، يجب تحديث هذا المتغير. من بين المثال أعلاه ، يتم استخدام i ++ في التعبير 3 لتحقيق وظيفة التحديث. من خلاله ، سيزيد المتغير 1 في كل مرة يتم فيها تحديثه. في النهاية ، لا يمكن للشفرة داخل جسم الحلقة أن تتكرر إلى أجل غير مسمى ، وإلا فإن العبارات الأخيرة لا يمكن تنفيذها. وبالتالي ، نحن بحاجة إلى حالة نهائية. Express 2 هو فقط من أجله. هنا ، سيحدد البرنامج ما إذا كنت أقل من 10. إذا كان الأمر كذلك ، فاستمر في العمل. إذا لم يكن كذلك ، فقفز خارج الحلقة.

لذلك ، فإن تسلسل عملية العبارة for هو تمامًا مثل هذا.

التعبير 1 (تهيئة المتغير المحلي)

التعبير 2 (راضٍ ، ثم تابع العمل)

جسم الحلقة (الدورة الدموية الأولى)

التعبير 3 (تحديث)

التعبير 2 (راضٍ ، ثم تابع العمل)

جسم الحلقة (الدوران الثاني)

التعبير 3 (تحديث)

التعبير 2 (راضٍ ، ثم تابع العمل)

جسم الحلقة (الدورة الدموية الثالثة) …

التعبير 3 (تحديث)

التعبير 2 (غير راضٍ ، ثم القفز خارج الحلقة)

يمكنك محاكاة تسلسل التنفيذ هذا في رأسك عدة مرات. لكن من المستحيل فهم الكود حقًا دون كتابته بيدك لمرة واحدة. عندما نريد اكتشاف مفهوم غريب ، يمكننا طباعة القيمة في وحدة التحكم من خلال عبارة println.

مثال رمز (5-1): إعداد باطل () {

لـ (int i = 0 ؛ i <10 ؛ i ++) {

println ("تشغيل") ؛

}

}

يمكنك حساب عدد إخراج التشغيل في وحدة التحكم. هنا ، بالضبط 10. هذا يخبرك بعدد المرات التي تم فيها تنفيذ الكود في جسم الحلقة. ومع ذلك ، ما زلنا غير قادرين على اكتشاف التغييرات التي حدثت بالفعل في الحلقة. لذلك يمكننا محاولة تغيير الحرف "تشغيل إلى المتغير" i "، ومعرفة ما سيحدث.

مثال رمز (5-2): إعداد باطل () {

لـ (int i = 0 ؛ i <10 ؛ i ++) {

println (i) ؛

}

}

الآن ، يمكننا أن نرى القيمة i في جسم الحلقة تتزايد باستمرار. لاحقًا ، يمكننا استخدام هذه القيمة لفهم العملية الحالية للحلقة.

في مثال الكود (5-2) ، تم تغيير قيمة i من 0 إلى 9. بالمقارنة مع أوقات التكرار الفعلية ، يبدو دائمًا أنها تحتوي على 1 أقل. إذا لم تكن معتادًا على ذلك ، فيمكن كتابة التعبير الموجود داخل قوس العبارة إلى ما يلي:

لـ (int i = 1 ؛ i <10 ؛ i ++)

وبالتالي ، أنا أتوافق بصدق مع أوقات الحلقات. معنى "<=" أقل من ويساوي. لذلك عندما يساوي i 10 ، فإنه لا يزال يفي بالشرط. لذلك ، ستعمل مرة أخرى مقارنة بكتابتها في i <10. على الرغم من أنها تبدأ من 1 ، إلا أن أوقات الحلقة لا تزال 10. بالطبع ، إذا لم يكن هناك حاجة خاصة ، أود أن أقترح عليك اعتماد طريقة الكتابة في مثال في البداية. في وقت لاحق سوف نقدم لك المتجه أو المصفوفة ، وكلاهما يحصل على عنصره من خلال الرمز السفلي الخاص به. تبدأ جميع الرموز المنخفضة الافتراضية من 0. لتحديد القيمة الأولية لتكون 0 هو ممارسة شائعة نسبيًا.

في المثال أعلاه ، إذا كتبنا أن i أكبر من 0 ، فسوف ينهار pogram. نظرًا لأن المتغير يتزايد باستمرار ، فلن يلبي هذا الشرط أبدًا. هذا تمامًا كما لو أنه لا يمكن إيقافه أبدًا حتى يعمل البرنامج في حلقة لا نهاية لها.

لا يمكن للمتغيرات المحلية في عبارة for أن تعلن فقط عن أنواع البلاستيك ، ولكن أيضًا تعلن عن المتغيرات في أنواع الفاصلة العائمة. على سبيل المثال ، يمكن كتابتها كـ (float i = 0 ؛ i <10 ؛ i + = 0.02).

الخطوة 2: استخدم الحلقات الحلقية لحل المشكلات الرياضية

هل ما زلت تتذكر قصة عالم الرياضيات غاوس في طفولته؟ في ذلك الوقت ، كان Guass يبلغ من العمر 10 سنوات. أراد معلمه تعيين مهمة في الفصل وكان السؤال

1+2+3+4……+97+98+99+100=?

إذا قمت بالحساب بيديك ، فسوف يستغرق الأمر الكثير من الوقت. لكن يبدو أن Guass قد اكتشف طريقة جمع المتتالية الحسابية بالفعل. لذلك بعد طرح السؤال مباشرة ، تحدث عن الإجابة بسهولة ، الأمر الذي فاجأ معلمه كثيرًا.

الآن ، قد لا نتذكر ما هو مجموع المتتالية الحسابية ولكن يمكننا الحصول على الإجابة بطريقة بدائية وعنيفة. وهذا للحلقة. نظرًا لأنه مجرد قطعة صغيرة من الكعكة لحساب أجهزة الكمبيوتر ، يتعين علينا وصف السؤال بلغة يمكن التعرف عليها بواسطة الكمبيوتر ، ومن ثم يمكننا الحصول على إجابتنا بسهولة.

مثال رمز (5-3):

الإعداد باطل(){

إجابة int = 0 ؛

لـ (int i = 1 ؛ i <= 100 ؛ i ++) {

الجواب + = أنا ؛

}

println (إجابة) ؛

}

أعتقد أن النتيجة التي تحصل عليها هي نفسها للإجابة التي أبلغ عنها Guass: إنها 5050!

تلميحات: يمكن تغيير اسم المتغيرات المحلية في حلقة for حسب الرغبة بشرط أن تلتزم بقواعد تسمية المتغيرات. يمكنك كتابتها لتكون (int k = 1 ؛ k <= 100 ؛ k ++). إذا لم تحدث أي شروط خاصة ، فسيكون ذلك افتراضيًا كاسم المتغير.

الخطوة 3: لرسم الحلقة

بعد سلسلة من الفراش الذي يبدو مملاً ، يمكننا أخيرًا الدخول في قسم أكثر إثارة للاهتمام. هذا هو استخدام حلقة لرسم الصور. يمكننا أن نضع هذه الحسابات الرياضية الشاقة جانبًا الآن. نحن المصممين أكثر حساسية للرسومات.

استخدمه للحلقة لرسم مصفوفة دائرة

عندما نريد استخدام حلقة for لتمثيل مجموعة من العناصر المكررة ، علينا التأكد من النسبية العددية لهذه العناصر مسبقًا ، ثم يمكننا استخدام حلقة for لتحقيقها بسهولة بدلاً من القيام بعمل متكرر ضخم. افترض إذا أردنا رسم صف من الدائرة موزعة بالتساوي في الاتجاه الأفقي. إحداثيها الفعلي لم يتغير بينما يتم تغيير تنسيقه الأفقي. ومن اليسار إلى اليمين ، يتزايد الإحداثي الأفقي باستمرار والمسافة المتزايدة هي نفسها. في هذا الوقت ، يمكننا استخدام i in for loop للحصول على الإحداثي الأفقي لكل دائرة.

مثال رمز (5-4): إعداد باطل () {

الحجم (700 ، 700) ؛

الخلفية (83 ، 51 ، 194) ؛

noStroke () ،

}

رسم باطل () {

لـ (int i = 0 ؛ i <7 ؛ i ++) {

القطع الناقص (50.0 + i * 100.0 ، الارتفاع / 2.0 ، 80.0 ، 80.0) ؛

}

}

50 تعني موضع بداية الدائرة الأولى في اليسار. 100 في i * 100 يمثل المسافة المتزايدة.

الخطوة 4: استخدم Loop لرسم نقطة دائرية عشوائية

موضع الرسم أعلاه يمكن التنبؤ به. سيؤدي ذلك إلى تقليل الكثير من الاهتمام. يمكننا استخدام دالة عشوائية أشرنا إليها في الفصل السابق ونحاول كتابتها في وظيفة الرسم.

مثال رمز (5-5):

الإعداد باطل(){

الحجم (700 ، 700) ؛

الخلفية (0) ؛

noStroke () ،

}

رسم باطل () {

الخلفية (0) ؛

لـ (int i = 0 ؛ i <10 ؛ i ++) {

تعويم randomWidth = عشوائي (60.0) ؛

القطع الناقص (عشوائي (عرض) ، عشوائي (ارتفاع) ، عرض عشوائي ، عرض عشوائي) ؛

}

}

هنا ، السبب في وميض موضع الدائرة باستمرار هو أنه في كل مرة تعمل وظيفة عشوائية لمرة واحدة ، تكون النتيجة عشوائية. نظرًا لأن رسم الوظيفة يتم تعيينه افتراضيًا لتشغيل 60 إطارًا في الثانية ، لذلك فإن كل 10 دوائر يتم رسمها في الثانية ستغير موضعها لمدة 60 مرة. هذا الفلاش السريع يجعل الصورة تبدو وكأنها تحتوي على أكثر من 10 دوائر فقط. تغيير قيمة بسيطة في البرنامج سيجلب لك تأثيرًا مختلفًا تمامًا. يمكننا تغيير أوقات الحلقة بمراجعة الحالة النهائية. الحالة النهائية في الصورة أدناه هي i <100

  1. هذا هو التأثير عندما تكون الحالة الطرفية هي i <1000:
  2. البذور عشوائي
  3. إذا كنت لا أريد أن يتم إنشاء موضع الدائرة بشكل عشوائي وكذلك وميضها ، فماذا أفعل؟ تتمثل إحدى الطرق في بناء وتخزين متغيرات مستقلة لكل دائرة وتهيئة هذه المتغيرات في الإعداد. قم بتعيين قيمة عشوائية لهذه المتغيرات. وبالتالي ، عند استخدام وظيفة الرسم داخل الرسم ، فإن ما استدعيناه هو القيمة المخزنة في المتغيرات. لن يتغير في أي وقت. لرسم 10 دوائر ، يمكننا استخدام هذه الطريقة. لكن ماذا لو أردنا رسم 1000 دائرة ، أو 10000 دائرة؟ سيكون الأمر مزعجًا للغاية إذا استخدمنا هذه الطريقة التقليدية لبناء هذه المتغيرات وتسميتها. لا يتعين علينا تعلم طريقة بناء متغير جديدة. إليك طريقة مرنة يمكن أن تساعدنا في تحقيق هذا الهدف. هذا هو استخدام RandomSeed. الآن ، دعنا نلقي نظرة على تأثيره بعد استخدامه. مثال على الكود (5-6): [cceN_cpp theme = "dawn"] void setup () {size (700، 700)؛ الخلفية (0) ؛ noStroke () ؛}
  4. رسم باطل () {

    الخلفية (0) ؛

    عشوائي (1) ؛

    لـ (int i = 0 ؛ i <10 ؛ i ++) {

    تعويم عشوائي عرض = عشوائي (20.0 ، 60.0) ؛

    القطع الناقص (عشوائي (عرض) ، عشوائي (ارتفاع) ، عرض عشوائي ، عرض عشوائي) ؛

    }

    } [/cceN_cpp]

    بالمقارنة مع الكود السابق ، فإنه لا يحتوي على أي تغييرات باستثناء تغيير نطاق نصف قطر الدائرة من 10 إلى ما بعد 30 مع جملة ofSeedRandom فقط. بعد إضافة هذه الجملة ، يبدو الرسم ثابتًا.

    تنسيق الاستدعاء:

    عشوائية البذور (أ) ؛

    من بين هذا الشكل ، فإن الإعداد هو البذور. عليك أن تملأ عددًا صحيحًا (اكتب قيمة النقطة العائمة في P5 ، فلن تسوء ولكن تعاملها كعدد صحيح) فيه. وظيفة randomSeed هي تعيين البذور لقيمة عشوائية. بعد ذلك ، سيتم إنشاء مجموعة عشوائية مختلفة وفقًا لبذور مختلفة. بعد ذلك ، نستدعي دالة عشوائية بحيث تكون نتيجة العودة محددة. هنا ، المحدد ليس للنتيجة هو قيمة محددة ولكن للمصفوفة التي تم إنشاؤها. وهذا يعني أن نتيجة العودة محددة بالنسبة لأوقات الاستدعاء.

    مثال على الكود (5-7): [cceN_cpp theme = "dawn"] void setup () {

    عشوائية البذور (0) ؛

    لـ (int i = 0 ؛ i <5 ؛ i ++) {

    println (عشوائي (10)) ؛

    }

    } [/cceN_cpp]

    الآن نواصل استخدام println لإجراء تجربة. بعد استخدام randomSeed ، في كل مرة تقوم فيها بإغلاق البرنامج وإعادة تشغيل البرنامج ، سيعود إلى سلسلة من نفس النتيجة. سوف تتوافق القيمة مع التسلسل واحدًا تلو الآخر. إذا قمت بحذفه ، فسيعود في كل مرة إلى قيمة مختلفة. لماذا لديها هذا الإعداد؟ وبسبب القيمة العشوائية نفسها في البرنامج هي شبه عشوائية. تبدو النتيجة عشوائية ولكنها في الواقع يتم إنشاؤها بواسطة طريقة حساب ثابتة وقابلة للتكرار. يكافئ تعيين قيمة أولية لـ randomSeed ، ثم يتم حساب النتيجة التالية وفقًا لهذه البذرة. ومع ذلك ، إذا لم نقم بتعيين البذور ، فسيقوم البرنامج افتراضيًا باستخدام الوقت الحالي للنظام لإنشاء بذرة. لذلك فإن نتيجة كل عملية مختلفة. يمكن أن يساعدك المثال أدناه في فهم عشوائي للبذور بشكل أفضل.

    كود المثال (5-8): [cceN_cpp theme = "dawn"] void setup () {

    الحجم (700 ، 700) ؛

    الخلفية (0) ؛

    noStroke () ،

    }

    رسم باطل () {

    عشوائي (1) ؛

    لـ (int i = 0 ؛ i <10 ؛ i ++) {

    تعويم randomWidth01 = عشوائي (10 ، 60) ؛

    القطع الناقص (عشوائي (عرض) ، عشوائي (ارتفاع) ، عرض عشوائي 01 ، عرض عشوائي 01) ؛

    println (randomWidth01) ؛

    }

    عشوائي (1) ؛

    لـ (int i = 0 ؛ i <10 ؛ i ++) {

    تعويم randomWidth02 = عشوائي (10 ، 60) ؛

    القطع الناقص (عشوائي (عرض) ، عشوائي (ارتفاع) ، عرض عشوائي 02 ، عرض عشوائي 02) ؛

    println (randomWidth02) ؛

    }

    } [/cceN_cpp]

    حاول مراجعة البذرة العشوائية الثانية (1) إلى البذرة العشوائية (0) وقارن النتائج النهائية.

    نصائح: في P5 ، علينا فقط استدعاء الوظيفة noLoop في نهاية السحب حتى نتمكن من الحصول على نفس التأثير. وتتمثل مهمتها في إنهاء البرنامج. إنه مختلف تمامًا عن مبادئ العمل المذكورة أعلاه في الطبيعة.

الخطوة 5: استخدم Loop لرسم الخط

بعد أن نتقن استخدام randomSeed ، يمكننا محاولة تغيير وظيفة الرسم. على سبيل المثال ، قم بتغيير رسم الدائرة إلى رسم خطي. فقط إذا صممنا بعض اللوائح المتغيرة حتى نهاية السطر ، فيمكننا استخدام الكثير من الخطوط المتشابكة لعمل نمط فريد.

مثال رمز (5-9):

[cceN_cpp theme = "dawn"] إعداد باطل () {

الحجم (700 ، 700) ؛

الخلفية (0) ؛

}

رسم باطل () {

عشوائية البذور (0) ؛

لـ (int i = 0 ؛ i <2000 ؛ i ++) {

تعويم x1 = العرض / 2.0 ؛

تعويم x2 = عشوائي (50.0، 650.0) ؛

السكتة الدماغية (255 ، 20) ؛

خط (x1 ، 50 ، x2 ، 650) ؛

}

} [/cceN_cpp]

إنشاء فرشاة بسيطة

العودة إلى حلقة for مرة أخرى. الأمثلة المذكورة أعلاه ليست تفاعلية. إذا أردنا جعل النتيجة أكثر إثارة للاهتمام ، فلا يمكننا أن ننسى دمج mouseX و mouseY في الكود الخاص بنا.

مثال رمز (5-10):

[cceN_cpp theme = "dawn"] إعداد باطل () {

الحجم (700 ، 700) ؛

الخلفية (255) ؛

noStroke () ،

}

رسم باطل () {

لـ (int i = 0 ؛ i <1000 ؛ i ++) {

ملء (0 ، 30) ؛

تعويم x = mouseX + عشوائي (-50، 50) ؛

تعويم y = mouseY + عشوائي (-50، 50) ؛

القطع الناقص (س ، ص ، 2 ، 2) ؛

}

} [/cceN_cpp]

يتم إنشاء فرشاة "نقاط التشتت". نظرًا لأن كل نقطة دائرية صغيرة مكثفة تستند إلى موضع الماوس ، فيمكنها تحريك اتجاهات محدودة من الاتجاهات الأربعة لليسار ولليمين ولأعلى ولأسفل. لذا فإن الشكل النهائي للفرشاة يشبه المربع.

مثال رمز (5-11):

[cceN_cpp theme = "dawn"] إعداد باطل () {

الحجم (700 ، 700) ؛

الخلفية (255) ؛

noStroke () ،

}

رسم باطل () {

لـ (int i = 0 ؛ i <1000 ؛ i ++) {

نسبة التعويم = عرض mouseX / (عائم) ؛

تعويم x = mouseX + عشوائي (-50، 50) ؛

تعويم y = mouseY + عشوائي (-50، 50) ؛

ملء (0 ، نسبة * 255 ، 255 * (1 - نسبة) ، 30) ؛

القطع الناقص (س ، ص ، 2 ، 2) ؛

}

}

[/cceN_cpp]

إذا استخدمنا قيمة mouseX للتأثير على لون التعبئة ، فسنحصل على تدرج لوني أكثر سحرية.

الخطوة 6: للحلقة المتداخلة

يمكن أن تكون حلقة For متداخلة. يمكنك كتابة حلقة for مرة أخرى في الحلقة for. عندما تحتاج إلى رسم مصفوفة نقطية ثنائية الأبعاد ، يمكنك اختيار هذه الطريقة.

مثال رمز (5-12):

[cceN_cpp theme = "dawn"] إعداد باطل () {

الحجم (700 ، 700 ، P2D) ؛

الخلفية (202 ، 240 ، 107) ؛

}

رسم باطل () {

ملء (0) ؛

لـ (int i = 0 ؛ i <5 ؛ i ++) {

لـ (int j = 0 ؛ j <5 ؛ j ++) {

تعويم x = 150 + i * 100 ؛

تعويم y = 150 + j * 100 ؛

القطع الناقص (س ، ص ، 60 ، 60) ؛

println (i + ":" + j) ؛

}

}

}

[/cceN_cpp]

لاستخدام الحلقة المتداخلة لأول مرة ، عليك معرفة العلاقات المنطقية الخاصة بها. يكون تنفيذ الكود في البرنامج دائمًا من الأعلى إلى الأسفل. لذلك ، أول ما تم تنفيذه هو بالتأكيد الحلقة الخارجية. في كل مرة تعمل الحلقة الخارجية لمرة واحدة ، ستعمل الحلقة الداخلية باستمرار حتى لا تتمكن من تلبية الشرط بعد الآن. بعد ذلك ، ستبدأ عملية الحلقة الخارجية الثانية. بعد بدء العملية الثانية ، ستستمر الحلقة الداخلية في التنفيذ حتى لا تتمكن من تلبية الشرط. مثل هذا التكرار يفعل حتى لا يمكن استيفاء جميع الشروط ويقفز خارج الحلقة.

في الكود أعلاه ، عمل جسم الحلقة في الحلقة الخارجية 5 مرات إجمالاً ، بينما عمل جسم الحلقة في الحلقة الداخلية 25 مرة. في غضون 25 مرة ، وفقًا للاختلاف في قيمة i و j ، يمكننا التأكد من إحداثيات الدائرة الأفقية والرأسية بشكل منفصل. لقد قمت بتضمين قسم من الطباعة ، يمكنك مراقبة إخراج البيانات والتفكير في تغييرها. من خلال حلقتين متداخلتين فقط ، يمكننا تجربة جميع مجموعات بيانات i و j.

نصائح

عادةً ما تتكثف For loop في الطبقة الثانية باستخدام Tab في البداية. هذا يمكن أن يجعل بنية الكود أكثر وضوحًا. عليك تسمية المتغيرات المحلية في طبقتين من الحلقة بأسماء مختلفة. من بينها ، "i" ، "j" ، "k" هي الأكثر استخدامًا.

استخدام مرن "i" ، "j"

يمثل الاسمان المتغيران "i" و "j" المتغيرات المحلية لطبقتين من الحلقة for. المثال أدناه سوف يعمق فهمك لـ "i" "j". وفقًا للقيمة المختلفة لـ "i" و "j" ، يمكننا إدخال معلمات لتجميع العناصر.

مثال على الكود (5-13): [cceN_cpp theme = "dawn"] void setup () {

الحجم (700 ، 700) ؛

الخلفية (0) ؛

noStroke () ،

}

رسم باطل () {

الخلفية (0) ؛

ملء (250 ، 233 ، 77) ؛

لـ (int i = 0 ؛ i <7 ؛ i ++) {

لـ (int j = 0 ؛ j <7 ؛ j ++) {

pushMatrix () ؛

ترجمة (50 + i * 100، 50 + j * 100) ؛

// الإعداد 1

// زاوية الطفو = sin (millis () / 1000.0) * PI / 2 ؛

// الإعداد 2

// نسبة التعويم = i / 7.0 ؛

// زاوية الطفو = sin (millis () / 1000.0 + نسبة * (PI / 2)) * PI / 2 ؛

// الإعداد 3

نسبة التعويم = (i * 7 + j) /49.0 ؛

زاوية الطفو = sin (millis () / 1000.0 + نسبة * (PI / 2)) * PI / 2 ؛

تدوير (زاوية) ؛

RectMode (CENTER) ،

// ارسم صورة 1

مستقيم (0 ، 0 ، 80 ، 80) ؛

// ارسم صورة 2

// تصحيح (0 ، 0 ، 100 ، 20) ؛

// ارسم صورة 3

// تصحيح (0 ، 0 ، نسبة * 50) ؛

popMatrix () ،

}

}

} [/cceN_cpp]

شرح الكود

يمكن لـ RectMode (CENTER) تغيير طريقة رسم المربع. تُستخدم المعلمتان الأصليتان السابقتان للخط المستقيم لتحديد إحداثيات الزاوية العلوية اليسرى من المربع. بعد أن نبدأ هذا الأمر ، سيتم استخدام هاتين المعلمتين لتعيين إحداثيات نقطة مركز المربع.لأننا هنا نقوم بتشغيل دوران paterrn خلال التدوير ، لذلك نحتاج إلى استخدام هذه الطريقة لرسم نقطة المركز إلى النقطة الأصلية للإحداثيات.

يكتسب millis () الوقت من بداية البرنامج إلى الوقت الحاضر ، وتكون الوحدة مللي ثانية ، وستؤثر هذه القيمة على السرعة المتغيرة لقيمة مخرجات الخطيئة. إذا كتبنا المللي مباشرة ، فإن المقياس المتغير كبير جدًا. وبالتالي ، علينا تقسيمها على 1000.0.

في هذا القسم من الكود ، نستخدم رمز التعليق "//" لإخفاء العديد من الإعدادات. يمكنك تحويل التأثيرات بالبدء أو الإغلاق. على سبيل المثال ، إذا بدأنا جملًا خلف "الإعداد 3" ، فعلينا استخدام رمز التعليق لإغلاق كتل التعليمات البرمجية بين "الإعداد 1" و "الإعداد 2". بالنسبة لأمثلة هيكل البرنامج المتشابه هذا مع المتغيرات المحلية المختلفة ، يمكننا الكتابة بهذا التنسيق. وبالتالي لا يتعين علينا تخزين العديد من المستندات الهندسية بشكل منفصل. يمكننا استخدام هذه المهارة غالبًا أثناء التدريب والإنشاء والحفاظ على بعض إعدادات المعلمات المرضية.

من بينها ، يتم تمثيل تأثير i ، j على البرنامج بشكل أساسي من خلال تغيير "الإعداد 1 (الإعداد 2) (الإعداد 3)". يمكنك مقارنة نتائج الإخراج أدناه.

ارسم الصورة 1: الإعداد 1

ارسم الصورة 1: الإعداد 2

ارسم الصورة 1: الإعداد 3

ارسم الصورة 2: الإعداد 1

ارسم الصورة 2: الإعداد 2

ارسم الصورة 2: الإعداد 3

في الإعداد 1 ، لم نستخدم i و j للتأثير على زاوية الدوران لكل عنصر. وهكذا يمكننا أن نرى أن حركة كل عنصر هي نفسها. أثناء الإعداد 2 ، استخدمنا قيمة i وكلاهما i و j في الإعداد 3. وأخيرًا أثروا على إدخال المعلمة للوظيفة من خلال نسبة الخطيئة. لقد أدى هذا إلى تغيير التغيير الدوري للزاوية. نظرًا للتأثير الفعلي للإعداد 2 والإعداد 3 ليس واضحًا جدًا في الرسومات المتحركة ، يمكننا ملاحظته من لقطة الشاشة التالية.

ارسم الصورة 2 (يسار: الإعداد 2 ؛ يمين: الإعداد 3)

ارسم الصورة 3 (يسار: الإعداد 2 ؛ يمين: الإعداد 3)

في الصورة الأولى ، يتم استخدام النسبة للتأثير على زاوية دوران المربع. بينما الصورة الثانية ، يتم التحكم في نصف قطر الدائرة مباشرة. يمكننا أن نرى أنه استخدم جملة قيمة:

نسبة التعويم = i / 7.0 ؛

تغيير عنصرها الرأسي ثابت. لأن الإحداثيات الأفقية للتحكم في الصورة تعتمد فقط على قيمة i ، لذا فإن الصور التي لها نفس الإحداثيات الأفقية ستكون هي نفسها. وقيمة النسبة ، تدوير الزاوية ونصف قطر الدائرة هي نفسها أيضًا.

في الوقت نفسه ، نستخدم جملة i ، j:

نسبة التعويم = (i * 7 + j) /49.0 ؛

يمكن أن يصف "التدرج". هنا ، مع طريقة ضرب عامل ، فقد جمعت تأثير الصفوف والأعمدة. لذلك كل عنصر مختلف.

الخطوة 7: أثناء التكرار

يوجد شقيق لـ for loop. هذا هو حين حلقة. ما يمكن أن تفعله for loop ، بينما تستطيع الحلقة أن تفعل ذلك أيضًا. لكن تكرار استخدام حلقة while في creativeCoding ليس مرتفعًا مثل تكرار حلقة for.

مثال على الكود (5-14): [cceN_cpp theme = "dawn"] void setup () {

كثافة العمليات أ = 0 ؛

بينما (أ <10) {

println (أ) ؛

أ ++ ؛

}

} [/cceN_cpp]

البنية النحوية لـ while أسهل في الفهم من for. يمكننا إنشاء متغيرات من قبل بيان while. ثم اكتب تعبيرًا داخل قوس مربع. عندما تكون راضيًا ، قم بتشغيل الجمل داخل جسم الحلقة. أخيرًا وضعنا تعبيرًا في جسم الحلقة لتحديث المتغيرات ، ثم أثناء انتهاء الحلقة. بالنسبة لأوقات الحلقة المضمونة ، غالبًا ما نستخدم حلقة for. بالنسبة للقيمة المتغيرة غير المحددة ، نوصيك باستخدام حلقة while.

يفكر:

حاول استخدام جميع أنواع العناصر الأساسية لاستبدال عناصر الرسم في حلقة for لإنشاء فرش مختلفة مختلفة.

ادمج مع الدالة المثلثية المشار إليها في الفصل الأخير ، حاول مراجعة فرشاة "نقاط التشتت" إلى فرشاة مستديرة الشكل.

حاول أن تصنع مصفوفة نقطية ثنائية الأبعاد بحلقة for فقط.

معاينة الفصل التالي كما هو الحال مع هذه الدورة التدريبية ، ستجد كل معرفة جديدة تتعلمها ، وستزداد إمكانية اللعب كثيرًا على الفور. البرنامج عبارة عن صندوق باندورا. كل ما يمكنك تخيله ، يمكنه أن يفعل ذلك من أجلك. لذلك لا يوجد سبب يمنعنا من تعلم هذه اللغة التي يمكنها التواصل مع أجهزة الكمبيوتر. في الفصل التالي ، سنقدم لك بيانًا آخر للتحكم في العملية. يمكنه التحكم في تدفق العملية وتوليد نتائج أكثر تعقيدًا وقابلية للتغيير. باستخدام عبارة if ، يمكنك إنشاء ألعاب المغامرات النصية الخاصة بك بسهولة! تأتي هذه المقالة من المصمم Wenzy. قراءات ذات صلة: إرشادات برمجة مثيرة للاهتمام للمصمم - معالجة إرشادات برمجة TouchInteresting الأولية للمصمم - إنشاء برنامج المعالجة الأول الخاص بك - ابدأ تشغيل صورتك (الجزء الأول) إرشادات البرمجة الشيقة للمصمم - احصل على صورتك قيد التشغيل (الجزء الثاني)

الخطوة 8: المصدر

هذه المقالة من:

إذا كان لديك أي أسئلة ، يمكنك التواصل مع : [email protected].

موصى به: