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

صفر تا صد ساخت بازی با سی شارپ 9#
در جلسه قبلی حرکت موشک ها را برنامه نویسی کردید و همچنین متوجه شدید که برای ساخت دشمنان از ماتریس دوبعدی استفاده می کنیم. نحوه ساخت ماتریس های دوبعدی را یاد گرفتید و یک ماتریس دوبعدی ساختید. در این جلسه ساخت دشمنان را تکمیل می کنید و برنامه حرکت آنها را می نویسید.
دارالترجمه رسمی
دارالترجمه رسمی پارسیس شامل خدمات ترجمه رسمی و تخصصی در بیش از 60 زبان زنده دنیا
افزونه های سئو وردپرس
بهترین افزونه های سئو وردپرس به صورت کاملا فارسی
افزونه فرم ساز آسان
فرم ساز آسان اولین فرم ساز کاملا فارسی وردپرس
خرید ورق گالوانیزه رنگی
خرید انواع ورق گالوانیزه رنگی با بهترین قیمت
کارگاه رویه کوبی در تهران
بهترین کارگاه رویه کوبی و تعمیر مبل راحتی و استیل در تهران با قیمت و کیفیت عالی
خودتان را اینجا معرفی کنید

با عرض پوزش از دوستانی که ورژن قبلی این قسمت را خوانده بودند، باید عرض کنم که به در خواست بعضی از دوستان تغییراتی را در این جلسه اعمال کردیم که باعث ساده تر شدن و کمتر شدن این جلسه می شود اگر شما این جلسه را قبلا مطالعه نموده اید خواهشمندم که دوباره آن را مرور کنید، زیرا مطالب را بازتر کرده ام و کوتاه تر در بعضی از قسمت ها هم تغییراتی اعمال شده است.
در جلسه قبل یک ماتریس از کنترل PictureBox ساختید اما آن را کامل نکردید. برای کامل کردن این قسمت باید برای هر عضو از این آرایه یک کنترلPictureBox  بسازید. اما چگونه به تک تک خانه های یک آرایه دوبعدی سر بزنیم و یک کنترل برای آن بسازیم. اگر بخاطر داشته باشید برای پیمایش یک آرایه یک بعدی از حلقه for استفاده می کردیم. برای پیمایش یک آرایه دوبعدی هم به همین صورت عمل می کنیم. همانطور که در جلسه قبل گفتم، هر سطر از آرایه دوبعدی در واقع یک آرایه یک بعدی است. پس برای پیمایش کل ماتریس کافی است که هر سطر از آرایه را بصورت جداگانه پیمایش کنیم.
 
لطفا یک کنترل label به فرم اضافه کنید و مشخصات آن را بصورت زیر تنظیم کنید:
Font = Tahoma, 12pt
RightToLeft = No
Text = “”
Location = 30,30
 
سپس کد زیر را به قسمت رخداد دکمه شروع بعد از خط تعریف آرایه enemies اضافه کنید و برنامه را اجرا کنید.
for (int i = 0; i < enemiesCol; i++)
{
       for (int j = 0; j < enemiesRow; j++)
       {
            MessageBox.Show(i.ToString() + "," + j.ToString());     
            label1.Text += "enemis[" + i.ToString() + "," + j.ToString() + "]" + "    ";
       }
       label1.Text += "nn";
}
 

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

 
برنامه را اجرا کنید. مشاهده می کنید که در هربار اضافه شدن عبارت enemies[i,j] یک MessageBox نمایش داده می شود که متن درون شماره سطر و ستون را نمایش می دهد. سپس به متن درون label یکی اضافه می شود. هدف از این کار نمایش نحوه حرکت حلقه های تو در تو بود. حتما متوجه شدید که با اتمام رسیدن هر سطر برنامه به سطر بعدی می رود. در سطر اول شمارنده حلقه بیرونی (i) مساوی صفر است و در سطوح بعد افزایش می یابد اما در هر سطر شمارنده حلقه درونی (j) از صفر شروع می شود و در انتها به 3 می رسد. به این ترتیب متوجه چگونگی پیمایش سطر به  سطر ماتریس دشمنان شدید.
 
 

ساخت ماتریس دشمنان

