چهار بازی، یک میز: یادداشت‌های ساختِ شب بازی رایاسا

چهار بازی گروهی ساختیم که با باز کردن یک صفحه بازی می‌شوند؛ بدون نصب، بی‌حساب کاربری، فارسی از روز اول.

در /fun تا امروز ابزار ساخته بودیم: محاسبه‌گر خمیر پیتزا، قصه‌ی پیش از خواب، چند ابزار کوچک برای تصمیم‌گیری. بازی چیز دیگری است. ابزار را یک نفر استفاده می‌کند و اگر کمی کند باشد، صبر می‌کند. بازی را پنج نفر دور یک میز بازی می‌کنند، وسط خنده و حرف، و هر مکث، هر دکمه‌ی گنگ و هر صفحه‌ای که چیزی را زودتر از وقتش نشان بدهد، بازی را خراب می‌کند.

نتیجه چهار بازی شد که حالا کنار هم در شب بازی هستند: رمزواژه، شنود، تاس دروغگو و بد یا بدتر. این یادداشت درباره‌ی قواعد آن‌ها نیست — قواعد در صفحه‌ی هر بازی هست. درباره‌ی ساختن است، و چیزهایی که در راه یاد گرفتیم.

سه قید از روز اول

پیش از اولین خط کد، سه چیز را قطعی کردیم و بعداً هر بار که تصمیمی سخت شد، به همین سه برگشتیم:

  1. یک صفحه، و بس. بازی با باز کردن یک لینک شروع می‌شود. نه برنامه‌ای برای نصب، نه حساب کاربری، نه «اول ثبت‌نام کنید». کسی که دور میز نشسته، حوصله‌ی ساختن حساب ندارد.
  2. فارسی، از روز اول. نه نسخه‌ی انگلیسی‌ای که بعداً ترجمه شود. راست‌به‌چپ، ارقام فارسی، و جمله‌هایی که فارسی‌زبان واقعاً می‌گوید.
  3. هر چیز مخفی، واقعاً مخفی. بازی گروهی بدون راز معنا ندارد: کلید رمزواژه، تاس‌های زیر لیوان، رأی پنهان. اگر یک بار رازی لو برود، دیگر کسی به صفحه اعتماد نمی‌کند.

قید سوم از همه سخت‌تر بود، و اولین درس را هم همان داد.

صفحه‌ای که چیزی را پشتش نشان ندهد

بیشتر این بازی‌ها با یک گوشی هم بازی می‌شوند: گوشی دست‌به‌دست می‌شود و هر بار که نوبت کس دیگری است، صفحه‌ای می‌آید که می‌گوید «گوشی را به سارا بدهید؛ بقیه نگاه نکنند».

نسخه‌ی اول این صفحه نیمه‌شفاف بود، با کمی تاری پشتش. قشنگ بود — و در تاس دروغگو، از پشت همان تاری، شکل تاس‌های نفر قبلی پیدا بود. نه واضح، ولی آن‌قدر که کسی که بخواهد، بشمارد.

اصلاحش دو قسمت داشت و قسمت دوم مهم‌تر بود. اول، صفحه‌ی تحویل کاملاً مات شد. دوم، ترتیب کار عوض شد: پیش از آنکه صفحه‌ی تحویل بیاید، تاس‌های نفر قبلی از صفحه پاک می‌شوند. مات کردن، راز را می‌پوشاند؛ پاک کردن، راز را از صفحه بیرون می‌برد. اولی به سلیقه‌ی طراح بستگی دارد، دومی نه.

از آن به بعد قاعده‌مان این شد: مخفی نگه داشتن، مسئله‌ی ترتیبِ رسم است، نه مسئله‌ی ظاهر. همین قاعده بعدها در بد یا بدتر هم به کار آمد: اگر کسی وسط نوبتش از برنامه بیرون برود، صفحه پیش از برگشتن او پوشیده می‌شود.

یک کد هشت‌رقمی به‌جای سرور

دور میز همه گوشی دارند، و طبیعی است که هر کس بخواهد راز خودش را روی گوشی خودش ببیند. راه معمولش سرور است: یک «اتاق»، اتصال زنده، و همه‌ی گوشی‌ها وصل به آن. برای سه بازی اول، راه دیگری رفتیم.

میزبان یک کد هشت‌رقمی می‌گیرد و بلند می‌خواندش. همان هشت رقم همه‌چیز را در خود دارد: تعداد نفرات، قاعده‌های انتخاب‌شده، یک «بذر» برای بُر زدن، و یک رقم کنترل در آخر. هر گوشی با همان بذر، همان دسته کارت یا همان تاس‌ها را می‌سازد، ولی فقط سهم صاحب خودش را نشان می‌دهد. هیچ چیزی بین گوشی‌ها رد و بدل نمی‌شود؛ ریاضیِ یکسان، نتیجه‌ی یکسان می‌دهد.

رقم کنترل را برای دنیای واقعی گذاشتیم: کد را کسی بلند می‌خواند، در اتاقی شلوغ، و دیگری روی صفحه‌کلید عددی تایپش می‌کند. یک رقم اشتباه، بدون رقم کنترل، میزی متفاوت می‌سازد و هیچ‌کس نمی‌فهمد چرا دست‌ها با هم جور نیست. با رقم کنترل، گوشی همان لحظه می‌گوید «این کد درست نیست».

