איקס עיגול|בדיקה האם יש מנצח|js
-
הקוד שלי שגוי, כי ב
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; } }
-
D dovid התייחס לנושא זה ב
-
@dovid
תודה רבה על המענה המפורט,כאן כתבת
@dovid כתב באיקס עיגול|בדיקה האם יש מנצח|js:
if (allData[1].value === allData[1].value == allData[2].value) {
השוואה אחת עם 2 = ואחת עם 3 =
בדקתי באמת ורק ככה זה עובד,
עריכה: זה גם לא עובד, הפתרון הוא כדלקמן, לעשות פשוט שתי השוואות שונות
אבל אשמח אם תוכל להסביר יותר למה זה לא השוואה שווה אלא אחד == ואחד === ?
ולמה אם אני משווה === בין 3 ערכים שווים יוצא false? -
@dovid כתב באיקס עיגול|בדיקה האם יש מנצח|js:
@צדיק-תמים כי השוואה האחרונה היא מול תוצאת ההשוואה שקדמה לה.
ההשוואה הראשונה מחזירה true, וtrue !== 1.אז בעצם איך לעשות את התנאי?
אם אני רוצה להשוואת בין 3 דברים?
אני משווה רק בין שתיים?
או שיש דרך בין 3 גם?
כי אם כשאני משווה בין 3 ככהa === b
יוצא true
ואז אני ממשיך ומשלים לa === b == c
אז אני בעצם משווה בין true לc
ואמור לצאת false , רק בגלל ששמתי == זה סתם ענה לי true,
כלומר אין לי דרך להשוואת בין 3 ערכים מלבד לעשותa === b & b === c
אני צודק?
או שפיספסתי משהו? -
@צבי-ש כתב באיקס עיגול|בדיקה האם יש מנצח|js:
ואמור לצאת false , רק בגלל ששמתי == זה סתם ענה לי true,
זה לא סתם ענה לך, זה ענה לך true בגלל שבJS (כמו בC) אז 1 == true.
ניצלתי את זה לצרכים שלנו.
אם מדובר בהשוואה אחרת שאינה כוללת רק 1 0 כמו פה, כלומר 2 == 2 == 2 זה אכן לא יעבוד, וחייבים לעשות && ולכפול את ההשוואה.נ.ב. שים לב להשתמש ב&& במקום ב& למרות שנראה שגם השני עובד.
& בודד זה Bitwise AND וזה גם יקר יותר בביצועים וגם יכול להביא תוצאות שגויות (למשל 2 & 1 יחזיר 0 במקום 1)
אם הנושא הזה (או נושא אחר) מעניין אותך פתח נושא ייעודי.