اصنع لعبة الثعبان باردوينو وشاشة عرض نقطية اكتب تعليقُا

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

مقدمة لعبة الثعبان

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

أصبحت لعبة Snake أيضًا مشروع DIY مشهور جدًا لهواة الإلكترونيات والطلاب. لذلك سنقوم اليوم باستعراض لعبة Arduino Snake ، بكل وظائفها الأساسية ، مع إبقائها بسيطة في نفس الوقت.

المكونات المستخدمة

  1. Arduino UNO
  2. 8×8 LED Dot Matrix Display
  3. Shift Register 74HC595
  4. 16×2 LCD
  5. POT 1K
  6. Push Buttons
  7. Connecting wires
  8. Bread Board
  9. Power Supply

شرح تجربة لعبة الثعبان

هذه لعبة معقدة بعض الشيء للبناء. لكن في هذا المشروع ، قمنا بتسهيل الأمر عليك. للقيام بهذا المشروع ، استخدمنا شاشة عرض نقطية ملونة باللون الأحمر مقاس 8 × 8 لعرض الثعبان ونقطة الطعام الخاصة به ، وشاشة LCD لعرض النقاط أو النتيجة ، و 5 أزرار ضغط لإعطاء الاتجاهات وبدء اللعبة وأخيراً الاردوينو للتحكم في العملية برمتها. 

Untitled
  • عندما نقوم بتشغيل الدائرة ، نعرض أولاً رسالة ترحيب ثم تلميح “اضغط على ابدأ للتشغيل” على شاشة LCD. بعد ذلك ، تُظهر شاشة LCD النتيجة على أنها صفر وعرض مصفوفة نقطية تظهر نقطتين على شكل ثعبان ونقطة واحدة كطعام.
  • يحتاج المستخدم الآن إلى الضغط على الزر الأوسط لبدء اللعبة ويبدأ الثعبان في التحرك في الاتجاه التصاعدي افتراضيًا. ثم يحتاج المستخدم إلى إعطاء التوجيه للثعبان بالضغط على “مفاتيح الاتجاه” حول الزر الأوسط. استخدمنا هنا خمسة مفاتيح (أزرار ضغط) وهي المفتاح الأيسر والمفتاح الأيمن والمفتاح الأعلى ومفتاح الأسفل ومفتاح البدء.
  • فيحين  وصل الثعبان إلى نقطة الطعام أو أكل الطعام ، تزداد النتيجة بمقدار 5 نقاط في كل مرة ويزداد طول الثعبان بنقطة واحدة (LED) في كل مرة ، كما تصبح سرعة الثعبان أسرع من ذي قبل. وعندما تضرب الأفعى أي جدار أو تصل إلى نهاية مصفوفة LED ، فإنها ستنهي اللعبة (“انتهت اللعبة”). ثم يحتاج المستخدم لبدء اللعبة مرة أخرى بالضغط على مفتاح البدء.
snake-game-using-arduino-Block-Diagram

شرح الدائرة العملية للعبة الثعبان

  • دائرة مشروع لعبة الثعبان هذا معقدة بعض الشيء. هنا قمنا بتوصيل شاشة عرض نقطية باستخدام Shift Register 74HC595.
  • كما يتم هنا استخدام اثنين من سجلات التحول ، أحدهما لقيادة الأعمدة والثاني لقيادة الصفوف. ترتبط اطراف التحكم في كل من المسجلات ، وسجل تحويل العمود وسجل إزاحة الصف (SH ، ST) ، مباشرة بالمنافذ الرقمية 14 و 16 في الاردوينو .
  • ويرتبط طرف DS الخاص بسجل تحويل العمود وسجل إزاحة الصف مباشرة بالمنفذين 15 و 17 في الاردوينو .
  • زر البدء لبدء اللعبة متصل بالمنفذ 3 وزر الاتجاه الأيسر عند الطرف 4 وزر الاتجاه الأيمن عند الطرف 6 وزر الاتجاه لأعلى عند الطرف 2 وزر الاتجاه السفلي عند الطرف 5.
  • توصيل اطراف RS و EN مباشرة عند المنافذ 13 و 12.
  • يوجد طرف RW مؤرض مباشرة. وترتبط اطراف  البيانات d4-d7 في المنافذ 11 و 10 و 9 و 8 من الاردوينو .
  • يتم عرض باقي الاتصال في مخطط الدائرة ادناه .
snake-game-using-arduino-circuit-Diagram
تنبيه : في حال لم تكن متأكد من قدرتك على تنفيذ خطوات المشروع يرجى استشارة شخص متخصص في هذا المجال.
لتحميل الكود البرمجي اضغط هنا

الكود البرمجي للمشروع

