صفر تا صد ساخت بازی با سی شارپ 2#

صفر تا صد ساخت بازی با سی شارپ 2#
سال 2014 مارکوس پرسون خالق بازی Minecraft ، یک خانه 70 میلیونی دلاری در Beverly Hills آمریکا خرید . این جوان سوئدی با ساخت بازی Minecraft توانسته است چنان درآمدی کسب کند که این خانه گران قیمت را بخرد . از این داستان به این نتیجه می شود رسید که برنامه نویسی از پتانسیل بالایی برای آمد زایی برخوردار است ، پس برای رسیدن به آینده روشن دست از تلاش بر ندارید و با ما همراه باشید . کسی چه می داند شاید نفر بعدی یک ایرانی باشد.
آموزش SEO
مقالات آموزش SEO,فیلم آموزش SEO,کتاب های آموزش SEO رایگان و دوره آموزش SEO,
بالا آمدن در گوگل
چگونه در صفحه اول گوگل دیده شویم
ثبت شرکت و ثبت برند
ثبت شرکت و ثبت برند سریع و فوری توسط مجموعه ثبتی حقوقی نخستین ثبت 02188646492
خودتان را اینجا معرفی کنید

در جلسه قبلی برنامه Visual studio 2015 را نصب کردیم و یک پروژه جدید ساختیم و به اختصار در مورد محیط VS 2015 صحبت کردیم . در این جلسه کمی بیشتر با این محیط کار می کنیم و کد نویسی می کنیم و با مفاهیم اولیه مثل متغییر ها و انواع داده ، متدها و رخدادها آشنا می شویم .
 

متغییرها

متغییر به چیزی گفته می شود که قابل تغییر باشد. یک متغییر ممکن است در طول برنامه چندیدن بار تغییر کند. زندگی انسان را در نظر بگیرید ، نام انسان در سراسر زندگی او ثابت است ولی سن چیزی است که در هر برهه از زندگی انسان تغییر می کند پس متغییر است . در برنامه های کامپیوتری نیز گاهی نیاز داریم تا تغییراتی در مقدار یک عدد یا محتوای یک نوشته ایجاد کنیم. به این منظور از متغییر ها کمک می گیریم. در سی شاپ متغییر ها انواع مختلفی دارند که بسته به کاری که قرار است انجام شود ،  نوع این متغییرها مشخص می شود ، بعنوان مثال برای کار با اعداد باید متغییر را از نوع داده عددی تعریف کنیم و برای کار با حروف ، کلمات و یا جملات باید متغییر را از نوع داده رشته ای تعریف کنیم . زمانی که یک متغییر تعریف می کنیم ، در واقع یک بخشی از رم به آن اختصاص داده می شود و بسته به نوع داده ای متغییر ، حجم فضای اشغالی  در رم متفاوت خواهد بود. متغییر ها باید اسم داشته باشند و این اسامی نباید تکراری انتخاب شوند . در سرتاسر برنامه ما از طریق همین اسامی با متغییر ها کار می کنیم. نام گذاری متغییرها قواعدی دارد که باید رعایت شوند ، در غیر این صورت برنامه دچار خطا می شود. در زیر قواعد نام گذاری متغییر ها و همچنین انواع داده آورده شده اند.

قواعد نام گذاری متغییرها

1 – اسم یک متغییر نباید با عدد شروع شود مثل 5X اما می تواند با عدد تمام شود یعنی X5.
2- نباید از کلماتی که قبلا توسط سی شارپ استفاده شده اند استفاده کنید . به این کلمات ، کلمات رزرو شده یا کلمات کلیدی گفته می شود . مثل int,string,float,double (کلماتی که به رنگ آبی نوشته می شوند)
3- در نام گذاری متغییر ها امکان استفاده از کارکترهای  *،+،-،/،...  وجود ندارد مثلا : +total*  ، result  نام گذاری به این شکل اشتباه است .
4- در نام متغییر نباید از فاصله استفاده کرد مثلا : d total این نام نیز اشتباه است.
5- تنها کارکتری که مجاز به استفاده ازآن در نام گذاری متغییرها هستید کارکتر (underline (_)) است مثلا : X_name , total_result اینگونه نام گذاری بلامانع است.

نوع های داده ای (Data type)

