קוביות הוגנות, משחק הוגן
כל שחקן שש-בש שהפסיד לדאבל בהטלה האחרונה תהה זאת: האם הקוביות האלה הוגנות? זו השאלה הנכונה לשאול על כל אפליקציית שש-בש. הנה בדיוק כיצד הקוביות שלנו נוצרות, מדוע איש, כולל אנחנו, אינו יכול להטות אותן, וכיצד נשמרת יושרתו של שאר המשחק גם כן.
אמתו בעצמכם כל משחק שהסתיים
דיבורים זולים, אז הנה החלק שאתם יכולים להריץ בעצמכם. כשמשחק מסתיים אנחנו חושפים את זרע השרת, את ההתחייבות שפרסמנו לפני ההטלה הראשונה, ואת כל החוליות שכל צד פרסם במהלך המשחק. הדביקו למטה את חבילת החשיפה, או חפשו את המשחק לפי המזהה שלו: הדף הזה גוזר מחדש כל קובייה מתוך אותה רשומה, בדיוק אותו חישוב שהשרתים שלנו הריצו, ומראה לכם הטלה אחר הטלה אם הערכים השמורים תואמים. שום דבר מזה אינו מבקש מכם להאמין לנו במילה: החישוב גלוי וכל אחד יכול לחזור עליו. הדבר היחיד שהדף הזה נמנע מלעשות במכוון הוא להעניק תג ירוק "הוגן באופן שניתן להוכחה", כי בכנות הוא לא יכול לזכות בו. הוא לעולם אינו רואה את הערכים שהמכשיר שלכם רשם ונעל לפני ההטלה הראשונה, ורשומה שכל השרשרת שלה הוחלפה בזיוף מוקפד נגזרת כאן באותה שלמות בדיוק. רק השוואה בית אחר בית מול מה שהמכשיר שלכם נעל יכולה לשלול זאת, ואת הערכים האלה מחזיקה רק האפליקציה שלכם. לכן התקרה הכנה של הדף הזה היא "עקבי", ואת הפסיקה החזקה ביותר יכול לתת לכם מסך האימות באפליקציה.
הקוביות: הוגנות באופן שניתן להוכחה, מוטלות בשרת
כל הטלה במשחק מקוון שהסתיים נוצרת בשרתי המשחק שלנו, והיא הוגנת באופן שניתן להוכחה בלי שתצטרכו להאמין לנו במילה. לפני ההטלה הראשונה אנחנו מפרסמים התחייבות לזרע הסודי שממנו יצאו הקוביות, והאפליקציות של שני השחקנים מתחייבות כל אחת לשרשרת משלה; כל זה מוקפא ברשומה אחת עוד לפני שמישהו מטיל. אחר כך כל הטלה מוציאה חוליה טרייה מהשרשרת של כל צד: מי שתורו מפרסם את שלו בתחילת התור, היריב משחרר את שלו רק אחרי שזו ננעלה, והקובייה נגזרת אחרונה. לכן הקלט האחרון שאינו ידוע בכל קובייה נמצא תמיד בצד השני של הלוח. קוביות הפתיחה אינן יוצאות דופן: אף אחת מהן אינה קיימת עד ששני הצדדים תרמו את שלהם. כל קובייה היא אפוא תוצאה דטרמיניסטית של ערכים שהתחייבו אליהם מראש: אף אחד, ואנחנו בכלל זה, לא יכול לבחור קובייה, להחליף אותה באחרת או להטיל אותה שוב בשקט. זו טענה על הערך של הטלה שהושלמה והיא נעצרת שם: אם משחק מבוטל, אם הודעה מגיעה, ולמי נגמר הזמן, כל אלה מחוץ לה. הכלי שלמעלה גוזר מחדש כל קובייה של משחק שהסתיים מתוך הרשומה שפורסמה, חישוב שכל אחד יכול לחזור עליו. מה שהוא אינו יכול הוא לאשר שהרשומה היא המשחק שלכם: לשם כך דרושים הערכים שהמכשיר שלכם נעל לפני המשחק, ואותם מחזיקה רק האפליקציה שלכם, ולכן הצעד האחרון נעשה במסך האימות באפליקציה.
חשוב לא פחות הוא היכן מתרחשת ההטלה. הקוביות לעולם אינן נוצרות במכשיר שלכם, הטלפון שלכם רק מציג הטלה שהשרת כבר ביצע. החלטת תכנון אחת זו מבטלת את כל משפחת רמאויות הקובייה: אפליקציה ששונתה אינה יכולה להטיל מחדש, קפיצת עיכוב אינה יכולה לשכפל הטלה, ואף תחבולה בצד הלקוח אינה יכולה להציץ במספר הבא, כי המספר הבא אינו נמצא בטלפון שלכם כדי שייקרא: הוא נגזר בשרת, ורק אחרי ששני הצדדים שחררו את החוליה שלהם לאותו תור.
וההטלות לעולם אינן מכוונות. אין «עקומת מעורבות», אין מכניקת קאמבק, אין דחיפה לשחקנים ברצף הפסדים. המחולל אינו יודע ואינו מתעניין מי מנצח.
הלוח: מאומת בכל מהלך ומהלך
קוביות הוגנות לא היו שוות הרבה אילו הלוח עצמו יכול היה לסטות או להיות מחובל, ולכן המשחק רץ על מודל סמכות-שרת נוקשה. המכשיר שלכם לעולם אינו אומר לשרת כיצד נראה הלוח, הוא שולח רק את הכוונה שלכם («הזז את החייל הזה מנקודה 13 לנקודה 8»). השרת בודק את המהלך מול החוקים הרשמיים והלוח הרשמי; מהלכים לא חוקיים פשוט נדחים, ולא משנה מה יטען לקוח ששונה.
אחר כך מגיעה הבדיקה הכפולה: עם כל עדכון מצב השרת משדר טביעת אצבע מהודקת (האש) של מצב הלוח האמיתי. המכשיר שלכם מחשב את אותה טביעת אצבע מהלוח המקומי שלו ומשווה. אם אפילו חייל אחד שונה, הלקוח משליך את העותק שלו ומסתנכרן מחדש מהשרת. כך ניתן להוכיח ששני השחקנים מביטים באותו משחק בכל רגע, אי-סנכרונים מרפאים את עצמם בהלוך ושוב אחד, ואין חלון שבו ניתן לשחק על לוח מיושן או מנוצל.
היריבים: התאמה בשיטת Glicko-2
הגינות היא גם עניין של מול מי אתם משחקים. הדירוג כאן משתמש ב-Glicko-2, היורש המודרני של אֵלו, העוקב הן אחר עוצמת המשחק שלכם והן אחר ביטחון המערכת באומדן הזה, כך ששחקנים חדשים מתכנסים במהירות לרמתם האמיתית במקום לבלות חמישים משחקים כאבן דרך לאחרים. ההתאמה מזווגת אתכם עם יריבים בעלי דירוג דומה, ותוצאות מדורגות מוזנות בחזרה למערכת אחרי כל משחק.
התוצאה: כשאתם מנצחים, גברתם על שווה. כשאתם מפסידים, יש משהו אמיתי ללמוד, בדרך כלל במדריכי האסטרטגיה.
איך קוביות הוגנות מרגישות באמת
הנה האמת הלא נוחה: קוביות אקראיות באמת מרגישות יותר גליות ממה שרוב האנשים מצפים. אקראיות אמיתית מפיקה ארבעה דאבלים ברצף, ריקודי כניסה מול בית של נקודה אחת, ונסים בהטלה האחרונה, בדיוק בתדירויות שההסתברות חוזה. פגיעה של 17 מתוך 36 מחטיאה פעמיים ברצף ביותר מרבע מהמקרים. הזיכרון שומר את השערוריות ומשליך את השגרתי, ולכן לכל שחקן מקוון מנוסה יש סיפור «קוביות מזויפות», ואף ביקורת סטטיסטית לא תמכה כאן ולו באחד מהם.
אם ברצונכם לכייל את האינסטינקטים שלכם, מדריך יסודות ההסתברות פורש את המספרים האמיתיים: 36 צירופים, סיכויי פגיעה בכל מרחק, סיכויי כניסה מהבר. הידיעה שכל מספר מסוים מופיע 11 פעמים ב-36 הופכת «מזל בלתי אפשרי» ל«יום שלישי רגיל».
המחויבות שלנו
- קוביות שנוצרות בשרת והוגנות באופן שניתן להוכחה: לעולם אינן מוטלות במכשיר, לעולם אינן מותאמות לשום שחקן או מצב, ונגזרות מקלטים ששני הצדדים מתחייבים אליהם לפני ההטלה הראשונה; בתום המשחק כל קובייה נגזרת מחדש מהרשומה שפורסמה, והאפליקציה מאשרת שהמשחק היה שלכם.
- אכיפת חוקים במקור: כל מהלך מאומת בידי השרת; לקוחות ששונו אינם מרוויחים דבר.
- אימות לוח מתמשך: נבדק בהאש בכל עדכון, מרפא את עצמו בכל אי-התאמה.
- זיווג מבוסס מיומנות: דירוגי Glicko-2 והתאמה לפי דירוג.
קוביות הוגנות פירושן שהיתרון היחיד שנותר על השולחן הוא מיומנות, ומיומנות ניתנת ללמידה. התחילו בחוקים, חדדו אותה עם אסטרטגיה, ובחנו אותה בשידור חי: השולחן שלמטה חינמי, בדפדפן שלכם, בלי שום התקנה.