# مباحث متفرقه برنامه نویسی > طراحی و ساخت بازی‌های کامپیوتری > گفتگو: بازیهای چندکاربره تحت شبکه

## quiet_buzz

سلام
من نه تا حالا بازی ساختم و نه زیاد اهل بازی بودم. جز برخی بازی های فکری و ...
ولی چندی هست که درگیر تحقیقاتی در مورد توسعه بازی های مبتنی بر شبکه (منظورم صرفا LAN نیست، تحت وب در نهایت مد نظرم هست) هستم.
همونطور که می دونید بازی ها یا simple هستن یا massive 
از طرفی بازی های یا turn based هستن و یا real time
بازی هایی هم که تحت وب هستن برخی تحت مرورگر بازی میشن. مثل لود شدن یک بازی فلش در مرورگر یا بازی های مثل جوامع مجازی (Erepublic یا مثلا s3.travian.ir)، یا مثلا چیزی شبیه www.turnplay.com ولی خب هدف من این هم نیست. 
من بازی هایی مشابه بازیهای اینترنتی ویندوز، یا مثلا بازی های یاهو مسنجر مد نظرم هست. که قاعدتا در اکثر این بازی ها باید سروری کار ذخیره سازی و همزمانی حرکت بازیکن ها رو نگه داره و به روزرسانی کلاینت ها رو انجام بده و ...
با توجه به هزینه ها و گستردگی این کار چنین چیزی زیاد مقرون به صرفه نیست برامون.
بنابراین میخواستم بدونم آیا امکانش هست یک بازی معمولی که در PC کاربر تک کاربره و یا n کاربره بازی میشه، بگونه ای پیاده سازی کنیم بطوری که 2 نفر در 2 سیستم متفاوت از طریق اینترنت یا اتصالات دیگه همزمان با هم بازی کنند؟
قاعدتا باید از طریق socket programming و ... بشه، یعنی اینطوری احساس می کنم. ولی نمونه ای در دست ندارم تا بررسی کنم و تحلیلی از کار دربیارم.
همچنین با فرض این کار، این روش باید در مورد بازی های turn based پاسخگو باشه فقط، درسته؟ و اینکه کاربران ما چه طور از حضور سایر بازکننان  با خبر بشن؟ بنابراین باید وبسایت و یا سیستمی برای ثبت کاربران و مشاهده کاربران آنلاین و ... وجود داشته باشه. درسته؟
و مورد دیگه اینکه آیا بازی های فلش (همراه سورس البته باشه بهتر) به عنوان نمونه سراغ دارید که چنین مکانیزمی داشته باشن و در واقع تحت شبکه باشن؟
ممنون میشم راهنمایی بفرمایید

----------


## quiet_buzz

موردی که فراموش کردم، آیا بازی دارید که بشه با اتصال دو کاربر به سرور یاهو یا مثلا skype دو نفر همدیگر رو شناسایی کرده و بازی رو با هم انجام بدن؟

----------


## Nima_NF

من مثالی آماده سراغ ندارم، اما توضیحاتی می دهم که متوجه شوید.
اول اینکه دقت کنید همه بازی های سه بعدی سنگین که تا 30 نفر را هم پشتیبانی می کنند از همین socket استفاده می کنند، پس تعجب نکنید. 

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

توجه کنید که یک بازی فقط اطلاعات مورد نیاز را به سرور می فرستد نه هر چیزی که در بازی هست. مثلا در یک بازی دو بعدی، به جای اینکه یک عکس برای کاربر فرستاده شود تا آن را در قسمتی از تصویر نمایش دهد، فقط یک رشته حاوی نام عکس و نقطه X و Y را می فرستد که جمعا در هر ثانیه با بیش از 60 فریم بیشتر از 1 کیلو بایت نمی شود.