امیدوارم که این بخش از توضیحات شما را توجیح کرده باشد. پیش از ادامه کار باید label1 را از روی فرم پاک کنید و کدهای مربوط به آن را از درون حلقه ها پاک کنید. حالا باید کدهای مربوط به ساخت عناصر آرایه را درون حلقه ها بنویسید. کد قسمت حلقه ها را بصورت زیر تغییر دهید.
*نکته : حتما هر بخش از آموزش را بصورت مرحله به مرحله انجام دهید، زیرا از این قسمت به بعد مراحل خیلی پیچیده می شوند و اگر بخواهید آنها را بصورت یکجا انجام دهید مطمعنا به مشکل خواهید خورد. در ضمن این شیوه به شما کمک می کند تا درک بهتری از موضوع داشته باشید.
 
for (int i = 0; i < enemiesCol; i++)
{
      for (int j = 0; j < enemiesRow; j++)
      {
            enemies[i, j] = new PictureBox();
            enemies[i, j].Size = 
                 new Size(sizeOfEnemies, sizeOfEnemies);                    
      }
​}
 

توضیح :

خط اول درون حلقه، به هر از اعضا ماتریکس دشمنان یک PictureBox  می سازد و درون آن خانه قرار می دهد. حالا که هر عضو از این ماتریکس یک PictureBox است، پس ما می توانیم مثل یک PictureBox با هر کدام از آنها بر خورد کنیم. همانطور که می دانید هر کنترل ویژگی های دارد یکی از این ویژگی ها عرض و ارتفاع کنترل است که اگر به این ویژگی اندازه ای ندهید کنترل شما به اندازه ای که شما می خواهید نمایش داده نخواهد شد، در خط دوم ما سایز هر یک از این اعضا را مشخص کردیم. حالا برنامه را اجرا کنید. خواهید دید که ماتریکس نمایش داده نمی شود، دلیل این است که این اعضا به مجموعه کنترل های  ptb_backGround اضافه نکرده اید. برای رفع این اشکال باید کد زیر را بعد از خط آخر حلقه درونی که شمارنده آن j است اضافه کنید.
ptb_backGround.Controls.Add(enemies[i, j]);
برنامه را مجدد اجرا کنید. خواهید دید که فقط یکی از اعضا این ماتریس به شما نمایش داده می شود. چرا این اتفاق می افتد؟ چون شما ویژگی موقعیت اعضا ماتریس دشمنان را مقدار دهی نکردید که این باعث می شود تا آنها در موقعیت 0,0 صفحه نمایش روی هم قرار گیرند. اما ما که نمی توانیم به تک تک آنها بصورت دستی موقعیت دهیم زیرا این کار بسیار زمان بر است در ضمن قرار است که بازیکن تعداد دشمنان را تعریف کند و ما نمی دانیم که چه تعداد دشمن تعریف می کند در نتیجه نمی توانیم بصورت تک تک به آنها موقعیت دهیم. بهترین کار استفاده از یک فرمول ساده است. به تصویر زیر نگاه کنید:
 
 
در این تصویر سعی کردم تا با نوارهای رنگی فاصله هر یک از دشمنان را نسبت به سمت چپ تصویر نمایش دهم البته فاصله هر خانه نسبت به بالا هم به همین شکل است. این روند تا انتها ادامه دارد.اما اگر قرار باشد به همین روش این کار را انجام دهیم در اصل هیچ فرمولی به کار نبردیم وهمان راهکار تک تک موقعیت دادن را به کار بردیم. اما ما تعداد سطرها و تعداد ستون ها را می دانیم و همچنین عرض هر یک از اعضا و فاصله بین آنها را نیز داریم و نیز با چون با حلقه ها به آنها دسترسی داریم می توانیم از فرمول زیر استفاده کنیم:
 [i,j]  موقعیت عنصر= ( i * (عرض عنصر + فاصله افقی بین عناصر)) , ( j * (ارتفاع عنصر + فاصله عمودی بین عناصر))
 
یا به زبان برنامه نویسی:
 
int x = i * (sizeOfEnemies + horizontalSpace);
int y = j * (sizeOfEnemies + verticalSpace);
enemies[i, j].Location = new Point(x,y); 
                                 