دو اشکال کوچک هم از همین‌جا پیدا شد که فقط در فارسی پیش می‌آید. کسی که کد را از صفحه کپی می‌کند، همراهش نویسه‌های نامرئیِ جهت متن را هم برمی‌دارد — همان‌هایی که نمی‌گذارند ارقام در جمله‌ی راست‌به‌چپ جابه‌جا شوند. و کسی هم کد را با ارقام فارسی تایپ می‌کند. حالا خواندن کد هر دو را می‌پذیرد: نویسه‌های نامرئی را دور می‌ریزد و ۴ و 4 را یکی می‌داند.

جایی که بدون سرور نشد

بد یا بدتر الهام‌گرفته از بازی‌های «ترجیح می‌دهی…» است: داور یک گزینه‌ی بد روی میز می‌گذارد، بقیه بی‌نام گزینه‌ی بدتری پیشنهاد می‌دهند، داور بدترین را انتخاب می‌کند و بعد همه رأی می‌دهند کدام را ترجیح می‌دهند.

اینجا هم اول همان راه بی‌سرور را رفتیم، و روی کاغذ خیلی هم شیک بود: گوشی‌ها خودِ کارت‌ها هستند. هر کس پیشنهادش را روی گوشی خودش انتخاب می‌کند، گوشی را برعکس وسط میز می‌گذارد، داور گوشی‌ها را بُر می‌زند، یکی‌یکی برمی‌دارد و می‌خواند.

در عمل بی‌معنا بود. هیچ‌کس دوست ندارد گوشی‌اش دست دیگری بیفتد و زیرورو شود. داور باید چهار گوشی را با رمز و قفل صفحه‌ی متفاوت باز کند. و وقتی گزینه‌ی برنده انتخاب شد، دیگر روی هیچ صفحه‌ای نبود که همه ببینند. این را کسی که بازی را امتحان کرد، در یک جمله گفت: داور باید صفحه‌ی خودش را داشته باشد.

حق با او بود، و برای این یکی، سرور لازم بود. چون این بار رازی باید از یک گوشی به گوشی دیگر برود — پیشنهاد هر کس به داور — بی‌آنکه نام فرستنده‌اش همراهش برود. هیچ بذر مشترکی این کار را نمی‌کند.

سروری که ساختیم عمداً کوچک است:

  • میزها در حافظه زندگی می‌کنند، نه در پایگاه داده. یک میز یک شب عمر می‌کند و بعد از دو ساعت بی‌کاری پاک می‌شود. کسی فردا به رأی‌های دیشب نیاز ندارد، و جدولی برای نگه داشتنشان هم نباید ساخت.
  • هر گوشی فقط سهم خودش را می‌گیرد. دست کارت شما فقط به گوشی شما می‌رود. پیشنهادها بی‌نام به داور می‌رسند. رأی هیچ‌کس پیش از آنکه آخرین رأی ثبت شود، به کسی نشان داده نمی‌شود — نه در صفحه، و نه در پاسخی که سرور می‌فرستد.
  • ارتباط ساده است. هر گوشی می‌پرسد «خبر تازه‌ای هست؟» و سرور تا وقتی چیزی عوض نشده، جواب نمی‌دهد. همین درخواست ساده‌ی HTTP از پشت هر شبکه‌ای رد می‌شود و برای قطع و وصل شدن اینترنت هم برنامه دارد: گوشی‌ای که قفل شد یا از شبکه افتاد، وقتی برمی‌گردد، سر جای خودش می‌نشیند.
  • کسی که رفت، بازی را نگه نمی‌دارد. داور می‌تواند منتظر کسی که گوشی‌اش را کنار گذاشته نماند. اگر خود داور برود، دور باطل می‌شود و کارت‌ها به دست صاحبانشان برمی‌گردد.

یک چیز را هم صادقانه عوض کردیم. روی صفحه‌های بازی نوشته بودیم «چیزی به جایی فرستاده نمی‌شود». برای میز چندگوشیِ بد یا بدتر، این دیگر درست نبود. جمله را عوض کردیم تا آنچه می‌گوید با آنچه می‌کند یکی باشد: با یک گوشی هیچ‌چیز از گوشی بیرون نمی‌رود؛ میز چندگوشی فقط تا وقتی بازی می‌کنید روی سرور رایاسا می‌ماند.

کارت‌ها را ترجمه نکردیم

بد یا بدتر به‌اندازه‌ی کارت‌هایش خنده‌دار است. اول فکر کردیم یک دسته کارت بنویسیم و به زبان دیگر برگردانیم. چند کارت را که ترجمه کردیم، معلوم شد این راه جواب نمی‌دهد: شوخی‌ای که در یک زبان می‌گیرد، در زبان دیگر فقط توضیح‌دادنی است.

