ساخت بازی مار با C# و visual studio


در ادامه مقاله قبلی ، در این قسمت باهم یک بازی مار ساده را خواهیم ساخت.
این بازی دارای قابلیت های زیر است :
- تغییر جهت مار
- خوردن سیب ها
- اضافه شدن سیب به مار
- انیمیشن چرخش مار به چپ و راست و بالا و پایین
برای راحتی کار و یادگیری افراد تازه کار ، در این مقاله از لیست ها ، موقعیت های رندوم و …. استفاده نمیشود و دو سیب بیشتر برای خوردن نداریم .
شروع کار و طراحی رابط کاربری :
برای شروع شئ های زیر را برای بازی به داخل صفحه بیندازید :
- یک باتن برای مار – میتوانید backcolor آن را برابر سبز قرار دهید برای زیبایی.
حتما برای اجرای صحیح بازی در پنل تنظیمات دنبال location بگردید و مختصات باتن را بخش پذیر بر 50 قرار دهید . دقت کنید که سایز مار هم باید بخش پذیر بر 50 هم باشد .
- دو باتن سیب ، مثل توضیحات بالا به لوکیشن و سایز دقت کنید و رنگ را میتوانید قرمز کنید.
- چهار باتن کنترل جهت ، در هرمکان با هررنگی که علاقه دارید قرار دهید .
- یک تایمر هم اضافه کنید
مراحل ساخت بازی :
- تعریف جهت ها
- حرکت در جهت انتخاب شده در زمان تایمر
- برخورد با سیب
- اضافه شدن سیب به مار
- حرکت سیب با مار
- انیمیشن چرخیدن سیب با مار (آموزشی ویدیویی در دوره)
حرکت مار :
برای شروع ، یک متغیر به نام direction تعریف کنید . ( از نوع string )
و حالا برات باتن های کنترل مارتون که در تصویر قهوه ای هستند ، روی هرکدام کلیک کنید و متغیر را برابر جهت right, left, up, down کنید .
مانند :
direction = "left";
direction = "right";
direction = "up";
direction = "down";
حالا روی تایمر خود کلیک کنید و interval را به 400 تغییر دهید .
دوبار روی تایمر کلیک کنید تا کد آن برای شما باز شود.
در این قسمت باید کدی بنویسیم که با توجه به جهت انتخاب شده مار حرکت کند ، برای انکار کد زیر را در بخش تایمر پیست کنید :
if (direction == "down")
{
button1.Location = new Point(button1.Location.X, button1.Location.Y + 50);
}
if (direction == "up")
{
button1.Location = new Point(button1.Location.X, button1.Location.Y - 50);
}
if (direction == "right")
{
button1.Location = new Point(button1.Location.X + 50, button1.Location.Y);
}
if (direction == "left")
{
button1.Location = new Point(button1.Location.X - 50, button1.Location.Y);
}
در این کد ، اول جهت بررسی میشود ،
در صورت راست بودن به مقدار x اضافه میشود و چپ بودن کم میشود . همینطور برای y که بالا و پایین است . (حتما باید به علاوه 50 شوند )
عدم خروج مار از صفحه:
قدم بعدی بررسی درون صفحه بودن مار است که مطمئن شویم مار از بازی خارج نشده و اگر خارج شود پیام باخت نشان داده شود و بازی بسته شود.
برای اینکار در ادامه کد تایمر این خطوط را اضافه کنید.
if (button1.Location.X < 0 || button1.Location.X > 500 || button1.Location.Y < 0 || button1.Location.Y > 500) {
timer1.Stop();
MessageBox.Show("mordi");
Close();
}
در خط اول با شروط or (یا) بررسی میکنیم که از هرسمت خروج پیدا کرده است یا نه که در صورت خروج تایمر متوقف میشود و یک پیام نمایش داده و برنامه بسته میشود.
اگر اندازه صفحه شما متفاوت است باید اعداد 500 را تغییر دهید.
برخورد با سیب اول و حرکت سیب با مار :
قبل از نوشتن کد برخورد سیب ، اول دقت کنید که باید بعد از خط InitializeComponent دو خط اضافه کنید .
timer1.Start();
button3.Visible = false;
باتن 3 یکی از دو سیبی است که من در صفحه گذاشته ام ، اگر برای شما متفاوت است ، یکی از سیب های خودتان را مخفی کنید .
دوباره به تایمر برگردید و کد زیر را برای برخورد سیب ها بنویسید .
قبل از آن یک متغیر به نام run1 تعریف کنید ، (از نوع int) و آن را برابر 0 قرار دهید .
if (button1.Location == button2.Location){
run1 = 1;
button3.Visible = true;
}
متغیر run1 سیب خورده شده را مشخص میکند و سیب خورده شده باید پشت مار حرکت کند پس ما میتوانیم با بررسی این متغیر یکسری شروط را اجرا و سیب را جابجا کنیم .
از انجایی که جهت حرکت مار را داریم میتوانیم با استفاده از مختصات مار مکان سیب را قرار دهیم .
کد زیر را در تایمر وارد کنید :
if (run1 == 1)
{
if (direction == "down")
{
button2.Location = new Point(button1.Location.X, button1.Location.Y - 50);
}
if (direction == "up")
{
button2.Location = new Point(button1.Location.X, button1.Location.Y + 50);
}
if (direction == "right")
{
button2.Location = new Point(button1.Location.X - 50, button1.Location.Y);
}
if (direction == "left")
{
button2.Location = new Point(button1.Location.X + 50, button1.Location.Y);
}
}
میتوانید بازی را اجرا و نتیجه را بررسی کنید .
میبینید که سیب به درستی به دنبال مار حرکت میکند . دقت کنید باید بجای button2 نام سیب خودتون رو قرار دهید و جای button1 نام باتن مار.
یک متغیر دیگر به نام run2 تعریف میکنیم و همه کارها را مثل سیب اول انجام میدهیم .
کد زیر را میتوانید به تایمر اضافه کنید.
if (button1.Location == button3.Location)
{
run2 = 1;
}
if (run2 == 1)
{
if (direction == "down")
{
button3.Location = new Point(button2.Location.X, button2.Location.Y - 50);
}
if (direction == "up")
{
button3.Location = new Point(button2.Location.X, button2.Location.Y + 50);
}
if (direction == "right")
{
button3.Location = new Point(button2.Location.X - 50, button2.Location.Y);
}
if (direction == "left")
{
button3.Location = new Point(button2.Location.X + 50, button2.Location.Y);
}
}
button3 سیب دوم شماست و button2 سیب اول
با همین روش میتوانید تعداد بینهایتی سیب برای خودتان قرار بدید ولی این روش ، اصلا روش مناسبی نیست و اتلاف وقت زیادی دارد ، درون دوره سی شارپ با هم بازی مار را به صورت اصولی برنامه نویسی میکنیم که درحال تکمیل است .
کد نهایی:
کد کل برنامه را مشاهده کنید.
namespace snake
{
public partial class Form1 : Form
{
string direction = "right";
int run1 = 0;
int run2 = 0;
public Form1()
{
InitializeComponent();
timer1.Start();
button3.Visible = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (direction == "down")
{
button1.Location = new Point(button1.Location.X, button1.Location.Y + 50);
}
if (direction == "up")
{
button1.Location = new Point(button1.Location.X, button1.Location.Y - 50);
}
if (direction == "right")
{
button1.Location = new Point(button1.Location.X + 50, button1.Location.Y);
}
if (direction == "left")
{
button1.Location = new Point(button1.Location.X - 50, button1.Location.Y);
}
if (button1.Location.X < 0 || button1.Location.X > 500 || button1.Location.Y < 0 || button1.Location.Y > 500) {
timer1.Stop();
MessageBox.Show("mordi");
Close();
}
if (button1.Location == button2.Location)
{
run1 = 1;
button3.Visible = true;
}
if (run1 == 1)
{
if (direction == "down")
{
button2.Location = new Point(button1.Location.X, button1.Location.Y - 50);
}
if (direction == "up")
{
button2.Location = new Point(button1.Location.X, button1.Location.Y + 50);
}
if (direction == "right")
{
button2.Location = new Point(button1.Location.X - 50, button1.Location.Y);
}
if (direction == "left")
{
button2.Location = new Point(button1.Location.X + 50, button1.Location.Y);
}
}
if (button1.Location == button3.Location)
{
run2 = 1;
}
if (run2 == 1)
{
if (direction == "down")
{
button3.Location = new Point(button2.Location.X, button2.Location.Y - 50);
}
if (direction == "up")
{
button3.Location = new Point(button2.Location.X, button2.Location.Y + 50);
}
if (direction == "right")
{
button3.Location = new Point(button2.Location.X - 50, button2.Location.Y);
}
if (direction == "left")
{
button3.Location = new Point(button2.Location.X + 50, button2.Location.Y);
}
}
}
private void button4_Click(object sender, EventArgs e)
{
direction = "up";
}
private void button5_Click(object sender, EventArgs e)
{
direction = "left";
}
private void button6_Click(object sender, EventArgs e)
{
direction = "right";
}
private void button7_Click(object sender, EventArgs e)
{
direction = "down";
}
}
}