דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. איקס עיגול בJS, שמירת כל המצבים במשתנה מספרי אחד

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

מתוזמן נעוץ נעול הועבר תכנות
2 פוסטים 2 כותבים 261 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מנותק
    yossizY מנותק
    yossiz
    כתב ב נערך לאחרונה על ידי yossiz
    #1

    אגב לשאלתו של @צבי-ש
    https://tchumim.com/topic/14712

    סתם למען הספורט (ממ... וגם אולי מישהו ילמד משהו מזה) אכתוב דרך אחרת

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

    ℹ גודל מספר ב-JS הוא 64 ביטים, אבל לצורך פעולות שאני הולך לעשות אפשר להשתמש רק ב-32 ביטים הראשונים, לצרכך היה מספיק משתנה בעל 16 ביטים, אבל אין את זה ב-JS, למען ה"שטיק" הייתי יכול להכניס את שני צדדי המשחק במספר אחד, אבל זה סתם מיותר

    מהלך המשחק נראה כך:

    const listWin = [
        7,  56, 448, 73,
      146, 292, 273, 84
    ];
    
    function checkWin (board) {
      return listWin.some(win => (board & win) === win);
    }
    
    let user = 0;
    
    function toggleUser () {
      user ^= 1;
    };
    
    const boards = [0, 0];
    const userNames = ['X', 'O'];
    
    function doTurn (i) {
      boards[user] |= (1 << i);
      if (checkWin(boards[user])) {
        console.log(`${userNames[user]} wins!`);
        // TODO: signal end of game
        return;
      }
      toggleUser();
    }
    

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

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

    תהליך היצירה של listWin נראה ככה:

    function makeWinList () {
      function pack ([x, y, z]) {
        return (1 << x) | (1 << y) | (1 << z);
      }
      
      return [
        [0, 1, 2], [3, 4, 5], [6, 7, 8],
        [0, 3, 6], [1, 4, 7], [2, 5, 8],
        [0, 4, 8], [2, 4, 6]
      ].map(pack);
    }
    

    הפוסט הזה איך שכתבתי אותו לא שימושי למי שלא מכיר משחקי ביטים
    אולי בהמשך אכתוב הסבר ממצה

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    dovidD תגובה 1 תגובה אחרונה
    13
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      השיב לyossiz ב נערך לאחרונה על ידי
      #2

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

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      4

      בא תתחבר לדף היומי!
      • התחברות

      • אין לך חשבון עדיין? הרשמה

      • התחברו או הירשמו כדי לחפש.
      • פוסט ראשון
        פוסט אחרון
      0
      • דף הבית
      • קטגוריות
      • פוסטים אחרונים
      • משתמשים
      • חיפוש
      • חוקי הפורום