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

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

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

איקס עיגול|בדיקה האם יש מנצח|js

מתוזמן נעוץ נעול הועבר תכנות
12 פוסטים 5 כותבים 436 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    השיב לצבי-ש ב נערך לאחרונה על ידי dovid
    #2

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

     if (allData[1].value === allData[0].value && allData[2].value === allData[0].value){
    

    פה אתה בודק את שורה 1, אתה קודם משווה את אלמנט 1 עם 0, ואח"כ את 2 עם 0.
    זה בגלל שיש לך בראש שהשוואה עושים רק 1:1, אולם אתה יכול לקצר ולכתוב ככה:

     if (allData[1].value === allData[1].value == allData[2].value) {
    

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

    function compareLine(array){
           return array[0].value == array[1].value == array[2].value;
    }
    

    בקוד הקורא, ניצלנו משורה ארוכה, אבל עדיין שאלתך עומדת לגבי if שמונה פעמים.
    באמת אלגנטי יותר לולאה בכזה מקרה. אתה מכין מערך של 8 רצפים, ובודק את כולם בלולאה. כשיש התאמה אתה מכריז ניצחון:

    function checkRuls(array){
         const listWin = [ 
                [0,1,2], [3,4,5], [6,7,8], //rows
                [0,3,6], [1,4,7], [2,5,8], //cols
                [0,4,8], [2,4,6]  //alachsonim 
         ];
         for(arr of listWin)
             if(compareLine(arr)) {
                    console.log(`winner ${arr[0].value} by ${arr}");
                    return true;
             }
    }
    

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

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

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

    dovidD צבי-שצ 2 תגובות תגובה אחרונה
    7
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      השיב לdovid ב נערך לאחרונה על ידי
      #3

      הקוד שלי שגוי, כי בcompareLine(arr) אני מעביר מערך שנראה ככה: [0,1,2] שזה סתם מספרים ולא אלמנט שאפשר לבדוק את הvalue שלו.
      לכן צריך לתקן את הקוד ככה:

      function checkRuls(array){
           const listWin = [ 
                  [0,1,2], [3,4,5], [6,7,8], //rows
                  [0,3,6], [1,4,7], [2,5,8], //cols
                  [0,4,8], [2,4,6]  //alachsonim 
           ];
      
           for(arr of listWin) {
               const elArr = [allData[arr[0]], allData[arr[1]], allData[arr[2]]];
               if(compareLine(arr)) {
                      console.log(`winner ${arr[0].value} by ${arr}");
                      return true;
               }
           }
      }
      

      אפשר לעשות את זה אלגנטית עם map שבעצם ממיר כל איבר במערך לאיבר אחר רצוי:

      function checkRuls(array){
           const listWin = [ 
                  [0,1,2], [3,4,5], [6,7,8], //rows
                  [0,3,6], [1,4,7], [2,5,8], //cols
                  [0,4,8], [2,4,6]  //alachsonim 
           ];
           for(arr of listWin)
               if(compareLine(arr.map(x => allData[x]))) {
                      console.log(`winner ${arr[0].value} by ${arr}");
                      return true;
               }
      }
      

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

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

      תגובה 1 תגובה אחרונה
      3
      • dovidD dovid התייחס לנושא זה ב
      • צבי-שצ מחובר
        צבי-שצ מחובר
        צבי-ש
        השיב לdovid ב נערך לאחרונה על ידי צבי-ש
        #4

        @dovid
        תודה רבה על המענה המפורט,

        כאן כתבת

        @dovid כתב באיקס עיגול|בדיקה האם יש מנצח|js:

        if (allData[1].value === allData[1].value == allData[2].value) {

        השוואה אחת עם 2 = ואחת עם 3 =

        בדקתי באמת ורק ככה זה עובד,
        עריכה: זה גם לא עובד, הפתרון הוא כדלקמן, לעשות פשוט שתי השוואות שונות
        אבל אשמח אם תוכל להסביר יותר למה זה לא השוואה שווה אלא אחד == ואחד === ?
        ולמה אם אני משווה === בין 3 ערכים שווים יוצא false?

        כיף לגלות דברים חדשים.
        חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

        dovidD תגובה 1 תגובה אחרונה
        1
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          השיב לצבי-ש ב נערך לאחרונה על ידי dovid
          #5

          @צבי-ש טעות כתיב שלי.
          אני תמיד כותב == בגלל הרגל מC#, בJS יש כאלה שמטיפים להשתמש תמיד בשלוש כי זה חוסך השוואות לא נכונות של טיפוסים "דומים" כמו "123" == 123.

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

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

          צדיק תמיםצ תגובה 1 תגובה אחרונה
          0
          • צדיק תמיםצ מנותק
            צדיק תמיםצ מנותק
            צדיק תמים
            השיב לdovid ב נערך לאחרונה על ידי צדיק תמים
            #6

            @dovid מה שצבי כתב זה שמה שכתבת עובד רק עם == ולא עם ===:
            88ba3efe-1255-4141-b31a-231990efa322-CleanShot 2023-02-23 at 15.03.13@2x.png
            למה באמת?

            Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
            טיפים

            dovidD תגובה 1 תגובה אחרונה
            1
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              השיב לצדיק תמים ב נערך לאחרונה על ידי dovid
              #7

              @צדיק-תמים כי השוואה האחרונה היא מול תוצאת ההשוואה שקדמה לה.
              ההשוואה הראשונה מחזירה true, וtrue !== 1.

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

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

              צבי-שצ תגובה 1 תגובה אחרונה
              5
              • צבי-שצ מחובר
                צבי-שצ מחובר
                צבי-ש
                השיב לdovid ב נערך לאחרונה על ידי צבי-ש
                #8

                @dovid כתב באיקס עיגול|בדיקה האם יש מנצח|js:

                @צדיק-תמים כי השוואה האחרונה היא מול תוצאת ההשוואה שקדמה לה.
                ההשוואה הראשונה מחזירה true, וtrue !== 1.

                אז בעצם איך לעשות את התנאי?
                אם אני רוצה להשוואת בין 3 דברים?
                אני משווה רק בין שתיים?
                או שיש דרך בין 3 גם?
                כי אם כשאני משווה בין 3 ככה

                a === b
                

                יוצא true
                ואז אני ממשיך ומשלים ל

                a === b == c
                

                אז אני בעצם משווה בין true לc
                ואמור לצאת false , רק בגלל ששמתי == זה סתם ענה לי true,
                כלומר אין לי דרך להשוואת בין 3 ערכים מלבד לעשות

                a === b & b === c
                

                אני צודק?
                או שפיספסתי משהו?

                כיף לגלות דברים חדשים.
                חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

                dovidD תגובה 1 תגובה אחרונה
                3
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  השיב לצבי-ש ב נערך לאחרונה על ידי dovid
                  #9

                  @צבי-ש כתב באיקס עיגול|בדיקה האם יש מנצח|js:

                  ואמור לצאת false , רק בגלל ששמתי == זה סתם ענה לי true,

                  זה לא סתם ענה לך, זה ענה לך true בגלל שבJS (כמו בC) אז 1 == true.
                  ניצלתי את זה לצרכים שלנו.
                  אם מדובר בהשוואה אחרת שאינה כוללת רק 1 0 כמו פה, כלומר 2 == 2 == 2 זה אכן לא יעבוד, וחייבים לעשות && ולכפול את ההשוואה.

                  נ.ב. שים לב להשתמש ב&& במקום ב& למרות שנראה שגם השני עובד.
                  & בודד זה Bitwise AND וזה גם יקר יותר בביצועים וגם יכול להביא תוצאות שגויות (למשל 2 & 1 יחזיר 0 במקום 1)
                  אם הנושא הזה (או נושא אחר 🙂 ) מעניין אותך פתח נושא ייעודי.

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

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

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

                    פתאום אני קולט שזה לא עבד לך... חשבתי שvalue זה true\false...
                    מה זה מכיל? אם זה מכיל טקסט כמו X או O, אז אכן אתה חייב שני השוואות.

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

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

                    צבי-שצ תגובה 1 תגובה אחרונה
                    2
                    • צבי-שצ מחובר
                      צבי-שצ מחובר
                      צבי-ש
                      השיב לdovid ב נערך לאחרונה על ידי
                      #11

                      @dovid כתב באיקס עיגול|בדיקה האם יש מנצח|js:

                      פתאום אני קולט שזה לא עבד לך... חשבתי שvalue זה true\false...

                      לא, זה אכן טקסט, ולכן לא הבנתי ..

                      כיף לגלות דברים חדשים.
                      חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

                      Y.Excel.AccessY תגובה 1 תגובה אחרונה
                      1
                      • Y.Excel.AccessY מנותק
                        Y.Excel.AccessY מנותק
                        Y.Excel.Access
                        השיב לצבי-ש ב נערך לאחרונה על ידי Y.Excel.Access
                        #12

                        @צבי-ש נשמח לראות את התוצאה אחרי שתגמור לקודד ולעצב וכו':)

                        Y.Excel.Access @ gmail.com

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

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

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

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