*نکته : دومتغییر x و y را صرفا جهت خواناتر شدن کد استفاده کردیم اگر می خواهید از حجم کد کاسته شود، می توانید این دو متغییر را حذف کنید و عبارات روبروی آنها را در خط بعدی به جای این دو متغییر قرار دهید.
 
کدهای بالا را به درون حلقه درونی یعنی همان حلقه ای که شمارنده j را دارد اضافه کنید و برنامه را اجرا کنید. مشاهده خواهید کرد که مشکل حل شده است.
 

توضیح:

فرض کنید اولین دور اجرای حلقه ها است، در این زمان شمارنده i = 0 است و شمارنده j هم از صفر شروع می شود و به 3 می رسد و نیز فرض می کنیم که از قبل می دانیم که اندازه طول و عرض هر خانه از ماتریس  را 30 در نظر گرفتیم و فاصله های افقی و عمودی را نیز 10 در نظر گرفتیم، حالا فاصله هر خانه سطر اول به شکل زیر تنظیم می شود.
 
enemies[0,0].Location = new Point( 0 * (30 + 10) , 0 * (30 + 10));
//enemies[0,0].Location = (0,0);
 
enemies[0,1].Location = new Point( 0 * (30 + 10) , 1 * (30 + 10));
//enemies[0,0].Location = (0,40);
 
enemies[0,2].Location = new Point( 0 * (30 + 10) , 2 * (30 + 10));
//enemies[0,0].Location = (0,80);
 
enemies[0,3].Location = new Point( 0 * (30 + 10) , 3 * (30 + 10));
//enemies[0,3].Location = (0,120);
 
این کار تا پایان حلقه بیرونی یعنی رسیدن i به 3 ادامه پیدا می کند و باعث می شود نحوه قرار گرفتن دشمنان شما مانند تصویر زیر شود :
 
 
خب امیدوار هستم که این قسمت کامل و واضح بوده باشد.
 

قسمت حرکت دشمنان

برای حرکت دادن به دشمنان یک الگوریتم کلی وجود دارد که قبلا در قسمت حرکت کردن موشک ها با این الگوریتم آشنا شده اید. مانند قسمت حرکت کردن موشک ها در قسمت حرکت کردن دشمنان نیز ما از کنترل timer استفاده می کنیم و درهر چند میلی ثانیه که تایمر یک Tik می خورد به اندازه چند پیکسل دشمنان را حرکت می دهیم، همانطور که قبلا هم گفتم چون سرعت این اتفاقات بسیار زیاد است و در کسری از ثانیه انجام  می شود به کاربر این حس را القا می کند که آنها بصورت یکسره در حال حرکت هستند.
چون در قسمت حرکت موشک ها یک کنترل Timer به نام tmr_main اضافه کردیم از همان timer برای حرکت دشمنان هم استفاده می کنیم. پس لطفا به رخداد Tik کنترل tmr_main بروید.
 
*نکته : اگر پیش از ویرایش جلسه نهم، جلسه هشتم ر مطالعه کرده بودید لطفا در قسمت foreach متغییر x را به element تغییر نام دهید. برای ساده تر شدن به تصویر زیر دقت کنید.

 

 

 
 
اگربه خاطر داشته باشید موشک ها را از نوعButton  تعریف کردیم و دشمنان را از کنترل PictureBox سفینه بازی نیز از نوع کنترل PictureBox انتخاب کردیم. حالا برای حرکت دشمنان باید تشخیص دهیم که آیا متغییر element یک PictureBox است یا خیر؟ در ضمن چون سفینه نیز یک PictureBox است، باید چک کنیم که سفینه در صفحه با دشمنان حرکت نکند.
 
برای شروع بصورت مرحله به مرحله پیش می رویم در مرحله اول فقط تشخیص می دهیم که آیا element یک PictureBox است یا خیر؟ به همین منظور کد زیر را به قسمت foreach بعد از if وارد کنید. به تصویر زیر دقت کنید محل قرار دادن این کد را برای شما مشخص کرده ام.

 

 

else if (element is PictureBox)
{
        element.BackColor = Color.Green;
}

