سعید رضایی
سعید رضایی
خواندن ۱۰ دقیقه·۳ سال پیش

مقدمه ای بر ریاضیات در بازی ها

ریاضیات در بازی ها : مقدمه

در دوران کودکی من یکی از بازی های پرطرفدار نوشته شده برای کنسول های بازی ، بازی سوپر ماریو بود ،همانطور که می دانید تمام شکل های موجود در تصویر بازی ،یک دسته 1 و 0 هستند که به پیکسل های رنگی تبدیل می شوند که با  ترسیم های پیاپی باعث ایجاد انیمیشن و حرکت می شوند.

خوشبختانه تلویزیون های آن زمان زیاد بزرگ نبودند و ما شخصیت های بازی را کوچکتر و واقعی تر می دیدیم.

برای شروع یاد میگریم که یکی از این مربع های ساده رو بر روی یک نقطه خاص از تصویر قرار دهیم

نقاط  X و Y :

صفحه خود را مانند یک  نمودار خالی ، با موقعیت X و Y در نظر بگیرید.

به طور طبیعی، محور Y عمودی از پایین از صفر شروع می شود و بالا می رود. در برنامه نویسی اکثر بازی ها ، محور Y از بالا از صفر شروع می شود.

محور X افقی از سمت چپ از صفر شروع می شود و به سمت راست افزایش می یابد.

hero.x = 60

hero.y = 60

شخصیت ما از بالای صفحه 60 پیکسل و از سمت چپ 60 پیکسل است.

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

در این مرحله ، می خواهم به شما یادآوری کنم که این یک درس برنامه نویسی نیست و من در مورد زبان برنامه نویسی خاصی صحبت نمی کنم .

اکنون شخصیت خود را بر روی صفحه داریم ، در مرحله بعدی باید او را حرکت دهیم.

ریاضیات در بازی ها : جبر

برای جابجایی شخصیت ،  ما کدی را برای فشار دادن یک کلید اضافه می کنیم. برای کلید سمت راست ، ما می خواهیم موقعیت X را افزایش دهیم و برای کلید پایین می خواهیم موقعیت Y را افزایش دهیم. کلیدهای چپ و بالا برعکس خواهند بود.

هنگامی که برای اولین بار کاراکتر خود را به صفحه اضافه کردیم ، موقعیت x را 10و y را 0 تعریف کردیم. آیا می توانید حدس بزنید که پس از فشار دادن کلیدهای راست یا پایین ، چگونه موقعیت های x و y را تعریف می کنیم؟

برای کلید سمت راست ، ما 1 را به موقعیت فعلی x اضافه می کنیم (hero.x) که کد آن  ممکن است به شکل زیر باشد:

hero.x = hero.x + 1

با توجه به اینکه موقعیت اولیه شخصیت در مختصات X=10  می باشد ،پس از یک بار فشار دادن کلید راست ، موقعیت جدید X ما 11 خواهد بود.

اگر دوباره کلید راست را فشار دهیم ، موقعیت جدید X  ما 12  خواهد بود ، که برابر با موقعیت فعلی x (11) به علاوه 1 است.

اگر ما کلیدهای بالا یا پایین را فشار دهیم موقعیت Y را تغییر خواهیم داد.

کد هر کلید پیکان ممکن است به این شکل باشد:

  • چپ : hero.x = hero.x -1
  • راست : hero.x = hero.x+1
  • بالا : hero.y = hero.y-1
  • پایین : hero.y = hero.y+1

این یک نمای کلی از حرکات اساسی یک بازی است ، این حرکات بسیار اساسی هستند.

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

اگر یک کشتی فضایی داشتید که در فضا در حال حرکت است ممکن است بخواهید چیزهایی مانند رانش و شتاب را اضافه کنید ، یا می توانید اصطکاک و جاذبه را برای تغییر نحوه حرکت شخصیت خود اضافه کنید.

تشخیص برخورد :

استفاده دیگر از مختصات x و y در بازی ها تشخیص برخورد است ، اگر دو “مورد” فضای یکسانی را اشغال کنند چه کاری انجام می دهید؟

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

اگر به دشمن شلیک کنید ، هنگام برخورد گلوله با دشمن ، دشمن شما مورد اصابت قرار می گیرد.