پس اگر بازی شما تحت وب هست (مثلا flash)، ابتدا قبل از شروع بازی باید تمامی منابع (عکس، اشکال، نوشته ها، صدا ها و ...) در کامپیوتر هر فرد دانلود شده باشد تا هنگام شروع بازی تنها اطلاعات مکانی و تغییراتی که باید اجرا شود به کامپیوتر کاربر یا سرور ارسال شود.
در مورد بازی های سه بعدی هم به همین شکل باید تمامی کارکترها و منابع و مراحل قبل از شروع بازی به سیستم شما منتقل شوند.

یک مثال ساده:
دو کاربر به سرور بازی وصل شده اند و قرار هست یک دایره را حرکت دهند، این دایر مکان X,Y دارد. کاربر شماره 1 با حرکت دادن دایره مثلا محتویات زیر رابه سرور ارسال می کند(تحت عنوان یک ساختار یا رکورد با توجه به زبان یا اسکریپت برنامه نویسی):

ObjectName = circle1p
X = 12
Y = 4
سرور مطلب فوق را بررسی می کند، و به کاربر شماره 2 (احتمالا در فریم بعدی) همین داده ها را ارسال می کند تا دایره در کامپیوتر کاربر شماره 2 هم تغییر مکان دهد. 

پس شما در هر زبان برنامه نویسی یا محیطی که هست، اگر برنامه نویسی socket را یاد بگیرید یعنی قادر هستید برای بازی تحت Lan / شبکه / اینترنت هم این کار را انجام دهید. (TCP ، UDP ، ...)

----------


## quiet_buzz

ممنونم از توضیحات خوبتون
من چون به دنبال تحلیل و در واقع مدلی از این سبک بازی ها هستم و با توجه به توضیحات و امکان سنجی هایی که به عمل اومده، peer to peer ،بدون سرور واسط و نهایتا برنامه نویسی سوکت رو باید پیاده سازی کرد.
ولی در واقع کار من پیاده سازی نیست، همچنان دنبال نمونه ای ساده از این سبک بازی هستم.
ممنون میشم اگر نمونه ای در اختیار اینجانب بگذارید. البته نه در حد یک بازی کامل. مثلا جا به جایی مهره ای در صفحه. یا هر نمونه ساده دیگه.
ضمنا با توجه به صحبت شما درنتیجه بازی های massive از طریق socket امکانپذیر هست، درسته؟

----------


## quiet_buzz

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

----------


## quiet_buzz

یک سوال دیگه اینکه سوکت با پروکسی هم کاری داره یا نه ؟ اگر سیستمی از پروکسی استفاده کنه، آیا در ارتباط سوکتی دچار مشکل میشه یا نه؟

----------


## quiet_buzz

این نمونه رو تونستم پیدا کنم. ولی در انتخاب سرور و .. مشکل دارم. نمیدونم به چه صورتی هست
امکانش هست کمک کنید
http://www.codeproject.com/KB/IP/eatergameii.aspx

----------


## Nima_NF

> ضمنا با توجه به صحبت شما درنتیجه بازی های massive از طریق socket امکانپذیر هست، درسته؟


تقریبا همه بازی های معروف و بزرگ که می بینید (مانند counter strike، warcraft، Unreal و ...) و یا حتی دو بعدی مثل World of goo و ... با همین socket هستند.




> نقطه ابهام دیگه ای که من دارم و به دلیل عدم بازی هست اینه که دو نفری که قرار هست در بازی که مبتنی بر socket هست با هم بازی کنند چه طور از حضور هم مطلع میشن و همدیگر رو پیدا میکنند؟ و درخواست بازی به هم می دهند؟


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

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

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




> راستی بازی های تحت شبکه خود ویندوز باید سرور داشته باشند درسته؟


می توانند داشته باشند و می توانند نداشته باشند. (طبق گفته های پاراگراف قبلی)