در قسمت شرط کد فوق چک می شود اگر element از نوع PictureBox باشد وارد eles if می شود و ویژگی رنگ پس زمینه آن را به رنگ سبز قرار می دهد.

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


همانطور که مشاهده می نمایید چون سفینه هم یک PictureBox است رنگ پس زمینه آن هم سبز شده است. اما این یک اشتباه است برای جلوگیری از این اتفاق باید از طریق ویژگی Name کنترل ها چک کنیم اگر این ویژگی مساوی ptb_spaceShip بود دستورات درون else if برای آن اجرا نشوند. کد شرط درون else if را بصورت زیر تغییر دهید.

else if (element is PictureBox && element.Name != "ptb_spaceShip")

قبلا در جلسات اول با عملگرهای &&  و != آشنا شده اید. عمگر && در شرط ها زمانی استفاده می شود که بخواهیم دو شرط را همزمان چک کنیم و عملگر != برای چک کردن مختلف بودن دو طرف آن استفاده می شود یعنی اگر دوطرف آن با هم متفاوت باشند جواب درست را برمی گرداند. در اینجا چون ویژگی Name سفینه مقدار ptb_spaceShip  را دارد و مساوی با سمت چپ این عملگر است زمانی که foreach به کنترل سفینه برسد جواب این شرط غلط می شود و وارد eles if نمی شود در نتیجه پس زمینه سفینه تغییر نمی کند.
مجددا برنامه را اجرا کنید مشاهده خواهید کرد که رنگ پس زمینه سفینه تغییر نخواهد کرد، درست همانطور که در تصویر زیر نمایش داده شده است.

 
اما هدف این نیست که پس زمینه دشمنان را تغییر دهیم بلکه هدف ما حرکت دادن آنها است، پس باید قسمت تغییر رنگ پس زمینه را از درون eles if پاک کنیم.

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

اولین چیزی که لازم است به برنامه اضافه کنیم. متغییر سراسری speed است، از این متغییر برای مدیریت سرعت حرکت  دشمنان استفاده می کنیم پس لطفا این متغییر را در محل تعریف متغییرهای سراسری تعریف کنید.

int speed = 0;

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

int slider = 0;

سومین چیزی که لازم داریم متغییر isItEndOfPage است، این متغییر از نوع bool است زمانی که متغییر slider به انتها برسد این متغییر تغییر وضعیت می دهد و باعث می شود که دشمنان به سمت مخالف حرکت می کنند. لطفا این متغییر را نیز در بخش متغییرهای سراسری تعریف کنید.

isItEndOfPage = true;




در تصویر اولی مشاهده می کنید که دشمنان پس از رسیدن به سمت راست پنل از صفحه خارج می شوند و بازی خراب می شود. اما در تصویر دوم پس از رسیدن به انتها به کناره برخورد می کند و بر می گردد. ما باید حالت دوم را برنامه نویسی کنیم. این کار کمی پیچیدگی دارد لطفا مراحل این بخش را هم زمان با خواندن هر بخش انجام دهید تا بهتر متوجه هر قسمت بشوید.

برای شروع باید به متغییرهای speed و slider مقدار دهی کنید، برای اینکار به قسمت رخداد دکه شروع بروید و به متغییر speed هر مقداری که دوست دارید بدهید، ما به آن مقدار 5 را دادیم اما هر چه این مقدار بیشتر باشد سرعت حرکت دشمنان بیشتر می شود و سپس طبق تصویر بعد از if متغییر  slider را مساوی totalSize  قرار دهید. در تصویر زیر محل مقدار دهی این دو متغییر را مشخص کردیم.

 


 
 
حالا که متغییر slider را مقدار دهی کردیم وقت آن رسیده تا کمی در مورد آن صحبت کنیم. این متغییر یک شمارنده است که با استفاده از آن تشخیص می دهیم که آیا به پایان صفحه رسیده ایم یا خیر؟ اما چگونه این کار را انجام  می دهیم، در ابتدا این متغییر را مساوی با totalSize یعنی آخرین نقطه ماتریس دشمنان قرار دادیم و بعد از آن با هر بار اجرا رخداد Tik این متغییر به اندازه speedتا اضافه و یا کم می شود در اصل می شود گفت که این متغییر یکی از خانه های ماتریس است که از بین نمی رود. در ادامه خواهید دید که چگونه این متغییر را کم یا زیاد می کنیم.
خب با بخش ساده کار شروع می کنیم، پس لطف کنید و خط زیر را به قسمت foreach درون else if اضافه کنید.