پس دو دسته‌ی جدا نوشتیم. دسته‌ی فارسی درباره‌ی چیزهایی است که در زندگی ما خنده‌دار و دردناک است: تعارفی که نمی‌شود ردش کرد، ته‌دیگی که سهم شما نمی‌شود، گروه خانوادگی، «برو فردا بیا»، ترافیک همت و مهمان سرزده‌ی جمعه. دسته‌ی انگلیسی دنیای خودش را دارد. حالا هر زبان ۲۵۰ کارت روزمره دارد.

دو تصمیم کوچک درباره‌ی کارت‌ها اهمیت بیشتری از آنچه به نظر می‌رسد داشت:

  • شماره‌ی هر کارت تا ابد ثابت است. کارت تازه فقط به ته دسته اضافه می‌شود. بازی‌ای که دیشب ذخیره شده یا میزی که الان باز است، با کارت‌ها از روی شماره‌شان کار می‌کند؛ اگر شماره‌ها جابه‌جا شوند، کارت دیروز امروز چیز دیگری می‌گوید.
  • کارت‌های بزرگسال، فقط به انتخاب. بعضی جمع‌ها شوخی بی‌ادبانه‌تر می‌خواهند. برای آن‌ها تنظیم «تندی» را گذاشتیم: از «بی‌خطر» تا «بی‌شرم». هرچه تندتر، سهم کارت‌های ۱۸+ در دسته بیشتر. شوخی‌ها بی‌ادب‌اند ولی هیچ‌وقت بی‌پرده، و پیش از شروع بازی باید کسی تأیید کند که همه‌ی بازیکن‌ها بزرگسال‌اند. سرور هم جداگانه مراقب است: میزی که «بی‌خطر» باز شده، هیچ کارت بزرگسالی را نمی‌پذیرد، حتی اگر صفحه به هر دلیلی آن را بفرستد.

راست‌به‌چپ، باز هم

هر پروژه‌ی فارسی چند درس کوچک راست‌به‌چپ دارد. این‌ها مال این یکی بود:

  • علامت مثبت جابه‌جا می‌شود. امتیاز «+۲» در جمله‌ی فارسی به شکل «۲+» درمی‌آمد، چون مرورگر علامت را به جهت جمله می‌سپارد. راه‌حل، جدا کردن عدد از جهت جمله است تا همیشه چپ‌به‌راست خوانده شود.
  • شماره‌ی فهرست‌ها گم شد. یک قاعده‌ی کلی در CSS سایت، فاصله و شماره‌ی هر فهرستِ کلاس‌دار را برمی‌داشت — برای منوها درست، برای قدم‌های «چطور بازی کنیم» غلط. حالا فهرست‌های شماره‌دار، شماره‌شان را صریح از قاعده‌ی خودشان می‌گیرند.
  • فلش‌ها معنا دارند. در صفحه‌ی راست‌به‌چپ، «بعدی» به چپ اشاره می‌کند. هر جا فلشی بود، یک بار برای هر دو جهت امتحانش کردیم.

تریلری که از خود صفحه درآمد

برای شب بازی یک پیش‌نمایش کوتاه می‌خواستیم، به هر دو زبان. فیلم‌برداری از صفحه‌ی گوشی، همیشه کمی لرزان و کمی تار است. پس پیش‌نمایش را از خود صفحه ساختیم: یک صفحه‌ی وب که لحظه‌به‌لحظه حرکت می‌کند، با تصویرهای واقعی همین بازی‌ها، و قاب‌به‌قاب، سی قاب در ثانیه، به ویدیو تبدیل می‌شود. موسیقی و صداها هم با کد ساخته شد.

فایده‌اش در جزئیات پیدا شد. وقتی در نسخه‌ی فارسی یک لپ‌تاپ از لبه‌ی قاب بیرون زده بود، اصلاحش یک عدد در یک فایل بود و یک بار ساختن دوباره — نه یک جلسه‌ی فیلم‌برداری دیگر.

آنچه با خودمان برمی‌داریم

  • اول دور میز امتحانش کنید، بعد پشت میز کار. طرحی که روی کاغذ شیک بود — گوشی‌ها به‌جای کارت — سر میز در یک جمله رد شد.
  • رازداری یعنی ترتیب درست، نه پرده‌ی قشنگ. چیزی که نباید دیده شود، باید پیش از آمدن پرده از صفحه رفته باشد.
  • هرچه کمتر، بهتر — تا جایی که دیگر نشود. سه بازی بدون سرور ماندند و قرار هم نیست سرور بگیرند. یکی سرور گرفت، چون واقعاً لازمش داشت، و همان یکی هم کوچک‌ترین سروری است که کار را راه می‌اندازد.
  • وقتی کار عوض شد، حرفتان را هم عوض کنید. جمله‌ای که دیگر درست نیست، حتی اگر قشنگ باشد، باید برود.

این چهار بازی تازه شروع کارند. بازی‌های بیشتری در راه است، و اگر بازی‌ای هست که دوست دارید دور میز خودتان با یک صفحه بازی کنید، برایمان بنویسید.

رفتن به شب بازی

مسئله‌ای مشابه دارید؟

اگر چیزی از این نوشته به سامانه شما نزدیک است، شرح کوتاهی بفرستید تا درباره‌اش حرف بزنیم.

شروع گفت‌وگو