![]() |
برنامه حل بازي 8 كد شده با سي شارپ
1(ها)ضميمه
با سلام
توي برنامه هاي كه توي سايت هست چند مورد ارسال بازي 8 رو ديدم ولي اكثرا خود بازي رو گذاشتن نه حل اون رو. من اين برنامه رو آماده كردم، با توجه به اينكه اصلا مايل نيستم به صورت يك پروژه درسي صرفا دانلود بشه و تحويل داده بشه فعلا فايل اجرايي رو قرار مي دم و نحوه كار با اون رو توضيح مي دم. بعد هم در مورد روش كارش توضيح مي دم و توي پست هاي بعد هم احتمالا كد برنامه رو قرار مي دم. (در صورتي كه روشي پيدا كنم كه نشه بصورت پروژه آماده استفاده كرد.) در مورد خود برنامه: 1- بايد دات نت 2 رو داشته باشيد. 2- در وسط صفحه جدول اين معما ديده ميشه و با كليك روي هر خانه اگر اطراف اون خانه خالي باشه با اون جابجا مي شه. 3- همون طور كه مي دونيد از هر تركيبي از اعداد روي صفحه نميشه به خانه هاي مرتب شده رسيد و بنابراين بايد از خانه هاي مرتب شده شروع كرد و جابجايي ها رو انجام داد تا خانه هاي جدول در هم بشه. براي اين كار هم ميشه به صورت دستي روي هر خانه كليك كرد و هم ميشه از قسمتي كه براي اين امر آماده كردم استفاده كنيد. در پايين صفحه دو تا ليست كشويي قرار گرفته كه يكي تعداد دفعات درهم سازي رو مشخص ميكنه و ديگري هم سرعت عمل رو (براي اينكه روال درهم سازي رو بشه ديد) و با كليك روي دكمه درهم سازي جدول درهم ميشه. 4- در قسمت بالاي صفحه چند تا دكمه هست. دكمه جديد: كه بازي جديد توليد مي كنه دكمه محاسبه و توليد درخت : كه درخت بازي رو توليد مي كنه و جواب رو به دست مياره دكمه نمايش مسير: كه جدول درهم شده رو مرتب مي كنه. 5- در قسمت چپ صفحه برنامه هم گزارشي از تعداد نود هاي توليد شده در درخت و تعداد نود هاي گسترش يافته و تعداد جابجايي ها تا رسيدن به جدول مرتب شده را نشان مي دهد. 6- بنابراين براي كار با برنامه ابتدا بايد جدول را درهم كنيد بعد روي دكمه محاسبه و توليد درخت كليك كرده و بعد روي نمايش مسير كليك كنيد. اين كليت كار با برنامه تا بعد در مورد طرز كار مطلب بذارم |
سلام از برنامه ممنون فقط سورسش رو هم بذار اگه برات مقدوره؟
|
كد بازي 8 كد شده با سي شارپ
1(ها)ضميمه
با سلام
گرچه فكر مي كردم كمي بيشتر از اين برنامه استقبال بشه اما به هر دليلي نشد.:57: خوب توي اين پست كد برنامه رو قرار مي دم در مورد كلاس هاي به كار رفته و عملكرد هركدوم هم توي پست بعدي توضيح مي دم ضمنا توي اين برنامه از الگوريتم a* استفاده كردم و براي تابع هيورستيك هم از فاصله منهتن بنابراين توي كمترين تعداد مراحل راه حل رو پيدا مي كنه .:4::4::4: |
خب همونطور که قول دادم شرح کد ( البته ببخشید دیر شد :18:)
در مورد الگوریتم و روش به کار رفته: در این برنامه از سه کلاس استفاده کردم : الف) کلاس نود (Node) که مربوط به اطلاعات هر حالت از قرار گیری اعداد روی صفحه، مقدار تابع منهتن در وضعیت خاص و ... ب) کلاس صف اولویت که عناصر آن را وضعیت های ممکن از حالت شروع است و بر اساس دو مقدار فاصله طی شده (G(x)) و مقدار تابع اکتشافی اولویت آنها تعیین می گردد. ب) کلاس عناصر صف (ObjectQueue) با توجه به اینکه باید در هر خانه از صف اولویت یک نمونه از کلاس نود قرار گیرد و با توجه به حجم بالایی از حافظه که ممکن است از این طریق هدر رود. عناصر مهم این کلاس به طور خلاصه شده و کم حجم در این کلاس قرار داده می شود و در صف اولویت قرار می گیرد و در هنگام نیاز به نوع اصلی یعنی کلاس نود تبدیل می شود. برای کلاس نود به یکسری پارامتر نیاز داریم که شامل موارد زیر است: 1- یک ماتریس 3 در 3 که موقعیت اعداد در خانه های جدول را مشخص کند 2- یک عدد که مقدار تابع مکاشفه ای (فاصله منهتن) را نگه می دارد. 3- محل خانه خالی جدول 4- تعداد مراحل طی شده 5- و مقدار تابع h(x) که شامل جمع مراحل طی شده و مقدار تابع مکاشفه ای است. در مورد توابع و یا متدهای کلاس صحبت نمی کنم و به اصل برنامه اشاره می کنم (البته اگر سوالی هست مطرح کنید) همونطور که می دونید از هر چیدمانی از عناصر نمی توان به وضعیت مرتب شده رسید در واقع 9! حالت چیدمان عناصر امکان پذیر است و از نیمی از این تعداد برای ما قابل قبول هستند بنابراین باید از یک وضعیت مرتب شده خانه های جدول را درهم کنیم. در این برنامه اساس کار مبنی بر حرکت دادن خانه خالی است. خب تابع اصلی اجرای برنامه createTree() می باشد. در این تابع ابتدا وضعیت جاری جدول را در یک نمونه از کلاس نود قرار می گیرد پارامترهای کلاس را Set می کنیم. حالا این کلاس را در صف اولویت قرار داده و وارد حلقه اصلی برنامه می شویم. کارهایی که در حلقه اصلی برنامه انجام می شود: با اولویت ترین عنصر (ابتدای صف) برداشته می شود. سپس حالتهای بعدی را مشخص می کنیم (از طریق یافتن اینکه خانه خالی به چه خانه هایی امکان حرکت دارد با استفاده از تابع availableMove() از کلای نود) در مرحله بعد به تعداد خانه هایی که امکان حرکت وجود دارد، یک نمونه از کلاس نود ایجاد شده و در هرکدام، خانه خالی را به یکی از سمت های مجاز برده و پارامترهای آن را ازجمله فاصله منهتن را حساب کرده و سپس آن را در صف اواویت قرار می دهیم. ضمنا مسیر حرکت نیز درآرایه ای به نام path نگهداری می شودیعنی قبل از قرار گرفتن عنصر در صف در این آرایه مشخص می شود که یک وضعیت خاص از وضعیت آغازین چه حرکتهایی را انجام داده تا به این وضعیت برسد. شکل زیر کلیات این کار را نشان می دهد: در صورتی که فاصله منهتن یکی از نود های تولیدی صفر شود یعنی مسئله حل شده و بنابراین از حلقه اصلی خارج می شویم. در غیر این صورت به ابتدای حلقه بازگشته و با اولویت ترین نود را انتخاب کرده و مراحل بالا را دوباره انجام می دهیم. نکته قابل ذکر این که یک نود بعد از خروج از صف علنا از صف کنار گذاشته می شود ولی در قسمتی از حافظه نگهداری می شود تا درصورتی که در مراحل بعد یک نود مشابه این نود تولید شود دوباره بررسی نشود (چون قبلا بررسی شده است.) البته می خواستم در مورد کلاسها و توابع اونها هم بنویسم ولی گفتم درصورتی که کسی مشکلی داشت به اون ها بپردازم. بنابراین اگر متوجه قسمتی نشدید حتما اشاره کنید. |
سلام . مرسی . این کارت خیلی عالیه .لطفا در مورد توابع و کلاس ها هم توضیح بده .
|
خوب در مورد تابع اصلی که توضیح دادم.
شما یه نگاهی به کلاس ها بندازید هرجا که مشکلی بود در خدمتم |
سلام
دست گلتون درد نكنه واقعا عالي بود فقط يه خواهشي داشتم اگه ميشه با rbfs هم حلش كنيد |
البته اگر بشه قصد دارم با روش هاي ديگه هم حل كنم.
فقط متاسفانه خيلي گرفتارم انشا الله به زودي حل روش هاي مختلف و امكان مقايسه بين هر روش رو هم قرار مي دم. |
راستي حل بازي دوز با الگوريتم min max با هرس آلفا بتا و بدون هرس رو هم اگه مطلبي دارين بذارين ممنون ميشم.
|
نقل قول:
دوست عزیز ورژن سی شارپتون رو میگین ؟ با این پروژه شما من زیاد کار دارم خوشبختانه:38: |
نقل قول:
با ویزوال استودیو 2008 نوشتم ضمنا همچین یه کمی مشکوک گفتید که با این پروژه زیاد کار دارم!!!:39::4: |
سلام دوست من
خیلی ممنون که سورس رو هم گذاشتی.(یه سوال:این عکسه آخونده خودتی؟) خب برم سر اصل مطلب : من الگوریتم رو متوجه شدم و مشکلی ندارم فقط یه قسمتش برام هنوز مبهمه و نفهمیدم--> وقتی یه گره بررسی میشه و هدف نیست و از صف خارج میشه خب اگه بعدا گره هدف از فرزندای همین گره بود ما چطوری میتونیم مسیر راه حل رو پیدا کنیم با توجه به اینکه گره پدرش حذف شده؟ به عبارت دیگه بعد از رسیدن به نود هدف مراحل پیدا کردن مسیر(راه حل) رو لطفا توضیح بدید.اول تو الگوریتم A* بعد هم تو برنامه خودتون. (یه چیزی که به ذهن خودم میرسه اینه که رشته عملیات اعمال شده تو هر گره ذخیره بشه یعنی هر گره مسیر گره ریشه تا خودش رو فقط با علائمی مثل UP_Down_Right_Left تو یه string ذخیره کنه.) خیلی ممنون |
اگر سوال اولت جدی بود باید بگم که نه قرار نیست توی آواتار عکس خودم باشه دوما یعنی شما امام موسی صدر رو نمیشناسین؟!!
در مورد سوال فنی؛ به نظر میاد باید یه بار دیگه خود الگوریتم *A رو بررسی کنید. توی این الگوریتم روش کار به این صورت هست (البته توی مسئله خودمون): برای هر گره مقدار تابع هیورستیک رو محاسبه می کنه ضمنا هر گره دارای یک مقدار هست که هزینه رسیدن به این گره رو از ابتدای حرکت مشخص می کنه. تابع نهایی مورد استفاده از جمع این دو تا حاصل میشه و براساس مقدار این تابع توی یک صف اولویت قرار می گیره هر گره ای که مقدار کمتری داشته باشه در ابتدای صف قرار میگیره . ابتدای کار هیچ گرهی توی صف نیست و بعد از محاسبه دو مقدار بالا حالت کنونی وارد صف شده و چون تنها حالت موجود هست پس این گره از صف خارج شده و فرزندان این گره تولید شده و مقدار تابع محاسبه شده و براساس اولویت توی صف قرار می گیرند. حالت پدر به عنوان یک گره بازدید شده علامت می خوره (با قرار دادن هزینه تابع زیاد برای اون گره) که اگر احیانا در ادامه کار دوباره این گره تولید شد به دلیل تکراری بودن وارد صف نشه که توی حلقه گیر کنیم. (بنابراین هیچ گرهی حذف نمیشه) برای یافتن مسیر، هر گره یک آرایه داره که نشون می ده از ابتدای مسیر چطور به این گره رسیدیم. و توی این آرایه مثلا از عبارات UP_Down_Right_Left که اشاره کردید استفاده میشه. پس بعد از اینکه به جواب رسیدیم می تونیم محتوای این آرایه رو از ابتدا روی حالت اولیه اجرا کنیم تا به جواب برسیم. امیدوارم متوجه شده باشی |
سلام خسته نباشید
میخواستم اگه میشه توضیح بیشتری راجع به برنامتون بدید مثلا چه جوری درخت رو تشکیل میده واز روی درخت به جواب میرسه یعنی با یه مثال توضیح بدید .ممنون:3:
|
salam mishe begid in masalaro chejur mishe ba memetic algorithm hal kard???????
plzzzzzzzzzzz |
زمان محلي شما با تنظيم GMT +3.5 هم اکنون ۰۸:۳۲ بعد از ظهر ميباشد. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.