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

دورنا في هذا الموضوع أن . . .
نفهم كيف حصلنا على الشكل أعلاه . . .
حتى تحصل على الشكل أعلاه عليك استخدام برنامج لتصوير الشاشة ثم تحويل الفيديو إلى gif حينها سيصبح لديك تماماً مثل الصورة التي حصلت عليها . . وهكذا انتهى موضوعنا ومساؤكم سعيد .
بقيت معلومة بسيطة بخصوص برمجة هذه الكارمة ، الأمر لا يعدو كونه تدوير مصفوفة عدد عناصرها بعدد النقاط المضيئة ( أو كما يبدو ) .
واضح أنك ترى النقاط تدور بعكس عقارب الساعة ، ما الذي يجعلك تشعر بهذا الشعور ؟
لو كان ترتيب النقاط كما يلي ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ، هل سترى النقاط تدور ؟ إن كان كذلك فالدوران مع أم عكس عقارب الساعة ؟ لن تستطيع التحديد . لهذا في برنامجنا وحتى يبدو الدوران واقعياً ، سنعتمد اسلوب نقطتين بلون والثالثة بلون مخالف , مع أن هذه الخطوة ستكلفنا غالياً لكن مقابل أن نراها تدور باتجاه واحد .
في البداية قم بفك المستطيل أعلاه حتى تحصل على خط مستقيم ، هذا سيمثل لنا المصفوفة التي سنتعامل معها ( فعلياً الألوان هي التي ستخزن في المصفوفة ) .

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

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

وفي ++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);
انظر ماذا أصبح لدينا :

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

الآن سنترجم الصورة السابقة إلى كود :
لطباعة السطر الأول نحتاج لدوران من 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;
}
}
◄ سبحانك لا علم لنا إلا ما علمتنا إنك أنت العليم الحكبم
◄ للأمانة العلمية ، يرجى ذكر المصدر عند النقل
الموضوع الأصلي : http://psd-development.com/vb/t537.html


