<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[איקס עיגול בJS, שמירת כל המצבים במשתנה מספרי אחד]]></title><description><![CDATA[<p dir="auto">אגב לשאלתו של <a class="plugin-mentions-user plugin-mentions-a" href="/user/%D7%A6%D7%91%D7%99-%D7%A9">@<bdi>צבי-ש</bdi></a><br />
<a href="https://tchumim.com/topic/14712">https://tchumim.com/topic/14712</a></p>
<p dir="auto">סתם למען הספורט (ממ... וגם אולי מישהו ילמד משהו מזה) אכתוב דרך אחרת</p>
<p dir="auto">הרעיון הוא שמכיון שיש לך 9 קוביות שלכל אחד מהם יש רק שני מצבים אפשריים, אפשר לייצג את ה-state של כל צד במשחק בתוך מספר אחד. כל ביט במספר מייצג קוביה אחת. אם הביט כבוי סימן שאין לו</p>
<blockquote>
<p dir="auto"><img src="https://tchumim.com/assets/plugins/nodebb-plugin-emoji/emoji/android/2139.png?v=7e7f719145c" class="not-responsive emoji emoji-android emoji--information_source" style="height:23px;width:auto;vertical-align:middle" title=":information_source:" alt="ℹ" /> גודל מספר ב-JS הוא 64 ביטים, אבל לצורך פעולות שאני הולך לעשות אפשר להשתמש רק ב-32 ביטים הראשונים, לצרכך היה מספיק משתנה בעל 16 ביטים, אבל אין את זה ב-JS, למען ה"שטיק" הייתי יכול להכניס את שני צדדי המשחק במספר אחד, אבל זה סתם מיותר</p>
</blockquote>
<p dir="auto">מהלך המשחק נראה כך:</p>
<pre><code>const listWin = [
    7,  56, 448, 73,
  146, 292, 273, 84
];

function checkWin (board) {
  return listWin.some(win =&gt; (board &amp; win) === win);
}

let user = 0;

function toggleUser () {
  user ^= 1;
};

const boards = [0, 0];
const userNames = ['X', 'O'];

function doTurn (i) {
  boards[user] |= (1 &lt;&lt; i);
  if (checkWin(boards[user])) {
    console.log(`${userNames[user]} wins!`);
    // TODO: signal end of game
    return;
  }
  toggleUser();
}
</code></pre>
<p dir="auto">בכל לחיצה אתה קורא <code>doTurn</code> עם מספר הקובייה שנבחרה</p>
<blockquote>
<p dir="auto"><img src="https://tchumim.com/assets/plugins/nodebb-plugin-emoji/emoji/android/26a0.png?v=7e7f719145c" class="not-responsive emoji emoji-android emoji--warning" style="height:23px;width:auto;vertical-align:middle" title=":warning:" alt="⚠" /> לא מיממשתי לוגיקה שבודק אם קובייה כבר מלאה, וכן לא מימשתי לוגיקה שיודע לצייר את הקוביות בהינתן שני מספרים שמייצגים את מצב המשחק</p>
</blockquote>
<p dir="auto">תהליך היצירה של <code>listWin</code> נראה ככה:</p>
<pre><code>function makeWinList () {
  function pack ([x, y, z]) {
    return (1 &lt;&lt; x) | (1 &lt;&lt; y) | (1 &lt;&lt; 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);
}
</code></pre>
<p dir="auto">הפוסט הזה איך שכתבתי אותו לא שימושי למי שלא מכיר משחקי ביטים<br />
אולי בהמשך אכתוב הסבר ממצה</p>
]]></description><link>https://tchumim.com/topic/14716/איקס-עיגול-בjs-שמירת-כל-המצבים-במשתנה-מספרי-אחד</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 16:32:53 GMT</lastBuildDate><atom:link href="https://tchumim.com/topic/14716.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Feb 2023 09:20:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to איקס עיגול בJS, שמירת כל המצבים במשתנה מספרי אחד on Thu, 23 Feb 2023 09:24:13 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/yossiz">@<bdi>yossiz</bdi></a> מדהים.<br />
יש לציין שזה בעצם גם עונה לשאלה שנשאלה שמה, כי זה חוסך את כל התנאים, כל מצב של ניצחון הופך למספר בודד, וצריך לבדוק עם המצב הנוכחי הוא ברשימה.</p>
]]></description><link>https://tchumim.com/post/150482</link><guid isPermaLink="true">https://tchumim.com/post/150482</guid><dc:creator><![CDATA[dovid]]></dc:creator><pubDate>Thu, 23 Feb 2023 09:24:13 GMT</pubDate></item></channel></rss>