فكرة المشروع:
تعتمد لعبة الذاكرة على اختبار قدرة اللاعب على تذكّر تسلسل الإضاءة. عند تشغيل اللعبة، تومض اللمبات الأربع مع صوت الطنان خمس مرات كإشارة لبدء اللعبة. بعد ذلك، تضيء لمبة واحدة عشوائيًا، ويُمنح اللاعب مهلة قصيرة (حوالي ثانيتين) للضغط على زر اللمبة الصحيحة.
في المرحلة التالية، تُعاد إضاءة نفس اللمبة ثم تضاف لمبة أخرى، ويجب على اللاعب الضغط على الأزرار بالترتيب الصحيح. مع كل مرحلة جديدة، يزداد التسلسل بإضافة لمبة جديدة، وقد تتكرر بعض اللمبات، مما يتطلب تركيزًا أعلى لتذكّر النمط بدقة.
في حال التأخر عن الضغط أو إدخال الترتيب بشكل خاطئ، تومض اللمبات الأربع بسرعة مع صوت أسرع للتنبيه بحدوث خطأ. بعد ذلك، تُعرض آخر سلسلة صحيحة من الإضاءة لمساعدة اللاعب على معرفة موضع الخطأ، ثم تُعاد اللعبة من البداية.
الأدوات المستعملة و وظيفة كل أداة:
- Arduino Uno:
العقل المدبر للمشروع، يتحكم في جميع المكونات وينفذ منطق اللعبة وتسلسل الإضاءة. - أزرار ضغط (Push Buttons):تُستخدم لإدخال تفاعل اللاعب، حيث يقوم اللاعب بالضغط على الأزرار لمحاكاة تسلسل الإضاءة.
- طنان ( Active Buzzer):يُستخدم لإصدار أصوات تنبيه عند بدء اللعبة، وكذلك عند الخطأ أو النجاح، مما يزيد من تفاعل اللعبة.
- لمبات LED:تُستخدم لعرض تسلسل الإضاءة الذي يجب على اللاعب تذكّره وتنفيذه.
- أسلاك توصيل:
- Male to Male: لتوصيل المكونات على لوحة التجارب والأردوينو.
- Laptop:
يُستخدم كمصدر طاقة لتشغيل الأردوينو والمكونات الأخرى، بالإضافة إلى كتابة الكود البرمجي وتحميله على الأردوينو. - USB Cable (Type A to B):
يربط اللابتوب بالأردوينو لتغذية الدائرة وبرمجة الأردوينو. - لوحة تجارب (Breadboard):لتجميع الدائرة بدون لحام وتجربة التوصيلات بسهولة.
- المقاومات (Resistors):
- أربع مقاومات (470Ω أو 330Ω): تُستخدم مع اللمبات (LED) لتقليل التيار الكهربائي وحمايتها من التلف، حيث يُوصل أحد طرفي كل مقاومة في نفس مسار الطرف الموجب لكل لمبة.
- أربع مقاومات (10kΩ): تُستخدم مع أزرار الضغط لضمان استقرار الإشارة ومنع القراءات الخاطئة، وتُوصل بجانب الأزرار.
مخطط المشروع:
#define PLAYER_WAIT_TIME 2000 // The time allowed between button presses - 2s
byte sequence[100];
byte curLen = 0;
byte inputCount = 0;
byte lastInput = 0;
byte expRd = 0;
bool btnDwn = false;
bool wait = false;
bool resetFlag = false;
byte soundPin = 5;
byte noPins = 4;
byte pins[] = {2, 13, 10, 8};
long inputTime = 0;
void setup() {
delay(3000);
Serial.begin(9600);
Reset();
}
void setPinDirection(byte dir){
for(byte i = 0; i < noPins; i++){
pinMode(pins[i], dir);
}
}
void writeAllPins(byte val){
for(byte i = 0; i < noPins; i++){
digitalWrite(pins[i], val);
}
}
void beep(byte freq){
analogWrite(soundPin, 2);
delay(freq);
analogWrite(soundPin, 0);
delay(freq);
}
void flash(short freq){
setPinDirection(OUTPUT);
for(int i = 0; i < 5; i++){
writeAllPins(HIGH);
beep(50);
delay(freq);
writeAllPins(LOW);
delay(freq);
}
}
void Reset(){
flash(500);
curLen = 0;
inputCount = 0;
lastInput = 0;
expRd = 0;
btnDwn = false;
wait = false;
resetFlag = false;
}
void Lose(){
flash(50);
}
void playSequence(){
for(int i = 0; i < curLen; i++){
Serial.print("Seq: ");
Serial.print(i);
Serial.print("Pin: ");
Serial.println(sequence[i]);
digitalWrite(sequence[i], HIGH);
delay(500);
digitalWrite(sequence[i], LOW);
delay(250);
}
}
void DoLoseProcess(){
Lose();
delay(1000);
playSequence();
delay(1000);
Reset();
}
void loop() {
if(!wait){
setPinDirection(OUTPUT);
randomSeed(analogRead(A0));
sequence[curLen] = pins[random(0,noPins)];
curLen++;
playSequence();
beep(50);
wait = true;
inputTime = millis();
} else {
setPinDirection(INPUT);
if(millis() - inputTime > PLAYER_WAIT_TIME){
DoLoseProcess();
return;
}
if(!btnDwn){
expRd = sequence[inputCount];
Serial.print("Expected: ");
Serial.println(expRd);
for(int i = 0; i < noPins; i++){
if(pins[i] == expRd)
continue;
if(digitalRead(pins[i]) == HIGH){
lastInput = pins[i];
resetFlag = true;
btnDwn = true;
Serial.print("Read: ");
Serial.println(lastInput);
}
}
}
if(digitalRead(expRd) == 1 && !btnDwn) {
inputTime = millis();
lastInput = expRd;
inputCount++;
btnDwn = true;
Serial.print("Read: ");
Serial.println(lastInput);
} else {
if(btnDwn && digitalRead(lastInput) == LOW){
btnDwn = false;
delay(20);
if(resetFlag){
DoLoseProcess();
} else {
if(inputCount == curLen){
wait = false;
inputCount = 0;
delay(1500);
}
}
}
}
}
}
تشغيل اللعبة على الواقع:
إذا نفذتم المشروع أو عدلتم عليه، شاركونا تجاربكم و ملاحظاتكم في التعليقات 💬