element.Location = new Point(element.Location.X + speed, element.Location.Y);

برنامه را اجرا کنید مشاهده می کنید که دشمنان به سمت راست صفحه حرکت می کنند و از تصویر خارج می شوند. در این خط کد در هر Tik به اندازه speedتا اضافه می شود. حتما متوجه شدید که این کد ناقص است ما باید کاری کنیم که با رسیدن به انتهای صفحه به ماتریس مجددا برگردد. پس کد را بصورت زیر تغییر دهید.

if (slider <= spc_main.Panel2.Size.Width)
                   
    element.Location = new Point(element.Location.X + speed, element.Location.Y);
                    
else
    element.Location = new Point(element.Location.X - speed, element.Location.Y);

سپس بعد از حلقه foreach متغییر slider را به اندازه speedتا اضافه کنید. در تصویر زیر بخوبی مشخص است که کجا باید این متغییر را افزایش دهید.

برنا مه را اجرا کنید مشاهده می کنید که ماتریس پس از برخورد به سمت راست صفحه بر می گردد و به سمت چپ حرکت می کند و سپس از سمت چپ خارج می شود. مشخص است که هدف ما این هم نبود یعنی باید بعد از رسیدن به سمت چپ برگردد به سمت راست حرکت کند و این روند تا پایان بازی ادامه داشته باشد. به این منظور از باید از یک متغییر کمکی استفاده کنیم، که قبلا آن را به نام isItEndOfPage ساختیم.
برای استفاده از این متغییر باید یک سیستم بسازیم به این صورت که تا زمانی که slider کوچکتر از عرض صفحه است متغییر isItEndOfPage مساوی true است و زمانی که از آن بزرگتر از عرض صفحه شد متغییر isItEndOfPage  مساوی false  می شود. کد درون foreach را بصورت زیر تغییر دهید.  تا برای شما توضیح دهم که چه اتفاقی رخ می دهد.

if (isItEndOfPage == true)
            element.Location = new Point(element.Location.X + speed, element.Location.Y);
 
else if (isItEndOfPage == false)
            element.Location = new Point(element.Location.X - speed, element.Location.Y);

 قسمت بعد از حلقه foreach را بصورت زیر تغییر دهید:

if (slider >= spc_main.Panel2.Size.Width)
        isItEndOfPage = false;
 
else if (slider < totalSize)
        isItEndOfPage = true;
           
if(isItEndOfPage == true)
        slider += speed;
 
else if (isItEndOfPage == false)
        slider -= speed;

در پایان کد شما باید بصورت زیر در آمده باشد.

دوستان در قسمت else if با استفاده از متغییر isItEndOfPage چک می کنیم که آیا به پایان سمت چپ یا راست رسیده ایم یا خیر اما این متغییر که به خودی خود تغییر نمی کند و ما باید آن را کنترل کنیم و تغییر دهیم. از این رو در کدهای بعد از حلقه این متغییر را با توجه به slider تغییر می دهیم. در شرط اول چک می شود اگر slider بزرگتر یا مساوی عرض صفحه شده بود آن را به false تغییر می دهیم و اما در شرط else if چک می کنیم که آیا slider کوچکتر از totalSize شده است یا خیر؟ چرا totalSize؟ خب چون ما در ابتدا slider را از totalSize شروع کردیم و در برگشت هم باید به totalSize برسیم. اما بعد از این باید slider را کم یا زیاد کنیم. با استفاده از همان isItEndOfPage چک می کنیم که آیا به انتها رسیده ایم یا خیر اگر به انتهای سمت راست نرسیده باشیم باید slider را اضافه کنیم و اگر رسیده باشیم باید slider را کم کنیم.


 

حالا برنامه را اجرا کنید می بینید که به خوبی عمل می کند. برای این جلسه کافی است. سورس کد برنامه را می توانید از اینجا دانلود کنید.

 

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

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