اگر شخصیت شما به یک سکوی بالاتر می پرد ، شما می خواهید که او بر روی سکو فرود آید (موقعیت Y جدید) و به همان جایی که از ابتدا شروع کرده است سقوط نکند.

از مختصات X و Y به همراه برخی متغیرهای دیگر می توان برای بهبود فیزیک دنیای بازی شما استفاده کرد یا می توان از آنها برای دشوارتر کردن استفاده کرد.

ریاضیات در بازی ها (فیزیک و متغیرها) :

در جایی که به حرکت یک شخصیت با استفاده از “hero.x = hero.x + 1” اشاره کردم ، hero.x متغیری است که برای نشان دادن موقعیت شخصیت ما استفاده می شود.

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

ما می توانیم با استفاده از متغیرهای بیشتر در معادلات خود ، برخی از فیزیک ها و حالت های جدید  را به حرکات بازی اضافه کنیم.

در تصویر بالا ، صفحه نمایش به 2 جهان بالای آب و جهان زیر آب تقسیم شده است.

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

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

توجه داشته باشید که همانطور که قبلا گفته شد افزایش Y به معنی افزودن شده به فاصله از بالای صفحه می باشد و  Y=0 بالاترین نقطه در بالای صفحه را نشان می دهد.

موقعیت Y شخصیت را می توان بررسی کرد که آیا او بالاتر از سطح آب است یا پایین تر از آن،

اگر کاراکتر بالاتر یا زیر آب باشد ، می توان متغیرهای اضافی را ایجاد و تغییر داد.

  • گرانش (gravity)= 1.05 بالاتر از آب و 0.95 زیر آب
  • اصطکاک (friction)= 1 بالاتر از آب و 0.5 زیر آب

معادله فشار دادن کلیدهای راست و پایین می تواند به ترتیب زیر باشد:

  • hero.x = hero.x + 1 + friction
  • hero.y = hero.y + (1 * gravity)

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

  1. hero.x = 50 + 1 + 1:   52
  2. hero.x = 52 + 1 + 1:   54
  3. hero.x = 54 + 1 + 1:   56

با شروع دوباره از موقعیت 50 ، اگر شخصیت ما زیر آب باشد،با 3 بار فشار دادن کلید سمت راست، به صورت زیر تغییر مکان می دهد:

  1. hero.x = 50 + 1 + 0.5:   51.5
  2. hero.x = 51.5 + 1 + 0.5:   53
  3. hero.x = 53 + 1 + 0.5:   54.5

همانطور که می بینید شخصیت ما در زیر آب کندتر حرکت می کند. بعد از 3 بار فشار دادن کلید او از موقعیت X =50 به 56 در بالای آب و از 50 به 54.5 در زیر آب به سمت جلو حرکت کرد.

حال ببینیم که با فشار دادن کلید پایین چه اتفاقی می افتد.

ابتدا بالای آب ، ما از موقعیت 30 شروع می کنیم و 3 بار کلید پایین را فشار می دهیم که نتیجه به شکل زیر است:

  1. hero.y = 30 + (1 * 1.05) :  31.05
  2. hero.y = 31.05 + (1 * 1.05):  32.1
  3. hero.y = 32.1 + (1 * 1.05):  33.15

بعد ، اگر موقعیت Y شروع ما 70 باشد و شخصیت زیر آب باشد ، نتیجه 3 بار فشار دادن کلید پایین به این شکل است:

  1. hero.y = 70 + (1 * 0.95):   70.95
  2. hero.y = 70.5 + (1 * 0.95):   71.9
  3. hero.y = 71.9 + (1 * 0.95):  72.85

در بالای آب ، شخصیت ما سریعتر رو به پایین حرکت می کند، زیرا جاذبه زمین به سقوط آن کمک می کند ، اما در زیر آب کمتر رو به پایین حرکت می کند زیرا خاصیت شناوری سرعت حرکت او را کند می کند.

اگر کاراکتر زیر آب باشد ، یک حلقه می تواند  تا زمان قرار گرفتن شخصیت در سطح آب  تکرار شود.(برای مثال شی ای را در نظر بگیرید که در زیر آب قرار دارد و به خودی خود رو به بالا حرکت می کند)