در XP بازی هایی که تحت اینترنت هستند، توسط سرور های zone.com هستند که به آن ها متصل می شوید.
در این بازی های ویندوز، سیستم شما خودکار به یکی که در لیست انتظار هست (در همان لحظه ها بر روی شروع بازی کلیک کرده است) متصل می شود. پس تا زمانی که فرد دیگری نباشد پنجره شما همچنان منتظر می ماند تا از طریق کاربر 2 پیامی ارسال شود که سوکت به حالت اتصال برود.




> یک سوال دیگه اینکه سوکت با پروکسی هم کاری داره یا نه ؟ اگر سیستمی از پروکسی استفاده کنه، آیا در ارتباط سوکتی دچار مشکل میشه یا نه؟


بله، ممکن است به مشکل برخورد کنید. اگر کاربری از پروکسی استفاده می کند باید در برنامه خودتان کدی بنویسید که از اطلاعات عمومی پروکسی ها در internet option استفاده کند، تا اگر No proxy هم بود طبق معمول عمل کند. 
البته اگر بازی مبتنی بر وب باشد که خودکار از همان proxy تنظیم شده توسط Browser استفاده می کند و نیاز به کار خاصی نیست.

ضمنا proxy ها میزان latency یا ping یا همان تاخیر زمانی را بالا می برند که باعث می شود اطلاعات در هر ثانیه به کندی به دست کاربر بعدی برسد، یا به اصلاح Lag داشته باشد (حتی با وجود سرعت بالای اینترنت شما). به همین خاطر بازی مدام پرش خواهد داشت و ادامه بازی برای سایر کاربران نیز ممکن نخواهد بود.




> نمونه بازی اجرایی که مبتنی بر سوکت باشه دارید که بهم بدید و یک بار بازی کنم تا ببینم به چه صورتی هست در عمل. ممنون


متاسفانه ندارم، در سایت های codeproject و امثال آن در بخش بازی بگردید سال ها قبل چند مورد دیده بودم.

----------


## quiet_buzz

> این نمونه رو تونستم پیدا کنم. ولی در انتخاب سرور و .. مشکل دارم. نمیدونم به چه صورتی هست
> امکانش هست کمک کنید
> http://www.codeproject.com/KB/IP/eatergameii.aspx


ضمن تشکر از توضیحات خوبتون، میشه در اجرای این برنامه راهنمایی کنید
از توضیحاتی که خودش داشت من متوجه نشدم که دقیقا باید چه کار کنم
مخصوصا اینکه تجربه بازی ندارم 
مرسی

----------


## Goeezor

خیلی خوشحالم از اینکه یه نفر بعد از مدتها از شبکه ای کردن بازیها سوالی بپرسه (حالا هر چیزی)

در مورد اون sample هم باید بگم من هم پارسال با اجرا کردن اون مشکل داشتم هرچند که اون تنها مثالی بود که تونستم در رابطه به Socket Programming پیدا کنم.

البته بعدش رفتم دنبال XNA که به شما هم این رو پیشنهاد میکنم که برای شروع خیلی خوبه
 مثالهای فراونی  تو این آدرس میتونی ببینی!!
http://creators.xna.com/en-US/educat...area=19&sort=1

فعلا

----------


## quiet_buzz

دوست عزیز ممنونم از راهنماییتون نهایتا آیا تونستید اون مثال codeproject رو اجرا کنید؟ مشکلش چی هست؟ ضمنا من به دنبال یک سری sample هستم در لینکی که ارائه کردید در چه قمستی می تونم مثالهایی مشابه مثال codeproject پیدا کنم؟ با تشکر از لطفتون

----------


## Nima_NF

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

ضمنا اولین مرجع شما در بحث بازی سایت gamedev.net باید باشد. در لینک زیر مقالات مربوط به برنامه نویسی شبکه و socket برای بازی ها قرار دارد. مثلا مقاله WinSock2 for Games  مقاله خوبی هست.

لینک مقالات شبکه این سایت:
Multiplayer and Networking

----------


## Goeezor

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


