דלגו לתוכן המרכזי
KitLab
שיעור קודם
קובייה אלקטרונית — מספרים אקראיים· 26 / 41
קובייה אלקטרונית — מספרים אקראיים
🎬

הסרטון בדרך אלינו

בינתיים — התמלול המלא של השיעור מחכה לכם למטה

קובייה אלקטרונית — מספרים אקראיים

מה בשיעור?

  • שלושת שלבי הקובייה
  • מספרים פסאודו-אקראיים — האמת על אקראיות במחשב
  • זרע האקראיות ולמה בלעדיו הכול חוזר
  • רעש מפין צף — פעם בעיה, פעם פתרון
  • random(1,7) מחזירה 1 עד 6

מה נלמד כאן

  • איך מייצרים מספר אקראי
  • מה זה זרע אקראיות ולמה בלעדיו הכול חוזר על עצמו
  • לבנות קובייה אלקטרונית

קובייה בלי קובייה

קובייה היא אביזר משחק בסיסי: מטילים, ומקבלים מספר אקראי שקובע את המהלך.

קובייה אלקטרונית

בשיעור הזה נבנה קובייה אלקטרונית: לוחצים על כפתור, ומספר בין 1 ל-6 מופיע על התצוגה.


הידע שצריך

1. שלושת שלבי הקובייה

1. הדק — השחקן לוחץ ומתחיל "הטלה" 2. הגרלה — הלוח מייצר מספר שלם אקראי בין 1 ל-6 3. תצוגה — התוצאה מוצגת על תצוגת המקטעים

2. מספרים אקראיים — והאמת עליהם

מספרים אקראיים מייצרים ערכים בלתי צפויים בטווח נתון. משתמשים בהם להטלת קובייה, להגרלות, לאירועים אקראיים במשחקים ולהתנהגות של רובוטים.

אבל יש כאן סוד שחשוב להבין:

⚠️ מחשב לא יודע לייצר אקראיות אמיתית. מה שהוא מייצר הוא סדרה שנראית אקראית — תוצאה של חישוב מתמטי. אלה נקראים מספרים פסאודו-אקראיים.

3. זרע האקראיות

נקודת ההתחלה של הסדרה נקבעת על ידי מספר שנקרא זרע (seed).

וכאן הבעיה: אם הזרע זהה בכל הפעלה — הסדרה תהיה זהה בכל פעם. תפעילו את הקובייה שלוש פעמים, ותקבלו בדיוק את אותם מספרים בדיוק באותו סדר. קובייה כזו חסרת ערך.

הפתרון — ובו הרעיון היפה של השיעור

randomSeed(analogRead(34));

קוראים פין אנלוגי שלא מחובר לכלום.

פין צף כזה קולט רעש חשמלי אקראי מהסביבה — בדיוק אותו "זבל" שבשיעור 4 היה בעיה שהיינו צריכים לפתור עם Pull-Up. כאן הזבל הזה הוא בדיוק מה שאנחנו רוצים. הוא שונה בכל הפעלה, ולכן הסדרה שונה בכל הפעלה.

אותה תופעה פיזיקלית — פעם בעיה, פעם פתרון. זה שווה לעצור עליו רגע.

4. התבנית

void setup() {
  randomSeed(analogRead(pin));       // פין שלא מחובר
}

void loop() {
  int randNum = random(min, max);    // מספר בין min ל-max-1
}

⚠️ random(1, 7) מחזירה 1 עד 6, לא 1 עד 7. הגבול העליון לא נכלל. זו טעות נפוצה מאוד — לקובייה צריך random(1, 7).


הניסוי

המטרה: לחיצה מגרילה מספר בין 1 ל-6 ומציגה אותו.

רשימת רכיבים

הרכיב כמות
לוח ESP32 1
לוח ניסוי 400 נקודות 1
תצוגת שבעה מקטעים 1
לחצן 1
נגד 220Ω 8
נגד 10kΩ 1

התרשים החשמלי

התרשים החשמלי

החיבור

חיבור הרכיבים


הקוד

int pin_a = 5;   int pin_b = 16;  int pin_c = 17;  int pin_d = 18;
int pin_e = 19;  int pin_f = 23;  int pin_g = 12;  int pin_dp = 13;
int pin_array[8] = {pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, pin_dp};

int number_array[][8] = {
  {1, 1, 1, 1, 1, 1, 0, 0},  // 0
  {0, 1, 1, 0, 0, 0, 0, 0},  // 1
  {1, 1, 0, 1, 1, 0, 1, 0},  // 2
  {1, 1, 1, 1, 0, 0, 1, 0},  // 3
  {0, 1, 1, 0, 0, 1, 1, 0},  // 4
  {1, 0, 1, 1, 0, 1, 1, 0},  // 5
  {1, 0, 1, 1, 1, 1, 1, 0},  // 6
  {1, 1, 1, 0, 0, 0, 0, 0},  // 7
  {1, 1, 1, 1, 1, 1, 1, 0},  // 8
  {1, 1, 1, 1, 0, 1, 1, 0}   // 9
};

#define BUTTON_PIN 14
int currentNumber = 0;

void display_number(int num) {
  if (num < 0 || num > 9) return;      // הגנה מפני ערך לא חוקי
  for (int i = 0; i < 8; i++) {
    digitalWrite(pin_array[i], number_array[num][i]);
  }
}

void setup() {
  for (int i = 0; i < 8; i++) {
    pinMode(pin_array[i], OUTPUT);
    digitalWrite(pin_array[i], 0);
  }
  pinMode(BUTTON_PIN, INPUT);
  randomSeed(analogRead(34));          // זרע מרעש של פין לא מחובר
}

void loop() {
  if (digitalRead(BUTTON_PIN) == LOW) {
    delay(200);                              // ריטוט
    while (digitalRead(BUTTON_PIN) == LOW);  // המתנה לשחרור
    currentNumber = random(1, 7);            // 1 עד 6
    display_number(currentNumber);
  }
}

שימו לב לשורת ההגנה:

if (num < 0 || num > 9) return;

אם מישהו יקרא לפונקציה עם 15, היא תצא בשקט במקום לגשת למקום לא קיים במערך. זו הגנה שכדאי לכתוב בכל פונקציה שמקבלת אינדקס.

מה אמור לקרות

הקובייה מציגה תוצאה


נסו בעצמכם

  • הסירו את randomSeed והפעילו מחדש כמה פעמים. אותם מספרים? עכשיו הבנתם למה הוא שם.
  • הוסיפו אנימציית הטלה: ספרות מתחלפות מהר לחצי שנייה לפני שהתוצאה נעצרת.
  • בנו שתי קוביות עם תצוגת ארבע הספרות.
  • הוסיפו זמזם שמצפצף בכל הטלה.
  • ספרו 100 הטלות ובדקו: כמה פעמים יצא כל מספר? מתחלק אחיד?

🧰 הרכיבים לשיעור הזה

רוצים את חומרי הקורס והעדכונים?

נשלח למייל את קובצי הקוד, החומרים ועדכונים על שיעורים חדשים. בלי ספאם.