این حلقه ممکن است“hero.y = hero.y * gravity” باشد. بدون فشار دادن هیچ کلید ، موقعیت Y شخصیت ما به تدریج کاهش می یابد که به نظر می رسد به آرامی به سمت بالا شناور است.

به همین ترتیب ، اگر شخصیت  بالای آب بود ، ممکن است کد مشابهی داشته باشید ، اما با این تفاوت که به تدریج موقعیت Y را که به نظر می رسد شخصیت در حال سقوط است ، افزایش می دهد.


ریاضیات در بازی ها (فیثاغورس و مثلثات) :

برای شروع بهتر است یادآوری کنم که فیثاغورس  چه می گوید :

فیثاغورس دانشمند و ریاضیدان یونان باستان، با تحقیق بر روی مثلث قائم الزاویه به این نتیجه رسید که همواره مساحت مربعی که با وتر یک مثلث قائم الزاویه ساخته می‌شود برابر است با مجموع مساحت دو مربعی که با اضلاع زاویه قائم ساخته می‌شود و این قانون بعدها به عنوان رابطهٔ فیثاغورس نامیده شد. در هر مثلث قائم الزاویه، مجذور وتر برابر است با مجموع مجذور دو ضلع زاویهٔ قائمه، در واقع فرمول ریاضی آن به فرمول زیر میشود. هرگاه x و y دو ضلع قائم مثلث قائم الزاویه باشند و z وتر آن باشد آنگاه داریم:

x^(2) + y^(2) = z^(2)

خوب این از تعریف قاعده فیثاغورس حالا می خواهیم یاد بگیریم که این قاعده چه کمکی ذر طراحی بازی ها به ما خواهند کرد.

قضیه فیثاغورس و رسیدن دو شخصیت یا دو  شی به یک دیگر


همانطور که در تصویر بالا مشاهده میکنید تصویری از بازی معروف مرورگر کروم را قرار داده ام، دشمن در موقعیت X,Y متفاوتی نسبت به شخصیت ما در بازی قرار دارد.اگر هر دو کاراکتر در یک موقعیت Y یکسانی قرار داشته باشند و فقط X های آنها متفاوت بود به راحتی میتوانستیم فاصله بین آنها را محاسبه کنیم.
در این گونه شرایط می بایست با تشکیل یک مثلث قائم الزاویه فاصله بین کاراکترهای بازی را محاسبه کنیم.
برای مثال اگر در تصویر بالا دایناسور در موقعیت x=5 و Y=20 و پرنده(دشمن) در موقعیت X=25 و Y=10 باشد.با تفریق X ها و Y های دو شی از یکدیگر میتوانیم طول ضلع مجاور و مقابل را بدست آورده و از طریق آن ها طول وتر که در این تصویر فاصله واقعی بین دو شی می باشد را بدست آوریم.

اکنون مشاهده می کنید که در این مثال طول ضلع مجاور برابر است با X=25-5=20 و طول ضلع مقابل برابر است با Y=20-10=10

با این اوصاف طول وتر برابر است با :

قضیه فیثاغورس و سرعت

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

ششما می توانید ابن عدد بدست آمده را به عنوان سرعت خودرو بر روی صفحه نمایش نمایش داده و همچنین می توانید شرایطی بزارید که اگر سرعت بیشتر از یک مقدار خاصی شد خودرو توسط پلیس متوقف شود.

تغییر زاویه

تصور کنید که بازی تنیسی را  انجام می دهید که در آن توپ فقط از چپ به راست عقب و جلو حرکت می کند.  یک بازی آسان اما فوق العاده خسته کننده را تجربه خواهید کرد.

برای بازی هایی مانند تنیس ، پین بال و غیره ، می خواهید زاویه ای که «توپ» به آن بازگردانده می شود،

به اینکه کدام قسمت توپ با راکت برخورد می کند وابستگی داشته باشد.

برای مثال تصویر زیر را ببینید :

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

البته شما میتوانید با انجام بازی های مشابه و با فکر کردن در این باره حالت های مختلفی را حتی با استفاده از فیزیک به این بازی اضافه کنید تا بازی واقعی تر به نظر بیاید.

سعید رضایی - sarezcodes

برنامه نویسیبازیgameبرنامه نویسprogramming
sarezCodes.ir
شاید از این پست‌ها خوشتان بیاید