الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج لرسم كارمة متحركة

بدأه namespace في 5 يوليو 2010 · 12 رد · 2,658 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

تتنوع أشكال كارمات المحلات المضيئة في الليل ، منها ما يحيط به إطار من الأضواء تراها تدور باستمرار :

SAYAHc13567b045.gif

دورنا في هذا الموضوع أن . . .

نفهم كيف حصلنا على الشكل أعلاه . . .

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

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

واضح أنك ترى النقاط تدور بعكس عقارب الساعة ، ما الذي يجعلك تشعر بهذا الشعور ؟

لو كان ترتيب النقاط كما يلي ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ، هل سترى النقاط تدور ؟ إن كان كذلك فالدوران مع أم عكس عقارب الساعة ؟ لن تستطيع التحديد . لهذا في برنامجنا وحتى يبدو الدوران واقعياً ، سنعتمد اسلوب نقطتين بلون والثالثة بلون مخالف , مع أن هذه الخطوة ستكلفنا غالياً لكن مقابل أن نراها تدور باتجاه واحد .

في البداية قم بفك المستطيل أعلاه حتى تحصل على خط مستقيم ، هذا سيمثل لنا المصفوفة التي سنتعامل معها ( فعلياً الألوان هي التي ستخزن في المصفوفة ) .

30455_126088834095874_100000842732216_136022_2295768_n.jpg

نبدأ بتعلم تدوير مصفوفة من n عنصر ، لأنه بتدوير المصفوفة سنحصل على الأشكال المتعاقبة التالية :

30455_126148800756544_100000842732216_136239_2688869_n.jpg

لاحظ أن النقاط تدور خطوة إلى اليسار في كل مرة ، ويتم برمجة ذلك ببساطة باتباع الخطوات التالية :

1- نخزن العنصر الأول ( الأيسر ) في متغير احتاطي temp

2- نقوم بإزاحة العناصر التي على يمينه خطوة واحدة إلى اليسار

3- سنفقد العنصر الأول بما أن العنصر الثاني أخذ مكانه ، هنا يأتي دور النسخة الاحتياطية ، نأتي بها من المتغير temp ونضعها أقصى يمين المصفوفة ، كما يلي :

30455_126151767422914_100000842732216_136260_1607673_n.jpg

وفي ++C نكتب الكود التالي :

int arr[]={7,6,8,4,2,9,1,6,2};

int temp=arr[0];

for(int i=0 ; i<=7 ; i++)
	arr=arr[i+1];

arr[8]=temp;

في برنامجنا سيكون لدينا مصفوفة c من 36 عنصر ( الضلعين العلوي والسفلى 14+14 والجوانب 4+4 ) ستحوي أرقام الوان النقاط ( الأصفر 14 والأحمر 12 ) ننشئ المصفوفة ونعطيها القيم كما يلي :

for(int i=0 ; i<36 ; i++)
	if(i%3 == 0) c=12;
	else c=14;

الكود نفسه يمكن كتابته كما يلي :

for(int i=0 ; i<36 ; i++)
	c=(i%3 == 0 ? 12 : 14);

انظر ماذا أصبح لدينا :

36482_126220194082738_100000842732216_136719_318142_n.jpg

بقي علينا خطوة واحدة هي الأهم : تذكر اننا قمنا بفك المستطيل حتى حصلنا على الخط المستقيم ، الآن علينا عكس العملية ؛

36482_126221100749314_100000842732216_136721_7819130_n.jpg

الآن سنترجم الصورة السابقة إلى كود :

لطباعة السطر الأول نحتاج لدوران من 0 إلى 13 ، نغير اللون حسب محتويات المصفوفة ، ثم نطبع الرمز ♦ بذلك اللون وبعده فراغ .

for(int a=0 ; a<=13; a++)
{
	setColor(c[a]);
	cout << ch << ' ';
}

لطباعة الأسطر من الثاني إلى الخامس هنا لدينا عمودان ؛ الأيسر من 35 إلى 32 ( تنازلي ) والأيمن من 14 إلى 17 . لكن الطباعة ستكون بدوران واحد ، لا نستطيع أن نطبع العمود الأيسر ثم نعود لطباعة العمود الأيمن ، لذا نستخدم دوراناً واحداً لكن متغيرين ؛

for(int m=35,n=14 ; m>=32 ; m--,n++)
{
	setColor(c[m]);
	cout << ch << spaces;

	setColor(c[n]);
	cout << ch << endl;
}

حيث spaces الفراغات بين العمودين وتساوي 25 ( 3-2*14 ) يمكنك معرفة ذلك بالتجربة والخطأ فالأمر لا يهم .

الشرط أعلاه ( m>=32 ) يمكن تغييره إلى ( n<=17) كلاهما سواء بما أن عدد نقاط العمودين الأيمن والأيسر متساويان .

بقي السطر الأخير ، بدوران من 31 إلى 18 ( تنازلي ) كما الشكل أعلاه ، نكتب الآتي :

for(int a=31 ; a>=18 ; a--)
{
	setColor(c[a]);
	cout << ch << ' ';
}

بعد الطباعة ، نحتاج لتدوير المصفوفة للحصول على شكل جديد في المرة التالية :

int temp=c[0];

for(int k=0 ; k<=34 ; k++)
	c[k]=c[k+1];

c[35]=temp;

هل بقي شيء ؟ نعم بالتأكيد ، الإبقاء على الشكل لمدة معينة ( 0.15 ث مثلاً ) قبل مسحه استعداداً لرسم شكل جديد في المرة التالية :

sleep(150);

system("cls");