int (برای تعریف اعداد صحیح استفاده می شود. مانند : 28)
string (برای تعریف رشته ها استفاده می شود. مانند : MajidOnline)
char (برای تعریف یک حرف تنها یا همان واژه نه یک کلمه یا جمله استفاده  می شود. مانند :    a,c,x)
float (برای تعریف اعداد اعشاری با دقت 7 رقم استفاده می شود )
double (برای تعریف اعداد اعشار با دقت اعشار 16 رقم استفاده می شود)
boolean این نوع از داده فقط دو حالت دارد:  True به معنی  درست  و  False به معنی غلط .
*نکته : برای دیدن تمام نوع های داده ای و حافظه مورد نیازشان و همینطور بازه عددی شان می توانید به اینجا سر بزنید.

نحوه تعریف متغییر

برای تعریف متغییر باید بصورت زیر عمل کنید :
مقدار         =       نام متغییر       نوع داده ;
int             x                =         5 ;
string       name         =        “ali” ;

متد یا همان تابع

فرض کنید که می خواهید یک برنامه ای بنویسید که در برنامه شما یک سلسله کار مشخص قرار است در جاهای مختلف برنامه چندین بار اجرا شود. بعنوان مثال با گذشت هر چند خط  از برنامه یک پیغام چاپ شود و شماره خط آن قسمت را نمایش دهد . آیا این سلسله کد را هر جا از برنامه که می خواهید پیغام نمایش دهده شود کپی می کنید؟ در این صورت که حجم کد بسیار زیاد می شود، ضمنا اگر قرار در آینده تصمیم به تغییر پیغام گرفته شود ، در این صورت باید بگردید و هر جا که از این قطعه کد استفاده شده است پیدا کنید و آن را تغییر بدهید . حالا فرض کنید این برنامه دارای 10000 خط کد باشد و این پیغام در 500 قسمت مختلف کپی شده باشد. براحتی متوجه می شوید که این کار بسیار دشوار است . پس راه حل چیست ؟ راه حل استفاده از متد (تابع) است. توابع همان مفهوم ریاضی خود را دارند. توابع می توانند دارای هیچ یا چند ورودی باشند و همچنین می توانند دارای هیچ یا چند خروجی باشند. به زبان ساده تر ، اینطور می شود بیان کرد که ما به متد تعدادی ورودی می دهیم و متد به ما تعدادی خروجی می دهد. در واقع متدها زیر برنامه هایی هستند که خارج از بدنه اصلی برنامه تعریف می شوند و می توانند در بدنه اصلی برنامه یا دیگر متدها چندیدن بار فراخوانی شوند . استفاده از متد باعث کاهش حجم کد شده و همچنین از تکرار کد جلوگیری می کند و منجر به شکل گرفتن نظم کلی در برنامه می شود . این نظم کمک بزرگی به مدیریت برنامه می کند.
نحوه تعریف متد (تابع) :
(ورودی ها) نام تابع        نوع خروجی
{
         قطعه کدی که باید اجرا شود
}
 
نوع خروجی تابع چیست ؟ هر تابع مسئول انجام عملیاتی است و ممکن است که از  این عملیات نتیجه ای حاصل شود. بعنوان مثال : یک تابع را در نظر بگیرید که عملیات جمع دو عدد را انجام می دهد. اعداد صحیح a , b گرفته و با هم جمع می کند و حاصل جمع را بر می گرداند. پس خروجی تابع باید از نوع اعداد صحیح (int) باشد.
int sum(int a, int b)       
{
            int result = a + b;//جواب عملیات جمع  را در متغییر نتیجه قرار می دهد
            return result; 
}
*نکته : در عملیات انتساب(مساوی) ابتدا سمت راست مساوی اجرا می شود سپس در سمت چپ مساوی کپی می شود.
*نکته : کلمه return یک کلمه کلیدی است. در توابع برای خارج کردن نتیجه از این کلمه کلیدی استفاده می کنیم.

قواعد نوشتاری

هر زبانی قواعد نوشتاری خود را دارد ، زبانهای برنامه نویسی هم از این قاعده مستثنا نیستند و شما باید از قوانین نگارشی آن زبان برنامه نویسی پیروی کنید. در غیر این صورت برنامه شما دچار خطای نوشتاری خواهد شد و اجرا نخواهد شد.     
1 - هر خط از کد باید به علامت (;) "سمی کامن" تمام شود.
2 - هر بلاک از برنامه باید با علامت { شروع و با علامت } تمام شود.
3 - برای نوشتن توضیحات یک خطی از علامت // استفاده می شود و برای نوشتن توضیحات چند خطی ابتدا باید توضیحات را با /* شروع کرد و در پایان توضیحات  */ قرار داد. هر چند خط که بین این دو علامت قرار داشته باشد توضیح به حساب می آید و بخشی از برنامه محسوب نمی شود در نتیجه کامپایلر از آن قسمت می گذرد . در سی شارپ توضیحات به رنگ سبز نوشته می شوند.

