طرح کامل شطرنج

طرح کامل شطرنج
سلام
آقا من می خوام به طور کلی طرح مسئله شطرنج با الگوریتمی که می گم و کارایی هاش اینجا مطرح کنیم و به کمک دوستان عطاش رو به لقاش ببخشیم.

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

شکل بازی ما در آخر باید یک مربع داشته باشه که بتونه بالا و پایین و چپ و راست در خانه ها حرکت کنه و با زدن دکمه اینتر مثلا روی سرباز اون رو انتخاب کنه و ما با حرکت دادن مربع اون رو به خونه دلخواه ببریم. همچنین باید قابلین undoکردن و save کردن با حفظ حالت مهره ها و load کردن بازی رو داشته باشه.

الگوریتم:
***طرح کلی: اول یه کلاس به نام مهره می سازیم و بقیه کلاس های دیگه مثل رخ یا اسب و غیره از کلاس مهره ارث بری می کنند.

به نظر من:{
کلاس مهره باید دارای خصوصیات زیر باشد:
1. مختصات x و y (x و y ای که الان داره)
2. مختصات xjو yj (x و y ای که قراه به اون بره)
3. color (یعنی سفید یا سیاه اگر =0 بود سیاه و اگر =1 بود سفید)
ولی باید صفحه ما هوشمند باشه یعنی قادر به تشخیص دادن اعضای روش باشه مثلا روی x=2 وy=3 اگر سرباز باشه باید با هر حرکت یک مهره تشخیص بده می تونه بزنه یانه(و قواعد شطرنج که همه به اون آگاهی دارید.) حالا به نظر من می تونیم یه آرایه صفحه 8*8 بگیریم و مثلا اگر سرباز سفید در مختصات (2و3) روش بود safhe[3][2]=10; بذاره حالا اگر سیاه بود safhe[3][2]=11 یعنی عدد اول نشانه نوع مهره و عدد دوم نشانه رنگ مهره باشه.}

حالا اگر کسی طرح بهتری داره بگه ولی باید الگوریتم کلی(با *** مشخص کردم) رو شامل بشه.
منظورم از طرح بهتر یعنی خصوصیات مربوط به کلاس مهره و توابع مربوط به هرکلاس.



یا علی
 

saalek110

Well-Known Member
من هم توی فکر نوشتن این برنامه بودم. ولی نه شی گرا. چون درست نمی تونم شی گرا کار کنم.

راستش قضیه از اینجا شروع شد.

ولی من هوشمندی برنامه برام مهمه نه طرز نوشتنش(شی گرا بودن با نبودنش) .
 
آخرین ویرایش:

saalek110

Well-Known Member
من توی اون تاپیک یک نمونه اولیه نوشته بودم. من تا آنجا کار کردم.
 

shirini_forush

Well-Known Member
اگر بخواید یه شطرنج دونفره بنویسید سه سوت بید (تقریبا)
ولی اگر بخواید یه نفر با کامپیوتر بازی کنه داستان فرق میکنه.
کار بسیار حرفه ای میشه.
باید حتما یه دوره الگوریتم کار کنید و با گراف و الگوریتم های اون کاملا آشنا باشید.
اگر قصدتون اینه توصیه میکنم با خوندن کتاب Introduction to Algorithm شروع کنید.
 
saalek اون شطرنجی که دادم
اون مربع حرکت می کنه وقتی روی مثلا سرباز اینتر می کنیم چه اتفاقی می افته؟؟؟؟؟؟؟
 

saalek110

Well-Known Member
منظورتان را متوجه نمی شم. بازی هیچ ارادی نداشت. اول یک مهره را با بردن مربع روی آن و زدن اینتر انتخاب می کنیم و بعد خانه مقصد را با همین روش انتخاب می کنیم و حرکت انجام میشه.
علاوه بر این برنامه صحت حرکت را هم چک می کند و اجازه نمی دهد مهره ای را اشتباه حرکت دهیم. مثلا فیل را مستقیم ببریم.
 

saalek110

Well-Known Member
نقل از :
http://forum.persiantools.com/t32403-page18.html
------------------------------------------------------------
مطلب زیر فکر کنم برای مدیریت پروژه های بزرگ مفید باشه:


من ابتدا open project را در توربو سي زدم.

و بعد نامي به پروژه خود دادم و در my document ذخيره كردم.

بعد add item را زدم.

بعد دو فايل .cpp كه قبلا ساخته بودم را add كردم.

در پنجره پايين توربو سي ، مي بينيم كه فايلها به پروژه كه نامش myp است اضافه شده اند.

محتواي فايلهاي من اين ها بود:

کد:
#include <iostream.h>
#include <conio.h>

void second_cpp();[color=red]//This is prototype [/color] for myfunction in second cppfile.



void main()
{
clrscr();

cout<<"main"<<endl;

second_cpp();

getch();
}

کد:
#include <iostream.h>
#include <conio.h>

void second_cpp()
{
cout<<"second cpp"<<endl;
}

بعد از منوي run ، روي run كليك كردم.