#include<LiquidCrystal.h>
LiquidCrystal lcd(13,12,11,10,9,8);

#define ds_col 15
#define sh_col 16
#define st_col 14
#define ds_row 17

#define start 3
#define up 2
#define down 5
#define left 4
#define right 6

char Col[21],Row[21],move_c,move_r;
int colum_data(int temp)
{
switch(temp)
{
case 1: return 1;break;
case 2: return 2; break;
case 3: return 4; break;
case 4: return 8; break;
case 5: return 16; break;
case 6: return 32; break;
case 7: return 64; break;
case 8: return 128; break;
default: return 0; break;
}
}

int row_data(int temp)
{
switch(temp)
{
case 1: return 1;break;
case 2: return 2; break;
case 3: return 4; break;
case 4: return 8; break;
case 5: return 16; break;
case 6: return 32; break;
case 7: return 64; break;
case 8: return 128; break;
default: return 0; break;
}
}

void read_button()
{
if(!digitalRead(left))
{
move_r=0;
move_c!=-1 ? move_c=-1 : move_c=1;
while(!digitalRead(left));
}

 if(!digitalRead(right))
{
move_r=0;
move_c!=1 ? move_c=1 : move_c=-1;
while(!digitalRead(right));
}

 if(!digitalRead(up))
{
move_c=0;
move_r!=-1 ? move_r=-1 : move_r=1;
while(!digitalRead(up));
}

 if(!digitalRead(down))
{
move_c=0;
move_r!=1 ? move_r=1 : move_r=-1;
while(!digitalRead(down));
}
}

void show_snake(int temp)
{
for(int n=0;n<temp;n++)
{
int r,c;
for(int k=0;k<21;k++)
{
int temp1=Col[k];
c=colum_data(temp1);
int temp2=Row[k];
r=0xff-row_data(temp2);
for(int i=0;i<8;i++)
{
int ds=(c & 0x01);
digitalWrite(ds_col, ds);
ds=(r & 0x01);
digitalWrite(ds_row, ds);
digitalWrite(sh_col, HIGH);
c>>=1;
r>>=1;
digitalWrite(sh_col, LOW);
}
digitalWrite(st_col, HIGH);
digitalWrite(st_col, LOW);
read_button();
delayMicroseconds(500);
}
}
}

void setup()
{
lcd.begin(16,2);
pinMode(ds_col, OUTPUT);
pinMode(sh_col, OUTPUT);
pinMode(st_col, OUTPUT);
pinMode(ds_row, OUTPUT);
pinMode(start, INPUT);
pinMode(up, INPUT);
pinMode(down, INPUT);
pinMode(left, INPUT);
pinMode(right, INPUT);
digitalWrite(up, HIGH);
digitalWrite(down, HIGH);
digitalWrite(left, HIGH);
digitalWrite(right, HIGH);
digitalWrite(start, HIGH);
lcd.setCursor(0,0);
lcd.print(”  Snake game    “);
lcd.setCursor(0,1);
lcd.print(“Circuit Digest  “);
delay(2000);
lcd.setCursor(0,0);
lcd.print(”   Press Start  “);
lcd.setCursor(0,1);
lcd.print(”     To Play    “);
delay(2000);
}

void loop()
{
int j,k,Speed=40,score=0;
j=k=move_c=0;
move_r=1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Score: “);
lcd.print(score);
while(1)
{
for(int i=3;i<21;i++)
{
Row[i]=100;
Col[i]=100;
}
Row[0]=rand()%8+1;
Col[0]=rand()%8+1;
Row[1]=1;
Col[1]=1;
Row[2]=2;
Col[2]=1;
j=2,k=1;
while(k==1)
{
move_c=0;
move_r=1;
show_snake(1);
lcd.setCursor(7,0);
lcd.print(score);
if(!digitalRead(start))
{
k=2;
Speed=40;
score=0;
}
}

while(k==2)
{
show_snake(Speed);
if(Row[1]>8 || Col[1]>8 || Row[1]<0 || Col[1]<0)
{
Row[1]=1;
Col[1]=1;
k=1;
lcd.setCursor(0,1);
lcd.print(“Game Over”);
delay(5000);
score=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Score: “);
lcd.print(score);
}

        if(Row[0]==Row[1]+move_r  &&  Col[0]==Col[1]+move_c)
{
j++;
Speed-=2;
score=score+5;
lcd.setCursor(7,0);
lcd.print(score);
Row[0]=rand()%8+1;
Col[0]=rand()%8+1;
}

  for(int i=j;i>1;i–)
{
Col[i]=Col[i-1];
Row[i]=Row[i-1];
}
Col[1]=Col[2]+move_c;
Row[1]=Row[2]+move_r;
}
}
}

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *