PDA

View Full Version : سوالات من در مورد نوشتن این برنامه



mahyar.ab
جمعه 11 خرداد 1386, 00:30 صبح
سلام
خوب اولین پستم رو اینجوری شروع می کنم. پروژه ی آخر ترم ما در مورد نوشتن بازی شطرنج هستش .البته نه به صورت کامل بلکه فقط برنامه ای که با انجام دادن حرکت بعدی شرایط کامل صورت گیرد .نمیدونم منظورم رو فهمیدید یا نه منظورم این هستش که اگه شما اسب را یک خانه جلو ببرید احتمال دارد با مهره بعدی برخورد کند که در این طورت در شطرنج خطا است و یا اینکه خانه بعدی آزاد باشد و فقط اسب یک خانه جلو برود .و دومین در خواست از ما این بود که با حرکت دادن چند مهره برنامه خبر دهد که شاه کیش است یا نه.
خوب استادمون ما رو تا یک حد کوچک کمک کرد و فقط گفت که باید از یک آرایه دو بعدی 8 در 8 استفاده کنید.
من بگم که در انجمن سرچ کردم اما یا نتیجه خوبی بدست نیاوردم و یا اینکه فایل هایی که دانلود می کردم رو نمیدونستم باید چطوری استفاده کنم.
تقاضای من از شما این هستش که سوالالت من رو جواب بدید نه این که مسله را حل کنید و ....
خوب اول از همه من در مورد حرکت هر یک از بازیکنان شطرنج از شما سوال دارم.
اینکه مثلا رخ فقط یا بالا می رود یا به سمت راست و چب میرود حالا ما این کار رو چطوری نشون بدیم.منظورم اینه که ما مثلا برای بالا رفت یک تابع می نویسیم حالا برای چب و راست رفت هم چی .یعنی برای هر یک از حرکات نیز باید یک تابع بنویسیم یا اینکه روشی برای این منظور وجود داره.
برای بهتر شدن مفهوم من قسمتی از سورس برنامه رو براتون می گذارم که شاید بهتره بشه فهمید.


http://nonama.persiangig.com/document/Untitled-1.jpg
خوب اصلا این طوری نوستن درست هستش؟ منظورم استفاده از حلقه هستش درسته یا نه؟
یا باید از راهه دیگه رفتش.اگه اینطوریه لطفا راهنمایی کنید. راستی برای call کردن تابع برای asize و bsize چی نوشت چون یک جورایی خودش باید این رو بدست بیاره.
ممون از اینکه کمک می کنید راستی این رو هم بگم که رشته ما برق هستش که چنین پروژه ای ازمون خواستند نه کامپیوتر.

emad_67
جمعه 11 خرداد 1386, 08:26 صبح
برای حرکت رخ میشه دو تابع برای حرکات اون تعریف کرد یا تو همون تابعی که نوشتی یه پارامتر سومی به تابع بدی و بعد در یک دستور شرطی مشخص کنی که کروم نوع حرکت باید انجام بشه در مورد استفاده ارز حلقه for هم درسته و مشکلی نداره ولی می خواستم بدونم asize و bsize مختصات جایی است که مهره باید به اونجا بره یا نه؟ و منظورت از اینکه باید خودش این مختصات رو به دست بیاره چیه؟

mahyar.ab
جمعه 11 خرداد 1386, 10:46 صبح
راستش خود من هم موندم که asize و bsize و چیکار کنم. نظر شما چیه؟

emad_67
جمعه 11 خرداد 1386, 13:23 عصر
والا من چی بگم شما برنامه رو این جوری نوشتی
ضمنا یه چیزم یادم رفته بود بگم اینه که شما تو خلقه for نوشتی


x[i++][]

می خواستم بگم که بعد دوم رو ختما باید قرار بدی نه اینکه خالی بزاری و ضمنا چون حلقه for برا اساس مقدار i کنترل میشه دیگه توی [] از یه متغییر دیگه استفاده کن چون ای جوری مشکل ایجاد می کنه

mahyar.ab
جمعه 11 خرداد 1386, 20:27 عصر
راه دیگه ای به ذهن من نیو مد اگه میشه یکم راهنمایی کنید.

emad_67
جمعه 11 خرداد 1386, 21:33 عصر
می تونی تابع رو به این شکل تعریف کنی


void rook(int a[][8],int x,int y,int direct,int move)

که تو این تابع x, y مختصات فعلی مهره اند و direct جهت حرکت رو مشحص میکنه و move هم تعداد خونه هایی هست که باید در یک جهت حرکت کنه