ارسال پاسخ Sheyda
Sheyda
سه شنبه ۰۶ دی ۱۴۰۱ ۱۷:۵۰
سلام من میخوام یه برد همینجوری بسازم بدون این که حرکت کنه خونه ها باید با لیبل باشه یه ارایه از نوع int تعریف کردم و ماتریس هم تعریف کردم تو forدوم نوشتم play[i, j] = new Label(); h ازم خطا میگیره که نمیشه لیبل رو به نوع int تبذیل کرد میشه کمکم کنید خیلی عجله ایه
ارسال پاسخ amir
amir
چهارشنبه ۲۴ شهریور ۱۳۹۵ ۱۰:۵۱
با سلام.
من وقتی در برنامه قطعه کد
enemies[i, j] = new PictureBox();
در حلقه for وارد می کنم برنامه اجرا می شود ولی پس از زدن دکمه شروع برنامه متوقف شده و سپس به قطعه کد بالا گیر می دهد
لطفا راهنمایی کنید.
ارسال پاسخ marasiali
marasiali
یکشنبه ۱۹ مهر ۱۳۹۴ ۲۱:۴۹

خبری از آموزش بعدی نیست چرا؟اتفاقی افتاده؟؟

ارسال پاسخ marasiali
marasiali
جمعه ۰۳ مهر ۱۳۹۴ ۱۴:۱۱
در پاسخ به دیدگاه مصطفی درخشان ارسال شده در جمعه ۰۳ مهر ۱۳۹۴ ۰۱:۱۶

دوست عزیز تغییرات اعمال شد امیدوارم که راضی کننده باشد

فوق العاده بود واقعا ممنون از این همه اهمیت دادن به خواننده مطلب

فقط یه اشکال تایپی کوچیک داره که تو عکس زدین:
EndOfPage=totalsize
در حالیکه متغیر عوض شده و باید میزدین:
slider=totalsize

شرمنده اینقدر گیر میدم :)

ارسال پاسخ مصطفی درخشان
مصطفی درخشان
جمعه ۰۳ مهر ۱۳۹۴ ۰۱:۱۶
در پاسخ به دیدگاه marasiali ارسال شده در پنج شنبه ۰۲ مهر ۱۳۹۴ ۱۸:۰۶

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

دوست عزیز تغییرات اعمال شد امیدوارم که راضی کننده باشد

ارسال پاسخ marasiali
marasiali
پنج شنبه ۰۲ مهر ۱۳۹۴ ۱۸:۰۶
در پاسخ به دیدگاه مصطفی درخشان ارسال شده در پنج شنبه ۰۲ مهر ۱۳۹۴ ۱۳:۴۱

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

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

ارسال پاسخ مصطفی درخشان
مصطفی درخشان
پنج شنبه ۰۲ مهر ۱۳۹۴ ۱۳:۴۱
در پاسخ به دیدگاه marasiali ارسال شده در پنج شنبه ۰۲ مهر ۱۳۹۴ ۱۱:۱۳

ممنون از پاسخ سریعتون
فقط خواهشا علاوه بر درست کردن این موارد تو آموزش های بعدی این آموزش ها رو هم که تا حالادنوشتین جاهایی که نیاز به اصلاح داره اصلاح کنید.درضمم علاوه براون مواردی که مطرح کردم یه اشکال هم تو این آموزش دیدم.اونجایی که شما برای نشون دادن موقعیت دشمنا موقعیت ماتریسی رو تو کد نشون میدادین و موقعیت به دست آمده رو مشخص کردید تو ماتریس [0,1] نتیجه رو موقعیت 80،80 مشخص کردین که واضحه اشتباهه.
خواهشا لااقل بخش برخورد موشک و دشمن رو اصلاح کنید.مثلا کلمه "نقطه برخورد" تو آموزش به نظرم مبهمه چون هنوز که برخورد صورت نگرفته و نقطه برخورد متعلق به هردو شیئه و نمیفهمم نقطه برخورد اصلا چیه تو کد که باید از چیزدیگه ای کمترباشه.
کلا به نظرم یه قسمت فقط تو آموزش اگه مبهم باشه حتی اگه ادامه اش خوب باشه دیگه کاربر نمیتونه ادامه بده به یادگرفتن و باید همه قسمت ها بدون ابهام باشه

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