امتحان کنید  1 :

برنامه Visual studio را اجرا کنید . پروژه قبلی که ساختید را باز کنید یا می توانید یک پروژه جدید بسازید . چون قبلا یک فرم داشتیم فعلا فرم جدیدی نمی سازیم و با همان فرم قبلی کار می کنیم. اگر ابزاری را از جعبه ابزار به فرم اضافه کردید آن را پاک کنید . حالا یک صفحه تمیز و آماده برای کار داریم ، ولی این فقط ظاهر برنامه است و هیچ کاری برای ما انجام نمی دهد ، درست مثل یک ماشین است که بدنه دارد ولی از موتور و دیگر تجهیزات داخلش خبری نیست . خب مسلما این ماشین قادر به حرکت نخواهد بود . پس حالا چطور باید موتور محرک برنامه را اضافه کنیم. برای اینکار روی Form1 کلیک راست کنید، گزینه View code را انتخاب کنید یا می توانید کلید F7 را بزنید. یک صفحه مثل تصویر زیر باز می شود.


این صفحه در واقع زیر کاپوت Form1 است یعنی موتور برنامه قرار می گیرد و تمام کدهایی که برای اجرای برنامه لازم هستند در این قسمت نوشته می شوند.
همانطور که می بینید چند خط کد توسط ویژوال استودیو نوشته شده است ، ما با آنها کاری نداریم .تنها کمی توضیحات در مورد این کدها کافیست تا متوجه عملکرد آنها بشوید.
در ابتدا چند خط با کلمه using (به معنی استفاده کردن) شروع شده اند. با استفاده کلمه کلیدی using از کدهای که قبلا نوشته شده اند استفاده می کنیم.این کار باعث ساده تر شدن کار ما می شود و دیگر لازم نیست همه چیز را از اول برنامه نویسی کنیم . کنترل هایی که روی فرم قرار دادیم هم قبلا برنامه نویسی شده بودند و ما فقط ازآنها استفاده کردیم ، تنها با اضافه کردن این خط using System.Windows.Froms ما توانستیم از کنترلهای درون جعبه ابزار استفاده کنیم.
فعلا از خطوط 10 و 12 عبور می کنیم و بعدا در موردشان صحبت خواهیم کرد . اما این را بخاطر داشته باشید که تمام برنامه های که ما خواهیم ساخت این خطوط را خواهند داشت و اما خط 14 چیست؟ هر برنامه دارای یک تابع آغازین است که برنامه از آن تابع شروع می شود . این تابع در تمام فرمهای که درست می کنیم وجود دارد و هم نام با فرم است.
خب حالا که تا حدودی با قسمت کد برنماه آشنا شدید ، بهتر است به کار اصلی برگردیم و با چند تا از کنترلهای داخل Toolbox آشنا بشویم.به قسمت طراحی فرم یک برگردید و از توی جعبه ابزار قسمت Common Controls را باز کنید ، کنترل  Label را بگیرید و بکشید و روی Form1 رها کنید. روی آن کلیک کنید تا انتخاب شود ، حالا روی تب Properties که در سمت راست صفحه است کلیک کنید سپس دکمه پین بالای پنجره Properties را بزنید تا در جای خودش قفل شود .حالا صفحه شما باید به صورت زیر باشد :