mahyar.ab
جمعه 11 خرداد 1386, 23:31 عصر
می تونی تابع رو به این شکل تعریف کنی


void rook(int a[][8],int x,int y,int direct,int move)
که تو این تابع x, y مختصات فعلی مهره اند و direct جهت حرکت رو مشحص میکنه و move هم تعداد خونه هایی هست که باید در یک جهت حرکت کنه
خوده تابع رو اونوقت باید چطوری بنویسیم.
ببخشید انقدر سوال می کنما

azmoodeh
شنبه 12 خرداد 1386, 00:09 صبح
سلام

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

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

اول کار هم طبق قواعد شطرنج مهره ها ( آبجکت ها ) رو توی آرایه 8*8 می چینیم.

حالا دو تابع کلی به اسم های WhiteMove , BlackMove تعریف می کنیم که توی یک حلقه بی نهایت هستند ، این دو تابع تعریفشون تقریبا یکی هست با این تفاوت که یکیش برای مهره های سفید تصمیم می گیره یکیش برای سیاه .(همینجا چنانچه هر طرف بازی کاربر انسانی هست فقط فرآیند مناسب انجام میشه و در غیر اینصورت برنامه تصمیم می گیره ) . مهره هایی که حذف میشن هم آبجکتشون از بین میره و هم مقدار خونشون پوچ میشه . و ....


امیدوارم تونسته باشم کمک کنم.
موفق باشید

emad_67
شنبه 12 خرداد 1386, 09:23 صبح
خوده تابع رو اونوقت باید چطوری بنویسیم.
ببخشید انقدر سوال می کنما

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


void rook(int a[][8],int &x,int &y,int direct,int move)
{
if(direct==1)
{
for(int i=0;i<move && y<8;i++)
y++;
a[x][y]=1;
}
......
}

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

mahyar.ab
شنبه 12 خرداد 1386, 11:44 صبح
ممنون از همه
البته ما شی گرا رو می خونیم اما قبلش باید پروژه رو تحویل بدیم. استاده اور کلاک کرده دیگه.
من برای فرا خوانی تابع چیزی به ذهنم نمیرسه . چون اولین پروژه برنامه نویسی منه من اصلا نمیدونم از کجا باید شروع کنم. فکر کردم که اول باید حر کات هر یک از مهره های شطرنج رو بنویسم بعد کارای دیگه. برای همین از شما دوستان کمک گرفتم.
بر حر کت اسب 8 تابع نیازه یعنی باید برای هر 8 تاش هم یک تابع بنویسیم؟؟

emad_67
شنبه 12 خرداد 1386, 13:19 عصر
برای حرکت اسب هم می تونی یه تابع تعریف کنی به این صورت


void knight(int a[][8],int x,int y,int move)

که تو این تابع x,y همون مختصات فعلی اند و این دفعه move نوع حرکت رو مشخص میکنه ضمنا باید این آرایه رو هم در تابع تعریف کنی


int h[8]={2,1,-1,-2,-2,-1,1,2};
int v[8]={-1,-2,-2,-1,1,2,2,1};

فرض کن مختصات فعلی ما یعنی x=0 و y=0 هست و مقدار move هم 7 هست بنابراین برای به حرکت در اوردن اسب به صورت L باید بنویسی


a[x+v[move]][y+h[move]]

که این دستور میاد اسب رو حرکت میده از خونه 0و 0 به خونه 1 و 2
در واقع نو ع حرکت های L شکلی رو با این دو تا آرایه شبیه سازی میکنیم که با مقدار move نوع حرکت L شکلی در جهت های مختلف میتونه صورت بگیره

mahyar.ab
چهارشنبه 16 خرداد 1386, 23:39 عصر
راستش توضیحات شما کمکی به من نکرد میشه یکم توضیح بدید.

emad_67
پنج شنبه 17 خرداد 1386, 00:42 صبح
یعنی کلا از توضیحات من چیزی نفهمیدی یا قسمتی شو یا قسمتی شو
اگه قسمتی شو نفهمیدی بگو کدوم قسمت تا توضیح بدم

mahyar.ab
جمعه 18 خرداد 1386, 23:19 عصر
یک سوال دارم ارتون: اگه به شما پیشنهاد نوشتن این برنامه داده می شد از کجا شروع می کردید؟

emad_67
شنبه 19 خرداد 1386, 16:48 عصر
یک سوال دارم ارتون: اگه به شما پیشنهاد نوشتن این برنامه داده می شد از کجا شروع می کردید؟

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