ارسال پاسخ marasiali
marasiali
پنج شنبه ۰۲ مهر ۱۳۹۴ ۱۱:۱۳
در پاسخ به دیدگاه مصطفی درخشان ارسال شده در پنج شنبه ۰۲ مهر ۱۳۹۴ ۰۰:۲۲

خیلی ممنونم از نظرتون. خیلی کار خوب و شایسته ای می کنید که نظراتتون را درمیون می گذارید. حتما از نظراتتون استفاده می کنم. به نظر من انتقاد خوب مثل انتقاد شما به پیشرفت ما کمک می کنه.

ممنون از پاسخ سریعتون
فقط خواهشا علاوه بر درست کردن این موارد تو آموزش های بعدی این آموزش ها رو هم که تا حالادنوشتین جاهایی که نیاز به اصلاح داره اصلاح کنید.درضمم علاوه براون مواردی که مطرح کردم یه اشکال هم تو این آموزش دیدم.اونجایی که شما برای نشون دادن موقعیت دشمنا موقعیت ماتریسی رو تو کد نشون میدادین و موقعیت به دست آمده رو مشخص کردید تو ماتریس [0,1] نتیجه رو موقعیت 80،80 مشخص کردین که واضحه اشتباهه.
خواهشا لااقل بخش برخورد موشک و دشمن رو اصلاح کنید.مثلا کلمه "نقطه برخورد" تو آموزش به نظرم مبهمه چون هنوز که برخورد صورت نگرفته و نقطه برخورد متعلق به هردو شیئه و نمیفهمم نقطه برخورد اصلا چیه تو کد که باید از چیزدیگه ای کمترباشه.
کلا به نظرم یه قسمت فقط تو آموزش اگه مبهم باشه حتی اگه ادامه اش خوب باشه دیگه کاربر نمیتونه ادامه بده به یادگرفتن و باید همه قسمت ها بدون ابهام باشه

ارسال پاسخ مصطفی درخشان
مصطفی درخشان
پنج شنبه ۰۲ مهر ۱۳۹۴ ۰۰:۲۲
در پاسخ به دیدگاه marasiali ارسال شده در چهارشنبه ۰۱ مهر ۱۳۹۴ ۱۹:۰۸

ممنون از آموزشتون ولی بذارید یه انتقادی بکنم
انصافا چند جلسه اول خیلی خوب اومدین جلو ولی الآن داره به نظرم کم کم مبهم میشه توضیحات و به قول معروف فرد عطاش رو به لقاش میبخشه.شما خودتون این جلسه رو یه بار بخونین و از یکی که تو این زمینه خیلی وارد نیست بخواین این آموزشو تمام قسمتاشو بخونه بدون پیش زمینه قبلی(آموزش جدا از این جلسات) واقعا افراد تو این قسمت هنگ میکنن. به نظرم تکنیک خیلی بدیه که میاین سی چهل خط کد مینویسین و به کاربر نشون میدین بعد هرکدوم رو تکه تکه تجزیه میکنین.به نظرم هریک یا دوخطی که نوشتین باید تجزیه بشه مخصوصا وقتی کدطولانی بشه توضیحش هم طولانیه و نیاز به اسکرول داره پس کاربر هرتکه از متنو که میخونه باید بیاد بالا تو کد پیداکنه و درک کنه بعد بیاد دوباره ادامه متنو پیداکنه که وقتی این کار به دفعات تکرار شه فرد به خاطر گم کردن بخش مورد نظر کد و بخش مورد نظر متن حواسش رو این موضوع میره و به خاطر دقت رو گم نکردن دقتش رو محتوا میاد پایین و قاطی میکنه و نمیتونه مطالبو درک کنه.
مورد بعدی اینه که جمله ها فوق العاده طولانین که تاثیر فوق العاده بدی تو یادگیری داره.تو این آموزش هم دستورات شناسایی برخورد موشک و دشمن به نظرم با عرض معذرت افتضاح توضیح داده شده بود و من هیچ چیزی از اون نفهمیدم.
جلسات هم خیلی طولانی داره میشه و به نظرم حتی اگه صدجلسه طول بکشه بهتر از اینه که جلسات اینقدر طولانی بشن.
و آخرین چیزی که من به خاطر میاد اینه که انتخاب متغیر x برای حلقه foreach دربرنامه ای که به دفعات دراون از موقعیت ها و x ها و y ها استفاده شده به نظرم امری کاملا اشتباهه و باعث میشه فرد تو تمیز دادن این دو x به مشکل بخوره مثلا این تیکه رو ببینین
X.location.x
واقعا به نظر شما هرکسی که این کدو نگاه کنه به این فکر نمیکنه که هر دو x یکسانن؟
امیدوارم باعث سوءتفاهم نشه حرفام و بدونین که واقعا واسه این سایت و شما ارزش قائلم و دلم نمیخواد این وقتی که برای تهیه این آموزش میذارین بیهوده و بدون نتیجه دلخواه باشه.
موفق باشید

