PDA

View Full Version : آموزش: آموزش نکات مفید ساخت بازی های گوناگون در سی شارپ(مبتدی تا پیشرفته)



complexcoding
جمعه 10 دی 1389, 00:44 صبح
بسم الله ارحمن الرحیم

اللهم صل علی محمد و آل محمد و عجل فرجهم



سلام من تورج هستم علاقه مند به ساخت بازی های زیبا با سی شارپ.چند موضوعی بود که زمان زیادی فکر من رو به خودش مشغول کرده بود و باعث شد من این تاپیک رو بزنم(تمامی این عوامل رو برای کوتاهی سخن ذکر می کنم):

1-همونطور که می دونید ساخت بازی احتیاج به یادگیری کامل زبان مورد نظر که می خوایید باهاش بازی رو بنویسید داره اما افرادی مثل من که بازی ساختن بلد نیستن نمی دونن از کجا باید شروع کنن می رن سراغ چیزهایی که مناسب نیست مثلا برای شروع می رن دنبال بازی های 3 بعدی :متعجب: و از این نوع که واقعا هم نمی شه بهشون کمک کرد و خیلی موارد دیگه...می خواستم چند تا تاپیک برای نمونه معرفی کنم گفتم بر می خوره منصرف شدم.
------------------------------------------------------------------------------------------------------------------------
2-بسیاری از بازی ها نکات ریزی داره و بقیش معمولیه و اون نکات ریز شبیه به بازی و ریاضیه ما نمی خواییم بازی بنویسیم و سورسشو در اختیار دیگران بذاریم ما می خواییم سورس رو آموزش بدیم(نکات مهم و کلیدی)اگر من یه بازی بنویسم همون بازی رو اگر کس دیگه ای بنویسه من از کداش سر در نمی یارم چون اون فرد متغیرها و توابع یا اصلا کدهای به هم ریخته و اضافه کردن شاخ و برگ به کدش باعث می شه آدم سر در گم بشه.
------------------------------------------------------------------------------------------------------------------------
3-بازی های مختلفی در سایت برنامه نویس بصورت تاپیک های نامنظم پخش و این ور اونور هست به نظر من طریقه کار به این صورت باشه بازم نظر دوستان شرطه, بصورت پله پله اول یک بازی معمولی


نکات و ریزه کاری ها
سوالات و مشکلات
نمونه سورس ها


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

complexcoding
جمعه 10 دی 1389, 01:15 صبح
خوب برای شروع اولین پست رو خودم می ذارم:تا حالا این بازی رو انجام دادید که 2 تا عکس شبیه هم باشن با هم حذف می شن(puzzel)؟این بازی رو از ابتدا با یه مثال خیلی ساده شروع می کنم.مثلا 4 تا label داریم رو فرم که 4 تا عدد 1 , 1 و 2 , 2 روی label ها نوشتیم حالا می خواییم وقتی پروژه Run کردیم کاربر اعداد رو نبینه و روی هر 2 تا label که تکسشون شبیه هم بود کلیک کرد بره.اول رنگ نوشته رو به رنگ label در می یاریم تا کاربر تکس رو نبینه بعدش با استفاده از رویدادها کاری می کنیم تا زمانی که کاربر کلیک کرد رنگ تکس سیاه بشه و اعداد مشخص بشن.حالا کد مربوطه:

lbl1_mouse up
if (a == 0)
{
a = 1;
c = lbl1;
lbl1.forecolor=color=black;
return;
}
if ((a == 1) && (!(c == lbl1)))
{
if (lbl1.Text == c.Text)
{
lbl1.Visible = false;
c.Visible = false;
a = 0;
c = null;

}
else
{
a=0;
lbl1.forecolor=color=White;
c=null;
}نکته: a در form_load مساوی صفر قرار گرفته.برای هر چهار label این کار رو انجام می دیم.و c رو در قسمت public تعریف کردیم:

Label c;
اگر نکته ای سوالی کدی دارید مطرح کنید.

complexcoding
جمعه 10 دی 1389, 18:12 عصر
سلام امروز می خوام کدهای قسمت دیگه ای از این بازی رو توضیح بدم این قسمت که از تابع رندوم استفاده می کنه برای تغییر جای label ها ایجاد شده تا کاربر نتونه جای جدید رو تشخیص بده و بازی تکراری نباشه اینم کداش:
برای اعداد تصادفی غیر تکراری محور x و y :

List<int> numbersx = new List<int>();

numbersx.Add(12);
numbersx.Add(86);
numbersx.Add(160);
numbersx.Add(234);
//}

List<int> randomsx = new List<int>();
for (int i = 0; i < 1; i++)
{
try
{
Random randx = new Random();
int randNumx = numbersx[randx.Next(0, numbersx.Count - 1)];
randomsx.Add(randNumx);در آخر این این مقدار در خاصیت location در label مورد نظر قرار می دیم.

complexcoding
جمعه 10 دی 1389, 20:57 عصر
این اولین و تنها بازی بود که من درست کردم.
دوستان حالا می خواییم درباره بازی های زیر کسی آموزشی داره یا راهنمایی دریغ نکنه:
1- Puzzel :این بازی یک عکس رو به هم ریخته می کنه بعدش باید کاربر این عکس رو به صورت کشویی به حالت اول در بیاره که یک خانه از عکس خالی می مونه لطفا طرز ساختن این بازی رو همونطوری که من یاد دادم(نوع یاد دادن) یاد بدید؟
2-بازی دوز
3-بازی MinesWeeper:این بازی در تاپیک های دیگه دیدم ولی هیچکس نخواست آموزش بده فقط سورس گذاشته بود.

complexcoding
شنبه 11 دی 1389, 14:01 عصر
واقعا هیچ یک از دوستان حاضر به کمک نیست ؟؟؟؟:عصبانی::عصبانی::عصبانی: :عصبانی::عصبانی:

hamed_gibago
شنبه 11 دی 1389, 14:14 عصر
سورس جدید بزار با هم شروع می کنیم به آموزش دادن
نظرت چیه؟

L u k e
شنبه 11 دی 1389, 14:51 عصر
فکر نمی کنم ساخت بازی با GDI ویندوز زیاد جالب و جذاب باشه واسه بچه ها ...

ایمان مدائنی
شنبه 11 دی 1389, 14:55 عصر
ساختن بازي با سي شارپ و پخش آن زياد مفيد نيست
البته ممنون از زحمات دوست خوبمون براي آموزش
ولي سي شارپ براي اجرا نياز به دات نت فرمورك داره

complexcoding
شنبه 11 دی 1389, 15:09 عصر
سورس جدید بزار با هم شروع می کنیم به آموزش دادن
نظرت چیه؟

خیلی خوبه موافقم
ابتدا سورس بازیه پازل http://www.jetup.ir/do.php?filename=picture-puzzle.zip
دوستان درست می گن اما کمی که دستمون راه افتاد با XNA می ریم جلو ...فعلا پله پله.
این سورس رو از سایت Codeproject گرفتم که یه نفر از کانادا گذاشته بود.

درباره کدهای این بازی دوستان آموزش بدن:یه جوری که همه متوجه بشن.

complexcoding
یک شنبه 12 دی 1389, 15:44 عصر
باشه دیگه؟ یعنی هیچکس نمی خواد کمک کنه ؟ :متفکر: :اشتباه:

تری دی مکس
جمعه 26 فروردین 1390, 21:14 عصر
با سلام و تشکر از زحمات دوستان:
بازی پازل اونطوری که از اسمش بر میاد زیاد سخت و پیچیده نیست و چیزایی که نیاز داره از قبیل زیرن:
اول از هر چیز آشنایی با کار کردن تایمر در سی شارپ.
ودوم استفاده از چند پنل یا لیبل برای تقسیم بندی شکل مورد نظر.
در ضمن می تونیم برای این کار از همون بازی قبلی استفاده کنیم: به این صورت وقتی که پنل های ما حرکت داده شدن و سر جای خودشون قرار گرفتن پیغام برنده شدن داده بشه. (سر جای خودشون) یعنی ما می تونیم به تعداد پنل هایی که برای عکسمون استفاده کردیم پنل های دیگه ای داشته باشیم که شماره ی هر دو پنل یکی باشه و وقتی موقعیت (location) همه ی پنل ها یکی شد پیغام برنده شدن داده شه.
حالا می مونه حرکت دادن پنل ها یا لیبل ها با استفاده از تایمر.
من سعی میکنم نه تنها کدای مربوط به این بازی بلکه کدای دیگه ای هم که واسه ساخت بازی در سی شارپ لازمه رو بهتون یاد بدم.
البته این اولین باریه که میام اینجا و چندان دستم پر نیست. بار بعدی تمام کدای این بازی رو همراه با عکس بهتون نشون می دم.

aliblue
شنبه 27 فروردین 1390, 10:39 صبح
من تقریباً مبتدی هستم ولی تا حالا چند تا بازی نوشتم و آمادگی خودم رو برای آموزش اعلام می کنم.ولی فعلا سرم شلوغه.سه تا از ساده ترین و اولین بازی هایی که نوشتم در آدرس زیر هستند.پایینی که بازی دوز هست و گرافیک خوبی هم نداره رو 1/5 سال پیش با ++C نوشتم با یه کامپایلر ساده و کم حجم ولی منطقش خوبه.چند تا بازی حرفه ای ترم ساختم که وقت کنم اونا رو هم می ذارم.
http://bluelife.parsiblog.com
کدشم اگه خواستین بگین بذارم.

RIG000
شنبه 27 فروردین 1390, 14:32 عصر
سلام بچه ها . بازی منچ رو کسی میتونه بنویسه؟ یا اینکه رو منچ کار کنید منم ببینم گه چه میکنید.

exlord
شنبه 27 فروردین 1390, 15:09 عصر
برای ساده تر شدن کار مشخصات هر تکه رو توی یه کلاس نگه میدارم ..
internal class PazzelImage
{
/// <summary>
/// Mahale asli in Tekke
/// </summary>
public int MainLocation { get; private set; }
/// <summary>
/// Mahali ke alan in Tekke tu une
/// </summary>
public int CurrentLocation { get; set; }
/// <summary>
/// Akse marbut be in Tekke
/// </summary>
public Image Image { get; set; }

public PazzelImage(int mainLocation, Image img)
{
this.MainLocation = mainLocation;
this.Image = img;
this.CurrentLocation = this.MainLocation;
}

عکس مربوطه رو لود میکنیم ...
private Image _pazzelImage;
public Pazzel()
{
InitializeComponent();
_pazzelImage = Image.FromFile("pazzel.jpg");
}

من از یه عکس 400*400 استفاده کرم و اونو به 16 قسمت 100*100 تقسیم کردم ...
private List<PazzelImage> _imageParts;
private void InitPazzel()
{
int pos = 1;
Size s = new Size(100, 100);//andazeye har block 100*100
for (int y = 0; y < 4; y++)
{
for (int x = 0; x < 4; x++)
{
Point loc = new Point(x * 100, y * 100);
Rectangle rect = new Rectangle(loc, s);
PazzelImage img = new PazzelImage(pos, _pazzelImage.cropImage(rect));
_imageParts.Add(img);
_drawBounds.Add(pos, rect);
pos++;
}
}
_imageParts.RemoveAt(15);
_empty = 16;
Randomize();
}
مستطیل های ساخته شده رو به همراه شماره موقعیتشون ( از 1 تا 16 ) توی یه لیست نگه میدارم ...
private Dictionary<int, Rectangle> _drawBounds;

حالا موقعیت قرار گیری این مستطیل ها رو به صورت رندوم به هم میریزیم ...
private void Randomize()
{
List<int> ints = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
Random rand = new Random();
foreach (var item in _imageParts)
{
int index = rand.Next(0, ints.Count);
item.CurrentLocation = ints[index];
ints.RemoveAt(index);
}
}

توی اونت Paint عکس هارو توی یه پنل Draw میکنیم ...
private void pnlDraw_Paint(object sender, PaintEventArgs e)
{
if (_imageParts != null && _imageParts.Count > 0)
{
foreach (PazzelImage item in _imageParts)
{
e.Graphics.DrawImage(item.Image, _drawBounds[item.CurrentLocation]);
}
}
}

از اینجا به بعد قسمت اصلیش شروع میشه ... با کلیک روی هر کدوم از این تکه ها ...
1 - مختصات محل کلیک
Point mPOs = this.PointToClient(Cursor.Position);
2 - مختصات مستطیل ها رو که توی _drawBounds ذخیره کرده بودیم چک میکنیم ببینیم محل کلیک توی کدوم یک از این مستطیل هاست ...
private KeyValuePair<int, Rectangle> GetClickedRectangle(Point pos)
{
foreach (var item in _drawBounds)
{
if ( (pos.X > item.Value.X && pos.X < item.Value.Right) &&
(pos.Y > item.Value.Y && pos.Y < item.Value.Bottom))
{
return item;
}
}
return new KeyValuePair<int, Rectangle>(16, Rectangle.Empty);
}

3 - با توجه به مستطیل انتخاب شده object عکس اون محل رو پیدا مسکنیم ...
PazzelImage part = _imageParts.First(n => n.CurrentLocation == selectedRectangle.Key);

4 - محل خونه خالی رو توی یه متغیر نگه میداریم ...
private int _empty;
5 - محل مستطیل دریافت شده رو چک میکنیم که خونه خالی نباش ...
if (selectedRectangle.Key != _empty)
6 - اگه محل مستطیل دریافت شده خونه خالی نیست چک میکنیم که در همسایگی خونه خالی هست یا نه ...
private bool IsInContanct(Rectangle rect)
{
Rectangle empty = _drawBounds[_empty];
//az samte balayi ba mahale khali dar tamas ast
if ((rect.Top - 5 < empty.Bottom) && (rect.Bottom > empty.Bottom) && (rect.X == empty.X))
return true;

//az samte payini ba mahale khali dar tamas ast
if ((rect.Bottom + 5 > empty.Top) && (rect.Top < empty.Top) && (rect.X == empty.X))
return true;

//az samte chap ba mahale khali dar tamas ast
if ((rect.Left - 5 < empty.Right) && (rect.Right > empty.Right) && (rect.Y == empty.Y))
return true;

//az samte rast ba mahale khali dar tamas ast
if ((rect.Right + 5 > empty.Left) && (rect.Left < empty.Left) && (rect.Y == empty.Y))
return true;

return false;
}
7 - اگر جواب مثبت بود محل این 2 مستطیل رو عوض میکنیم و پنل رو RePaint ...
if (IsInContanct(selectedRectangle.Value))
{
PazzelImage part = _imageParts.First(n => n.CurrentLocation == selectedRectangle.Key);
int temp = _empty;
_empty = part.CurrentLocation;
part.CurrentLocation = temp;
pnlDraw.Invalidate();
}
8 - و آخر سر چک میکنیم که آیا همه خونه ها سر جای خودشون هستن یا نه ...
private bool IsFinish()
{
foreach (var item in _imageParts)
{
if (item.MainLocation != item.CurrentLocation)
return false;
}
return true;
}

و اینجوریا ....

exlord
شنبه 27 فروردین 1390, 15:14 عصر
سلام بچه ها . بازی منچ رو کسی میتونه بنویسه؟ یا اینکه رو منچ کار کنید منم ببینم گه چه میکنید.
منظورت چهجور منچیه ...آخه منچ که 1 جور نیست ...

RIG000
شنبه 27 فروردین 1390, 15:19 عصر
منچ همون 4 طرف 6 تا مهره هستش اونو میگم . حالا ساده یا پیشرفته هر چه پیشرفته تر بهتر. بعدش یه تاس میندازی بالا 6 تایی هستش

exlord
شنبه 27 فروردین 1390, 15:33 عصر
منچ همون 4 طرف 6 تا مهره هستش اونو میگم . حالا ساده یا پیشرفته هر چه پیشرفته تر بهتر. بعدش یه تاس میندازی بالا 6 تایی هستش
منچ ماله بچه هاس ما دیگه الان world of warcraft و Dragon Age 2 بازی میکنیم .:قهقهه: من خیلی وقته بازی نکردم اصلا یادم نیست ... یه عکس و نحوه بازی رو بگین ببینم چجوریاس ....

RIG000
شنبه 27 فروردین 1390, 19:27 عصر
منچ ماله بچه هاس ما دیگه الان world of warcraft و Dragon Age 2 بازی میکنیم .:قهقهه: من خیلی وقته بازی نکردم اصلا یادم نیست ... یه عکس و نحوه بازی رو بگین ببینم چجوریاس ....
:لبخند::بامزه: یعنی اینو متونی بنویسی .من استیتش اصلا" تا حالا برای نوشتن بازی یه اقدامم نکردم اصلا" نمیدونم چ کنم . اما این بازی رو خیلی دوست دارم:لبخند:
picture
68823