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

امین شهرابی فراهانی امین شهرابی فراهانی امین شهرابی فراهانی · 1401/12/13 20:35 · خواندن 7 دقیقه

در ادامه مقاله قبلی ، در این قسمت باهم یک بازی مار ساده را خواهیم ساخت.

این بازی دارای قابلیت های زیر است :

  • تغییر جهت مار
  • خوردن سیب ها
  • اضافه شدن سیب به مار
  • انیمیشن چرخش مار به چپ و راست و بالا و پایین

برای راحتی کار و یادگیری افراد تازه کار ، در این مقاله از لیست ها ، موقعیت های رندوم و …. استفاده نمیشود و دو سیب بیشتر برای خوردن نداریم .

شروع کار و طراحی رابط کاربری :

برای شروع شئ های زیر را برای بازی به داخل صفحه بیندازید :

  • یک باتن برای مار – میتوانید backcolor آن را برابر سبز قرار دهید برای زیبایی.

حتما برای اجرای صحیح بازی در پنل تنظیمات دنبال location بگردید و مختصات باتن را بخش پذیر بر 50 قرار دهید . دقت کنید که سایز مار هم باید بخش پذیر بر 50 هم باشد .

  • دو باتن سیب ، مثل توضیحات بالا به لوکیشن و سایز دقت کنید و رنگ را میتوانید قرمز کنید.
  • چهار باتن کنترل جهت ، در هرمکان با هررنگی که علاقه دارید قرار دهید .
  • یک تایمر هم اضافه کنید

مراحل ساخت بازی :

  1. تعریف جهت ها
  2. حرکت در جهت انتخاب شده در زمان تایمر
  3. برخورد با سیب
  4. اضافه شدن سیب به مار
  5. حرکت سیب با مار
  6. انیمیشن چرخیدن سیب با مار (آموزشی ویدیویی در دوره)

حرکت مار :

برای شروع ، یک متغیر به نام 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";

}
}
}