البته اين اولين باره كه من پروژه ام را با دو cpp راه مي اندازم. قبلا تمام فايلهاي ديگر را header مي كردم. و فقط فايل اولي را cpp مي كردم. ممنون از دوست عزيز. البته اون جوري هم اجرا مي شد ولي اين جوري فكر كنم اصولي تره و درست تره.
مانورهاي بعدي را خودتان تجربه كنيد ، ديگه من به ساده ترين شكل كار كردم. پروتوتايپ تابعي كه در cpp دوم بود را هم مجبور شدم در cpp اول قرار بدهم. ولي هنوز نمي دانم كه جاهاي مجاز ديگه كجاست.
اينكلودها را هم من مجبور شدم در هر دو فايل قرار دهم. با تركيب فايلهاي
.cpp & .h
خوتان ور برويد تا ببينيد اينكلودها را كجا بايد گذاشت.
حالا در my document من يك فايل دارم به اسم myp.prj كه هر وقت خواستم مي توانم با باز كردن اين پروژه خيلي سريع ، دو فايل كه از قبل درونش add شده را با هم اجرا كنم.
 
آخرین ویرایش:
فکر کنم منظورم رو متوجه نشدی
ببین وقتی که مثلا بر روی سرباز اینتر می کنیم در برنامه چه اتفاقی می افته؟؟؟
 

saalek110

Well-Known Member
آره اون موقع متوجه نشدم ولی بعد پست زدم فهمیدم منظور شما کد است. برای همین رفتم همه تابع ها را از برنامه اصلی خارج کردم و هر یک را یک فایل کردم. البته هنوز کامل نشده .

اما جواب شما: در تابع زیر....

کد:
void move_control (int positions[8][8],int move_info[],int x1,int y1,int x2, int y2)
{

	int call=0, x, y;
	int color = 2;
	static int xx1=x1,yy1=y1,xx2=x2,yy2=y2;	//to remove the image

	setcolor(color);
	setlinestyle (SOLID_LINE,1,THICK_WIDTH);
	rectangle(x1,y1,x2,y2);			//draws the box in its initial position as specified by the default values

	do
	{
		char detect_zero,direction;

		detect_zero = getch();

		if ( detect_zero != 27 && detect_zero == 0)		//avoiding the escape key
		{
			direction = getch();

			switch ( direction )
			{
				case	77:   move_right (x1,y1,x2,y2,color);
								break;
				case	80:	move_down (x1,y1,x2,y2,color);
								break;
				case	75:	move_left (x1,y1,x2,y2,color);
								break;
				case	72:	move_up (x1,y1,x2,y2,color);
								break;
				default :   messages ( 4 );
			}//end of switch
		}//end of 'avoiding escape key' if structure

		color = 2;
		setcolor(color);	//changing color back to 2 because it is turn 0 after the switch structure
		rectangle(x1,y1,x2,y2);


		x = x1;	//making copies
		y = y1;  //to send to coordinate manager

		if ( detect_zero == 27 )		//exiting on escape key
			exit(1);

		if ( detect_zero == 13 )		//[COLOR="Red"]detecting enter key[/COLOR]
		{
			coordinate_manager( &x,&y );
			if ( call == 0 )
			{
				color = 4;
				setcolor(color);                  //leavs an image
				rectangle(x1,y1,x2,y2);       //on the selected box
				xx1=x1, xx2=x2, yy1=y1, yy2=y2;	//updating values

				if ( verify_move (x,y,turn,call,positions) == 0 )
				{
					color = 2;
					messages ( 1 );
					setcolor(color);
					rectangle(x1,y1,x2,y2);
				}
				else
				{
					call = 1;
					move_info[2] = x;
					move_info[3] = y;
				}
			}

			else
			{
				setcolor (0);
				rectangle(xx1,yy1,xx2,yy2);
				rectangle(x1,y1,x2,y2);

				if ( verify_move (x,y,turn,call,positions) == 0 )
				{
					messages ( 2 );
					call = 0;
				}
				else
				{
					move_info[0] = x;
					move_info[1] = y;
					setlinestyle(SOLID_LINE,1,NORM_WIDTH);
					break;
				}
			}//end of else
		}//end of if that detects enter key
	}//end of while loop	that controls the box movement
	while (1);

}//end of move_control function

به دنبال جواب خود باشید.
 
آخرین ویرایش:

saalek110

Well-Known Member
کلا من undo نویسی کار نکرده ام و باید در این مورد سرچ شود. ولی چیزی که به نظرم می رسد شاید باید حرکت آخر را جایی save کرد و بعد با دریافت دکمه undo برویم سراغ آن حافظه و کار عکس را انجام دهیم.
و می دانید که برنامه های پیشرفته تر undo های بیشتری دارند. نمی دانم رکوردش چند تاست. مثلا word چند تا داره یا ویژوال استودیو و الی آخر.
=========================

راجع به save هم خوب هر چه اطلاعات بیشتری بازی روی هارد ثبت کند بهتر است ولی حداقلش باید موقعیت نهایی مهره ها ذخیره بشه تا بعدا بشه بازی را ادامه داد.
یک درجه بهترش اینه که سیر بازی (یعنی حرکات دو طرف ) هم save بشه.
و این که نوبت کیه هم به نظرم باید save بشه که در این بازی همان turn است فکر کنم. که یک متغیر گلوبال است در این برنامه.
 

جدیدترین ارسال ها

بالا