خیلی ممنونم از نظرتون. خیلی کار خوب و شایسته ای می کنید که نظراتتون را درمیون می گذارید. حتما از نظراتتون استفاده می کنم. به نظر من انتقاد خوب مثل انتقاد شما به پیشرفت ما کمک می کنه.

ارسال پاسخ marasiali
marasiali
چهارشنبه ۰۱ مهر ۱۳۹۴ ۱۹:۰۸

ممنون از آموزشتون ولی بذارید یه انتقادی بکنم
انصافا چند جلسه اول خیلی خوب اومدین جلو ولی الآن داره به نظرم کم کم مبهم میشه توضیحات و به قول معروف فرد عطاش رو به لقاش میبخشه.شما خودتون این جلسه رو یه بار بخونین و از یکی که تو این زمینه خیلی وارد نیست بخواین این آموزشو تمام قسمتاشو بخونه بدون پیش زمینه قبلی(آموزش جدا از این جلسات) واقعا افراد تو این قسمت هنگ میکنن. به نظرم تکنیک خیلی بدیه که میاین سی چهل خط کد مینویسین و به کاربر نشون میدین بعد هرکدوم رو تکه تکه تجزیه میکنین.به نظرم هریک یا دوخطی که نوشتین باید تجزیه بشه مخصوصا وقتی کدطولانی بشه توضیحش هم طولانیه و نیاز به اسکرول داره پس کاربر هرتکه از متنو که میخونه باید بیاد بالا تو کد پیداکنه و درک کنه بعد بیاد دوباره ادامه متنو پیداکنه که وقتی این کار به دفعات تکرار شه فرد به خاطر گم کردن بخش مورد نظر کد و بخش مورد نظر متن حواسش رو این موضوع میره و به خاطر دقت رو گم نکردن دقتش رو محتوا میاد پایین و قاطی میکنه و نمیتونه مطالبو درک کنه.
مورد بعدی اینه که جمله ها فوق العاده طولانین که تاثیر فوق العاده بدی تو یادگیری داره.تو این آموزش هم دستورات شناسایی برخورد موشک و دشمن به نظرم با عرض معذرت افتضاح توضیح داده شده بود و من هیچ چیزی از اون نفهمیدم.
جلسات هم خیلی طولانی داره میشه و به نظرم حتی اگه صدجلسه طول بکشه بهتر از اینه که جلسات اینقدر طولانی بشن.
و آخرین چیزی که من به خاطر میاد اینه که انتخاب متغیر x برای حلقه foreach دربرنامه ای که به دفعات دراون از موقعیت ها و x ها و y ها استفاده شده به نظرم امری کاملا اشتباهه و باعث میشه فرد تو تمیز دادن این دو x به مشکل بخوره مثلا این تیکه رو ببینین
X.location.x
واقعا به نظر شما هرکسی که این کدو نگاه کنه به این فکر نمیکنه که هر دو x یکسانن؟
امیدوارم باعث سوءتفاهم نشه حرفام و بدونین که واقعا واسه این سایت و شما ارزش قائلم و دلم نمیخواد این وقتی که برای تهیه این آموزش میذارین بیهوده و بدون نتیجه دلخواه باشه.
موفق باشید