ورود

View Full Version : خبر: تابع کیش و مات شطرنج



sajioo
جمعه 23 خرداد 1393, 17:56 عصر
دوستان سلام
بنده یک تابع دلفی می خوام که برای مثال یک آرایه دوبعدی که موقعیت کلیه مهره های شطرنج را بیان می کند بگیرد و تست کند که آیا شاه کیش است یا مات شده یا هیچ کدام.
چند تا تابع دیگه هم می خوام که بعدا می گم.
البته دوستان تو خصوصی می تونن بهم پیام بدن و اگر قیمتی مد نظر دارند اعلام کنند.
با تشکر:لبخندساده:

یوسف زالی
جمعه 23 خرداد 1393, 20:17 عصر
سلام.
شما پیاده سازی سیستم آرایه تون مهمه.
اگر من بودم با کلاس پیاده سازی می کردم:


type
TBeadColor = (White, Black);


TBead = class(TCustomControl)
private
FColor: TBeadColor;
public
property Color: TBeadColor read FColor write FColor;
end;


TPawn = class(TBead)


end;


// BeadType: (Pawn, Rook, Knight, Bishop, Queen, King);




اما به هر حال فهمیدن این که الان کیش هست یا نه خیلی ساده هست.
شما تک تک مهره های حریف رو اسکن می کنی و در خطر بودن شاه مقابل رو با اون مهره ها می سنجی. همین!

محمد فدوی
جمعه 23 خرداد 1393, 20:23 عصر
شما تک تک مهره های حریف رو اسکن می کنی


لازم نیست تک تک مهره های حریف رو بررسی کنی. من قبلا چنین برنامه ای با ++C نوشتم.
کافیه شاه رو بررسی کنی. یه بار فرض میکنی شاه اسبه! اگه شاه مثل اسب حرکت کنه به یکی از اسبای حریف توی صفحه میرسه یا نه؟! اگه آره یعنی کیشه... همینطور واسه مهره های دیگه...
حالا باید ۸ تا خونه اطراف شاه رو به همین روش بررسی کنی که ببینی مات هم هست یا نه. سادست...

موفق باشی.

یوسف زالی
جمعه 23 خرداد 1393, 20:31 عصر
یه بار فرض میکنی شاه اسبه!

چه فرقی می کنه آخه؟
تعداد اسکن ها یکیه.

محمد فدوی
جمعه 23 خرداد 1393, 20:40 عصر
نه استاد دیگه اینو نگین! در بدترین حالت ها تعداد اسکن هایی که شما گفتین یکم کمتر میشه.
ولی توی شطرنج معمولا اطراف شاه پر مهرست و معمولا از یکی روی یکی از اضلاع صفحه قرار داره که باعث میشه فقط ۶ تا خونه برای حرکتش باقی بمونه... که این باعث میشه تعداد چک ها خیلی خیلی کم بشه.

یوسف زالی
شنبه 24 خرداد 1393, 00:25 صبح
حالا رو کاغذ شما یه بار دیگه بررسی کن. یادمه دوره دانشجویی ترم 4 یه همچین چیزی نوشته بودم.
با یک سری کلک ها می شه تعداد رو به می نیمم رسوند.
مثلا فقط سرباز های خونه بغلی چک می شن، بلاک ها چک نمی شن، و ..
به هر جهت در بدترین حالت هم تعداد چک شدن ها برای کیش، 9 عدد بیشتر نیست. البته در بدترین حالت، واسه همین هم ارزش نداره خیلی روی بهینه کردنش کار بشه.

محمد فدوی
شنبه 24 خرداد 1393, 02:33 صبح
من خودم شطرنج بازی میکنم و به همین دلیل هم یه بار سعی کردم برنامه شطرنج بنویسم و تمام سعی تلاشم به جایی رسید که برنامم به زور مسائل مات در یک حرکت رو حل میکرد!! :قهقهه:

بیاید دوتا پوزیشن رو بررسی کنیم... تصویر ۱ (سمت راست) که ضمیمه کردم یکی از پوزیشن های ایده آل شروع بازی هستش برای سفید (که هیچوقت اتفاق نمیفته) به موقعیت شاه دقت کنید. تو این حالت (که تو ۹۰٪ بازی ها همین حالت برای شاه پیش میاد) فقط کافیه ۳ تا خونه بررسی بشن. و چون جلوی شاه پر از پیاده های خودیه، برای فیل و رخ (و طبعا وزیر) بررسی چندانی لازم نیست چون این پیاده ها قطعا مانع هستن... فقط اسب هست که باید کامل بررسی بشه که اونم چون روی یکی از اضلاع صفحه هستیم ۲ تا از حرکاتش رو لازم نداریم. همچنین برای بررسی پیاده هم کار زیادی نداریم چون جلوش پره. حالا قضاوت با شما که کدوم بررسی کمتر زمان میبره...
پوزیشن سمت چپ (که یه بازی واقعیه) هم تا حدود زیادی همین شرایط رو داره (ولی ضعیف تر)
فقط در یک شرایط هست که شاه خیلی میاد وسط و خودش هم به عنوان یکی از سوارهای بازی وارد عمل میشه، اونم آخر بازی‌ (Endgame) هستش. در این شرایط چون بسیاری از سوارها دیگه حذف شدن (خصوصا وزیر) دیگه لازم نیست بررسی بشن.

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

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

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

یوسف زالی
شنبه 24 خرداد 1393, 09:26 صبح
یک راه دیگه که به ذهن من می رسه اینه که در هر حرکت خانه های خطرناک علامت گذاری می شن، به این ترتیب کیش بودن و یا مات شدن، هر دو به راحتی قابل تشخیص خواهد بود. به این ترتیب بصورت آن تایم پیش خواهد رفت.
در خصوص الگوریتم اول هم تمام مهره ها لازم نیست چک بشن، فقط دو تا سرباز، و مهره های غیر سرباز، با رعایت فاصله و موانع.
در مورد توضیحتون در خصوص نصف شدن مهره ها موافقم. در خصوص وزیر هم همین طور، وزیر با چک شدنش خود به خود دو فیل و دو رخ رو هم چک می کنه. می مونه یه اسب.
الگوریتم شما بهتره.
این رو هم اضافه کنم که موضوع سر 9 حرکت و 3 حرکت خارج از حلقه هست که هر دو نانو ثانیه ای بیش نیستند!
در خصوص الگوریتم، اگر جایگذاری کار خودتون بوده باشه، تبریک می گم.

محمد فدوی
شنبه 24 خرداد 1393, 17:03 عصر
خواهش میکنم. درسته واقعا خیلی تفاوت کمه. اما شطرنج اونقدر برنامه پیچیده ای داره که همینا هم اهمیت زیادی پیدا میکنن... (ابر کامپیوترهایی مثل DeepBlue و Hydra الان مشغول شطرنج بازی کردن با نرم افزار Fritz و ChessMaster هستن!!!) با اینکه در هر حرکت جاهای ممکن برای هر مهره هم محاسبه بشه موافقم...