این رو هم در ادامه حرفهای آقا نیما بگم که
اگه قصد کد نویسی به زبان ++c  داری از لینک بالا 
و اگر هم سی شارپ و Xna  میخوای کار کنی از اون آدرسی که گذاشتم استفاده کن

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

  بهر حال  باز هم درخدمتیم

----------


## quiet_buzz

ممنونم از راهنماییتون
  راستش این که دنبال مثال هستم برای این هست که من نمیخوام بازی رو Develop کنم. بلکه میخوام نمونه انجام شده ای رو تحلیل کنم و با استفاده از اون نمونه های دیگه ای رو اگر بشه توسعه بدم. (البته نه من یک سری دیگه)
  زبان هم زیاد مهم نیست. ولی C#‎ برای خودم بهتر هست
  اون مثال هم اجرا شد. البته در حین اجرا مشکلات کوچیکی داره (در حین حرکت منظورم هست)

----------


## quiet_buzz

یا حتی اگر چند بازی با توجه به مطالبی که گفتم بهم معرفی کنید که با روند اون ها هم آشنا بشم خوبه 
تشکر

----------


## Goeezor

اگه دنبال مثال شبکه با xna هستی قبلا یه  لینک گذاشته بودم 
که الان هم میذارم. تو این مثالها اکثر مفاهیم شبکه ای برای تحت شبکه کردن بازی رو میفهمی
(هر مثالی Document داره و میتونی اون رو مطالعه کنی)
که برای شروع خیلی خوبه.
لینک 1

در مورد خود xna  هم میتونی از اینجا دانلود کنی
لینک 2

البته با vs2008

بازهم میگم این مثالها برای شروع خیلی خوبه

----------


## quiet_buzz

ضمن تشکر مجدد، بازی های مولتی پلیری که با فلش هستند از نظر برنامه نویسی و تکلنیک و روش کار به چه صورتی هستند؟ با تشکر

----------


## Nima_NF

برای فلش هم به همین شکل هست، برای ارتباطات real-time از XMLSocket   استفاده می شود. می توانید ان را در اسناد Action Script جستجو کنید:
http://livedocs.adobe.com/flash/9.0/main


(ضمنا روش های دیگری در کلاس XML و از نوع HTTP هست که سرعت کمتری دارند و برای کارهای real-time استفاده نمی شوند.)

----------


## quiet_buzz

سلام
بالاخره امتحانات تموم شد و مجددا مزاحم شدم
سوال این بار من در مورد پیاده سازی و ... نیست
فرض: برنامه (بازی) را تحت شبکه داخلی با استفاده از سوکت ها به گونه ای پیاده سازی کردیم که دو بازیکن بتونن با داشتن IP ازش استفاده کنند. درواقع یک بازیکن به عنوان سرور و دیگری به عنوان کلاینت در نظر گرفته شده اند. 
بازی مهم نیست چی هست، فرض یک دوز ساده.

مساله: چگونه این بازی را در سطح کاربرانی فراتر از شبکه داخلی (شبکه اینترنت) گسترش دهیم ؟ 
با مشکل پروکسی چه می توان کرد؟
آیا در شبکه اینترنت هم داشتن IP کافی است؟
بازیکنان چگونه از حضور هم مطلع شوند؟
و ...
چگونه یک سیستم مدیریتی توسعه دهیم تا بازیکنان مختلف بازی های متفاوتی را مشترکا بازی کنند ؟
امیدوارم دغدغه های مساله جدید رو با هم دیگه برطرف کنیم
مرسی

----------


## quiet_buzz

بازی های zone مبتنی بر سوکت هستند؟ منظورم همین بازی های اینترنتی ویندوز XP است
 ضمنا ip که برای ارتباط مبتنی بر سوکت استفاده میشه آیا وابستگی به خط اینترنت داره ؟ (adsl یا dial up)
 مرسی
 --------------
 ظاهرا دوستان این تاپیک رو فراموش کردن  :متفکر:

----------