السطر الثاني من الكود ببساطة لمسح الشاشة كلياً ، والأول مر عليك هنا.

الآن ما عدد المشاهد التي تود الحصول عليها ؟ يكفي 300 ؟ إذن نضع كل ما كتبناه داخل دوران :

for(int j=0 ; j<300 ; j++)
{
	.
	.
	.
}

كالعادة ، الكود كاملاً أصبح بين يديك ، وهذه المرة commented

#include<time.h>
#include<string> 
#include<iostream>
#include<windows.h>

using namespace std;

void setColor(int color) // Changes the printing color
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
}

void sleep(int d) // Delay function
{ 
    clock_t start=clock(); 
    while(clock()-start < d); 
}

void main()
{
    int c[36];

    // Filling c[] with colors ( 12 for red , 14 for yellow )
    for(int i=0 ; i<36 ; i++)
        c=(i%3 == 0 ? 12 : 14);

    char ch=4; // The ASCII for the dot to be printed

    for(int j=0 ; j<300 ; j++) // We will see 300 scenes
    {
        cout << "\n ";

        // Printing the upper line
        for(int a=0 ; a<=13 ; a++)
        {
            setColor(c[a]);
            cout << ch << ' ';
        }

        cout << endl;

        // Between columns
        string spaces="                         ";

        // Printing the columns
        for(int m=35,n=14 ; m>=32 ; m--,n++)
        {
            cout << ' ';

            // For left column
            setColor(c[m]);
            cout << ch << spaces;

            // For right column
            setColor(c[n]);
            cout << ch << endl;
        }

        cout << ' ';

        // Printing the lower line
        for(a=31 ; a>=18 ; a--)
        {
            setColor(c[a]);
            cout << ch << ' ';
        }

        cout << endl;

        sleep(150); // To see the scene before clearing the screen

        system("cls"); // Prepare for new scene

        // Rotating c[]
        int temp=c[0];

        for(int k=0 ; k<=34 ; k++)
            c[k]=c[k+1];

        c[35]=temp;

    }
}

SAYAHc13567b045.gif

◄ سبحانك لا علم لنا إلا ما علمتنا إنك أنت العليم الحكبم

◄ للأمانة العلمية ، يرجى ذكر المصدر عند النقل

الموضوع الأصلي : http://psd-development.com/vb/t537.html

Night_Lights.rar

تم تعديل هذه المشاركة بواسطة namespace في 5 يوليو 2010 في 22:35

3

البرمجة = الرياضيات

#2

ما شاء الله شرح ممتاز

موضوع جامد اخر حاجة

ربنا يكرمك اخى الكريم على النقل الطيب

00020309t.gif

1958_1963.gif
#3

ماشاء الله أخي حمزه, موضوع مميز..

سأحاول تحميل المرفقات و تطبيق الكود حال رجوعى المنزل... شكرا لك

#4

موضوع 5 نجوم و يليق بمقامك كمبرمج محترف في السي++ :wub:

أفكار رائعة من عضو أروع .. لا أعرف ماذا أقول لك :wink:

ما شاء الله يا أخي .. موضوع في غاية الروعة ...

أرجوا من الإدارة تثبيت الموضوع و ذلك لأهميته :)

الله يوفقك و يبارك فيك.

لا تحرمنا من جديد إبداعك :) , بانتظار موضوعك القادم و أرى أنه من افضل أن يكون حول الألعاب النارية :wink: :lol:

في أمان الله.

#5

موضوع رائع، ما شاء الله عليك.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#6
أحمد المتألق كتب:

موضوع 5 نجوم و يليق بمقامك كمبرمج محترف في السي++ :wub:

الله يخليك ربي ويبارك فيك

احرجتني بلطفك

لا يزال لدي المزيد - وأعضاء هذا المنتدى الكرام يستحقون المزيد

دمت مبدعاً أخي أحمد

البرمجة = الرياضيات

#7
اقتباس
لا يزال لدي المزيد - وأعضاء هذا المنتدى الكرام يستحقون المزيد

ننتظر إبداعاتك على أحر من الجمر :wink:

#8

ننتظر مشاركات المزيد من الأعضاء

#9
محمد علاء الدين كتب:

موضوع رائع، ما شاء الله عليك.

رأيك تاج على راسي مشرفنا القدير

البرمجة = الرياضيات

#10
اقتباس
رأيك تاج على راسي مشرفنا القدير

جزاك الله خيرا على ردك :blush:.

الأفضل أن تنادينى بإسمي محمد بعد إذنك بالطبع :blush:

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#11

إبداااااااااااااااااااع وشرح أكثر من رائع

سلمت اناملك يا فضاء الأسماء ..

المفروض اسميك namespaces king فأنت كذلك .

1+ ,ولو فيه زيادة كنت عطيتك ..

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#12
omani كتب:

إبداااااااااااااااااااع وشرح أكثر من رائع

سلمت اناملك يا فضاء الأسماء ..

شكراً لك أخ omani هالكلام يعطيني دافعاً ويزيدني عطاءاً بفضل الله

بمعنى آخر شجعتني أزور منتدى الفيجوال بيسك وأفجر كم قنيلة هناك :lol:

البرمجة = الرياضيات

#13

ما شاء الله

موضوع قمة بالروعة

الصراحة انا أول مرة أشوف موضوع عربي عن برمجة شئ بهذه الروعة وهذا الشرح الرائع

الله يوفقك ويجعله في ميزان حسناتك وننتظر جديد إبداعك أخي الكريم

يداً بيد لبداية عصر برمجي جديد

مواضيع مشابهة