هر کنترل ویندوزی که ما ازش استفاده می کنیم تعدادی ویژگی دارد، مثل : نام ، متنی که باید نمایش داده شود ، طول و عرض ، محل قرار گرفتن کنترل در صفحه و ... که به هر کدام از این ویژگی ها Property گفته می شود. پنجره Properties تعدادی از این ویژگی ها را که در محیط طراحی قابل تغییر هستند را برای ما نمایش می دهد ، بعدا بیشتر در مورد Property ها صحبت می کنیم.
اکنون یک کنترل از نوع Label روی صفحه داریم .کار کنترل Label همانطور که از اسم آن مشخص است ، برای نمایش متن کنار یک کنترل دیگر استفاده می شود . روی label1 کلیک کنید ویژگی Text را پیدا کنید می بینید که عبارت Label1 برای این متغییر ثبت شده است یعنی دقیقا عبارتی که روی فرم دیده می شود . این ویژگی را به This is a test تغییر دهید . یک کنترل Button به فرم اضافه کنید . ویژگی Text کنترل را به Click me! تغییر دهید. ویژگی Name دکمه را به btn_ChangeText تغییر دهید ( btn مخفف Button است. در این دوره از این سبک نام گذاری استفاده می کنیم مانند : lbl بجای Label ). روی دکمه ای که اضافه کردید دوبار کلیک کنید، با اینکار وارد قسمت کد می شوید ، مشاهده می کنید که چند خط کد دیگر به کدهای قبلی اضافه شده است .(کد زیر)
private void btn_ChangeText_Click(object sender, EventArgs e)
{
}
همان طور که می بینید یک متد بصورت خودکار اضافه شده است . کلمه private یک کلمه کلیدی است(کلمات کلیدی در #C به رنگ آبی نوشته می شوند) فعلا نیازی به توضیح این مطلب نیست و اگر شما را آزار می دهد می توانید آن را حذف کنید. کلمه void همان نوع خروجی تابع است .(void) به معنی هیچی است (بعنوان مثال اگر خروجی تابع عدد بود باید می نوشتیم int) و بعد از آن اسم تابع است که درواقع اسم دکمه بعلاوه Click است. در آخر هم ورودی ها هستند که ما کاری با آنها نداریم. در آینده با این سبک متدها سرکار زبادی دارید. این متدها از پیش تعریف شده اند و در شرایط خاصی به کد اضافه می شوند. مثلا زمانی که کاربر روی یک کنترل کلیک می کند . در کد بالا قسمت اسم متد را می بینید که بعد از اسم خود دکمه کلمه Click اضافه شده است این شیوه نام گذاری نشان می دهد که این متد زمانی اتفاق می افتد که کاربر روی این دکمه کلیک کند در واقع به این سبک متدها Event (رخداد) گفته می شود. مشخصا زمانی اجرا می شوند که یک رخداد خاص مانند کلیک کردن رخ می هد . برخی از این رخدادها برای اکثر کنترل ها وجود دارند . برای اینکه بیشتر این موضوع را لمس کنید به محیط طراحی برگردید و دکمه Click me! را انتخاب کنید و بعد روی پنجره Properties بروید. یک علامت رعد و برق(روی تصویر زیر با فلش قرمز مشخص شده است) می بینید روی آن کلیک کنید. یک لیست از تمام رخدادهایی که می توانند برای این کنترل رخ بدهند را نمایش می دهد. همانطور که می بینید جلوی رخداد Click اسم متدی که در بالا دیدم نوشته شده.
 

حالا اگر بخواهید برای رخداد دابل کلیک label1 برنامه بنویسید کافیست تا label1 را انتخاب کنید و از قسمت رخداد ها ، رخداد DoubleClick را پیدا کنید و روی آن دوبار کلیک کنید.می بینید که یک رخداد برای label1 اضافه شد و اگر از این به بعد در زمان اجرای برنامه بر روی label1 دابل کلیک شود قطعه کد داخل این متد اجرا خواهد شد. پس مفهوم رخداد یا همون Event را متوجه شدید . به قسمت کد برگردید و درون رخداد مربوط به کلیک دکمه Click me! این کدها رو اضافه کنین.
private void btn_ChangeText_Click(object sender, EventArgs e)
{
        label1.Text = "Button change text is clicked”;
}
*نکته :  رشته ها باید در داخل گیومه قرار بگیرند و در غیر اینصورت برنامه یک خطای نوشتاری می گیرد و اجرا نخواهد شد.
*نکته : برای دسترسی به یک ویژگی از یک کنترل در محیط کد اول اسم اون کنترل را می نویسیم بعد یک (.) می گذاریم و بعد اسم اون ویژگی را می نویسیم . البته به محض اینکه (.) را بزنید خود ویژوال استودیو تمام ویژگی ها را بصورت یک لیست مرتب شده نمایش می دهد . اگر این منو نمایش داده نشد یعنی اشتباه تایپ کرده اید و یا اگر پنجره را بستید کلید Ctrl+space را بزنید دوباره نمایش داده می شود.
 
داخل رخداد دابل کلیک label1 کد زیر را قرار بدید.
 
private void label1_DoubleClick(object sender, EventArgs e)
{
       string t = "label1 is double-clicked”;
       label1.Text = t;
}
*نکته : فراموش نکنید که آخر خطوط داخل براکت علامت (;) را بذارید.
برنامه را اجرا کنید و روی دکمه کلیک کنید می بینید که متن label1 تغییر می کند . این بار روی label1 دوبار کلیک کنید مشاهده می کنید که متن label1 به جمله ای که در رخداد دابل کلیک label1 نوشته بودید تغییر می کند. 

چگونه کار می کند :

در قسمت رخداد کلیک btn_ChangeText ویژگی Text از label1 را مقدار دهی کردید و چون ویژگی Text از نوع داده ای string است از علامت گیومه برای متن استفاده کردید و در قسمت رخداد دابل کلیک label1 یک متغییر از نوع داده ای string (رشته ای) تعریف کردید و متن مورد نظر را داخل آن قرار دادید و بعد اون متغییر را مساوی با ویژگی متن  label1 قرار دادید . به این وسیله نحوه تعریف متغییر رشته ای را با هم دیدیم.
دوباره به قسمت طراحی بگردید و روی فرم کلیک کنید و به قسمت رخدادها تو پنجره Properties بروید و روی رخداد load دوبار کلیک کنید تا این رخداد ساخته شود. در داخل این رخداد کد زیر را وارد کنید و برنامه را مجدا اجرا کنید.
 
private void Form1_Load(object sender, EventArgs e)
{
            int a = 5;
            int b = 7;
            int c;
           c = a + b;
 
            MessageBox.Show(c.ToString());
}
همانطور که می بینید قبل از اینکه فرم ظاهر بشود یک کادر با یک دکمه Ok نمایش داده می شود در داخل فرم عدد 12 نوشته شده است که حاصل جمع a و b است. زمانی که دکمه Ok را بزنید فرم اصلی ظاهر می شود. رخداد load زمانی اجرا می شود که فرم اجرا شود . در داخل رخداد می بینید که سه تا متغییر از نوع int تعریف کرده ایم . متغییر اول و دوم که مشخص هستند اما سومی در زمان تعریفش مقدار نگرفت . این امکان وجود دارد که متغییر ها را در زمان تعریف مقدار دهی نکنید ، اگر اینکار را انجام بدهید یک عدد بصورت تصادفی در متغییر قرار می گیرد. در خط بعدی همانطور که می بینید a و  b را با هم جمع کرده ایم و جواب آن را درون c ریخته ایم ، پس می توانیم از عمگرهای ریاضی برای متغییر های عددی استفاده کنیم. اما MessageBox ، در واقع نوعی فرم است که کارش نمایش پیغام است. برای نمایش آن از متد Show استفاده می کنیم(در جلسات بعدی بیشتر با MessageBox کار می کنیم) و اما ()c.ToString چیست؟ برای نمایش هر نوع داده ای اول باید آن را به نوع رشته ای تبدیل کنیم و خوشبختانه هر نوع داده  ای را می شود به نوع رشته ای تبدیل کرد فقط کافی است بعد از اسم متغییر (.) را بزنید و متد ()ToString را انتخاب کنید.
فکر می کنم برای این جلسه کافی باشد . امیدوارم که خسته نشده باشید . پیشنهاد می کنم اون دسته از دوستانی که تازه کار هستند حتما تمام کد ها را خودشون بزنند تا بهتر متوجه بشوند . اما برای تمرین بیشتر می توانید گشت و گذاری در رخداد های مختلف کنترل ها داشته باشید و ببینید هر کدوم چه زمانی رخ می دهند.


 

مصطفی مدرک کارشناسی نرم افزار دارد و از برنامه نویسان شرکت آرتیمان استودیو است. از سال 86 برنامه نویسی با زبان سی شارپ را آغاز کرده و در حوزه توسعه وب با تکنولوژی دات نت بسیار مسلط است. وی هم اکنون در حال توسعه اپلیکیشن های موبایل از طریق پلتفرم زامارین است.

نظرات و سوالات کاربران

ارسال پاسخ شقایق
شقایق
یکشنبه ۰۷ آذر ۱۳۹۵ ۱۷:۱۹
سلام
لطفا این توضیحاتتون تداوم داشته باشه
من سال سوم کامپیوترم
با سی شارپ کاملا آشنام
در مسابقه ساخت بازی های رایانه ای با سی شارپ شرکت کردم،الانم دنبال آموزش های بیشتر و ایده های خاصم...
مرسی که به فکر پیشرفت کشورین و وقتتون رو صرف آموزش میکنید.
ارسال پاسخ بابک
بابک
جمعه ۱۶ مهر ۱۳۹۵ ۱۱:۵۷
سلام بسیار مفید بود .لطفا آموزش بازی سازی با سی شارپ را در سایت قرار دهید.