نوشته شده توسط
majidshe
با الگوریتم ژنتیک مسئله 8 وزیر را در متلب و ی شارپ لازم دارم لطفا کمک کنید
آموزش پیاده سازی گرافیکی هشت وزیر با C#
گام نخست : پیاده سازی مهره و کاشی بازی
را ایجاد کنید.eight_queen ای به نام Windows Application برنامه Visual C# را اجرا کنید و از قسمت Visual Studio
SquareControl.cs به نام User Control یک Add new item بر روی پروژه یتان کلیک راست کنید و از قسمت
کاشی صفحه شطرنج ما را می سازدUser control را ایجاد کنید.در واقع این
این کنترل را به 32, 32 تغییر می دهیم.حالا کاشی تخته یمان آماده شد!size
تخته یمان که به شکل دایره است می رسد(Discs)نوبت به طراحی مهره های
این مهره ها را می توان به 2 صورت پیاده سازی کرد:
با قرار دادن عکس وزیر درون کاشی های شطرنج .1
با کشیدن دایره درون کاشی های شطرنج. .2
که در این مقاله راه دوم را برگزیدیم.یعنی با کد زیر دایره ای با رنگ سفید یا سیاه درون کاشی هایمان رسم می کنیم.
e.Graphics.DrawEllipse(SquareControl.pen, left, top, width, height);
را حذف کردیم و آنرا به گام های بعدی محول کرده ایم.shadow و animationدر این گام ما قسمت
گام دوم : تعریف پارامترها و نام دامنه برای User Control ها
اضافه می کنیم:User controlدر ابتدای کار نام دامنه زیر را
using System.Drawing.Drawing2D;
سپس رنگ کاشی خود را تعیین می کنیم:
public static Color NormalBackColor= Color.Green;
باید متغیری برای ذخیره کردن ردیف و ستون مهره ها ایجاد کنیم.به این دلیل که کدمان حرفه ای تر بشود ، آنها را تعریف کرده ایم:propertyمستقیمان به صورت
// These reflect the position of the square on the board.
Public int col{get;set;}
public int row{get;set;}
در انتها هم رنگ و قلم موی خود را انتخاب می کنیم:
// Drawing tools.
Private static Pen pen = new Pen(Color.Black);
private static SolidBrush solidBrush = new SolidBrush(Color.Black);
گام سوم : تابع تنظیم ردیف و ستون
ما در این گام باید تابعی را بسازیم که بتوانیم از بیرون از این کلاس، ردیف و ستون مهره هایمان را تنظیم کنیم.
در گام پیشین تعریف propertyبا این کار ما میتوانیم وضعیت ردیف و ستون مهره هایمان را که به صورت
کردیم را دریافت کنیم و پس از محاسبه حرکت صحیح توسط هوش مصنوعی برنامه یمان بوسیله ی این تابع
از دوباره ردیف و ستون مهره هایمان را مقدار دهی کنیم.
Public SquareControl(int row, int col)
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
this.Contents = Board.Empty;
this.row = row;
this.col = col;
// Prevent the control from receiving focus via the TAB key.
This.TabStop = false;
// Set the background color.
This.BackColor = SquareControl.NormalBackColor;
}
گام چهارم : ایجاد و نابود سازی User Control ها
ن مقاله موزیرود در محیط های مختلف طراحی و پیاده سازی کنند.گوریتم هشت وزیر را تحلیل کرده و بازگشتی و غیر بازگشتی نوشته
InitializeComponent()تابعی ای که شاید در گام قبل برای برخی ها نا آشنا به نظر برسد تابع
ما را می سازد. و در بطن کد نویسی ما دخالتیuser controlمی باشد.این تابع در واقع اجزای اصلی
ندارد:
private void InitializeComponent()
{
// SquareControl
this.Name = “SquareControl”;
this.Size = new System.Drawing.Size(32, 32);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.SquareControl_Paint);
}
می باشد.همانگونه که می دانید دات نت دارای خواصیتی به نامuser controlتابع بعدی ما برای نابود سازی
خود خارج می شود.scoop می باشد .به این معنا است که هنگامی که کنترل ما از Garbage collector
دات نت بصورت خودکار آن شئی را نابود می کند.این خواصیت دات نت باعث بهبود عملکرد برنامه می شود.
Protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
بصورت خودکار توسط ویژاوال استدیوdispose و InitializeComponent تابع
ایجاد می شود،بنابرین نیاز به حفظ کردن و توضیحات در این باره نمی باشد.
فقط نکته ای که در این بین هست، ما برای سحولت و داکیومنت کردن این پروژه
SquareControl.cs در قسمت SquareControl.Designer.csآنرا از قسمت
نوشته ایم.به این دلیل که هر دوی آنها درون یک کلاس می باشند.در کد نویسی
آن تفاوتی بوجود نمی آید.
گام پنجم : چیدن مهره ها در صفحه شطرنج
حالا به مهم ترین قسمت طراحیمان که همان طراحی مهره ها می باشد میرسیم.در این مرحله ما باید هر دفعه که
ما فراخوانی می شود، مهرهایمان ها را بچینیم.
می باشد. SquareControl_Paint ای که می توانیم برای اینکار فراخوانی کنیم،eventبهترین
ما فراخوانی میشود. کد های درونUser controlحالا با قرار دادن کدهایمان درون این تابع هربار که
آن اجرا می شود.
برای اینکه ما بهترین حالت نمایش مهره هایمان را داشته باشیم،باید قطعه کدی را بنویسیم که به رایانه بگوییم هدف ما یک گرافیک خوب می باشد نه یک طراحی سریع و یا بدون لرزش. قطعه کد زیر اختیاری است به این معنی که اگر قطعه کد زیر را وارد نکینم، باز هم برنامه ما اجرا می شود ولی گرافیک برنامه ما پایین می آید:
// Set drawing options.
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
حالا ما با دستور شرطی حالتی را میسنجیم که در صورت برقرار بودن هر یک از 2 شرط زیر دستور مربوطه اجرا شود:
1. کاشی ما در حال حاضر دارای هیچ مهر ای نباشد
2. محتویات جدید کاشی ما مهره سیاه باشد.
if (this.Contents != Board.Empty)
در مرحله بعد،باید مکان مهره را درون صفحه شطرنج مشخص کنیم. همانگونه که از قبل به یاد دارید مهره های ما بصورت یک دایره بوسیله کد زیر روی کاشی هایمان رسم
رسم میکنیم:
e.Graphics.FillEllipse(SquareControl.solidBrush, left, top, width, height);
) مهره هایمان روی کاشی از کد زیر استفاده می کنیمpositionخوب،برای تعیین مکان (
// Get size and position parameters based on the control size.
Int size = (int) (this.Width * (0.80));
int offset = (int) ((this.Width – size) / 2);
int thickness = (int) (size * 0.08);
int width = size;
int height = size;
int left = offset;
int top = offset + (int) Math.Round((double) (size – height) / 2.0);
حالا درون شرط بالا، شرط دیگری را اضافه میکنیم.در این شرط بررسی می کنیم که آیا
کاشی قبلی خالی بوده است یا خیر.این شرط را به این دلیل بررسی می کنیم که
اگر مهره ای قرار نگرفته بود آنرا بسازیم.
If (this.PreviewContents == Board.Empty)
{
SquareControl.solidBrush.Color = Color.Black;
else
{
}
e.Graphics.FillEllipse(SquareControl.solidBrush, left, top, width, height);
}