فكرة المشروع:
يعتمد هذا المشروع على تنفيذ لعبة الثعبان باستخدام الأردوينو، حيث يبدأ اللعب عند الضغط على زر الـ joystick. يتحرك الثعبان تلقائيًا على الشاشة، ويتم التحكم باتجاهه من خلال تحريك الجويستك.
مع كل مرة يلتقط فيها الثعبان الطعام، يزداد طوله وتزداد النقاط. عند اصطدام الثعبان بحواف الشاشة أو بجسمه، تتوقف اللعبة ويُعرض عدد النقاط (Score) على الشاشة.
الأدوات المستعملة و وظيفة كل أداة:
- Arduino Uno: العقل المدبر للمشروع، يتحكم في كل الأجهزة المتصلة.
- Joystick Module: يستخدم لإدخال كلمة المرور عن طريق الحركة في الاتجاهات المختلفة.
- 16x2 LCD Screen: لعرض الرسائل والإشعارات للمستخدم.
- أسلاك توصيل:
- Male to Male: لتوصيل المكونات على لوحة التجارب و الأردوينو.
- Male to Female: لتوصيل الأردوينو ولوحة التجارب بالمكونات الخارجية مثل الشاشة أو الجويستك.
- Laptop: يُستخدم كمصدر طاقة لتشغيل الأردوينو والمكونات الأخرى، وأيضاً لكتابة الكود وتحميله على الأردوينو.
- USB Cable (Type A to B): يربط اللابتوب بالأردوينو لتغذية الدائرة وبرمجة الأردوينو.
- لوحة تجارب (Breadboard): لتجميع الدائرة بدون لحام وتجربة الاتصالات.
مخطط المشروع:
شرح الكود بالتفصيل لفهم طريقة العمل وإمكانية تعديل الإعدادات:
الكود الأساسي للتشغيل على الأردوينو:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Joystick pins
#define VRX_PIN A3
#define VRY_PIN A1
#define SW_PIN 2
// Game variables
int snake_x[32];
int snake_y[32];
int snake_length = 3;
int food_x, food_y;
int direction = 1; // 0=Up,1=Right,2=Down,3=Left
int game_speed = 150;
bool game_over = false;
// Last tail position (for flicker fix)
int last_tail_x, last_tail_y;
// Snake block
byte block[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
void setup() {
lcd.init();
lcd.backlight();
lcd.createChar(0, block);
pinMode(SW_PIN, INPUT_PULLUP);
randomSeed(analogRead(A0));
lcd.setCursor(2, 0);
lcd.print("Arduino Snake");
lcd.setCursor(1, 1);
lcd.print("Press to Start");
while (digitalRead(SW_PIN) == HIGH);
delay(300);
init_game();
}
void init_game() {
lcd.clear();
snake_length = 3;
direction = 1;
game_over = false;
snake_x[0] = 5; snake_y[0] = 0;
snake_x[1] = 4; snake_y[1] = 0;
snake_x[2] = 3; snake_y[2] = 0;
generate_food();
}
void generate_food() {
bool valid;
do {
valid = true;
food_x = random(0, 16);
food_y = random(0, 2);
for (int i = 0; i < snake_length; i++) {
if (snake_x[i] == food_x && snake_y[i] == food_y) {
valid = false;
break;
}
}
} while (!valid);
}
void update_direction() {
int x = analogRead(VRX_PIN);
int y = analogRead(VRY_PIN);
const int dead_low = 400;
const int dead_high = 600;
if (x < dead_low && direction != 1) direction = 3; // Left
else if (x > dead_high && direction != 3) direction = 1; // Right
else if (y < dead_low && direction != 2) direction = 0; // Up
else if (y > dead_high && direction != 0) direction = 2; // Down
}
void move_snake() {
last_tail_x = snake_x[snake_length - 1];
last_tail_y = snake_y[snake_length - 1];
for (int i = snake_length - 1; i > 0; i--) {
snake_x[i] = snake_x[i - 1];
snake_y[i] = snake_y[i - 1];
}
if (direction == 0) snake_y[0]--;
if (direction == 1) snake_x[0]++;
if (direction == 2) snake_y[0]++;
if (direction == 3) snake_x[0]--;
}
void check_game_state() {
if (snake_x[0] < 0 || snake_x[0] >= 16 || snake_y[0] < 0 || snake_y[0] >= 2) {
game_over = true;
return;
}
for (int i = 1; i < snake_length; i++) {
if (snake_x[0] == snake_x[i] && snake_y[0] == snake_y[i]) {
game_over = true;
return;
}
}
if (snake_x[0] == food_x && snake_y[0] == food_y) {
snake_length++;
generate_food();
if (game_speed > 60) game_speed -= 5;
}
}
void draw_game() {
// erase tail only
lcd.setCursor(last_tail_x, last_tail_y);
lcd.print(" ");
// draw food
lcd.setCursor(food_x, food_y);
lcd.print("*");
// draw head
lcd.setCursor(snake_x[0], snake_y[0]);
lcd.write(0);
}
void loop() {
if (!game_over) {
update_direction();
move_snake();
check_game_state();
draw_game();
delay(game_speed);
} else {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("GAME OVER");
lcd.setCursor(1, 1);
lcd.print("Score: ");
lcd.print(snake_length - 3);
while (digitalRead(SW_PIN) == HIGH);
delay(500);
init_game();
}
}
تشغيل اللعبة على الواقع:
إذا نفذتم المشروع أو عدلتم عليه، شاركونا تجاربكم و ملاحظاتكم في التعليقات 💬






