recent
أخبار ساخنة

تعلم البرمجة للمبتدئين | لعبة X-O بلغة سي شارب C#

تعلم البرمجة للمبتدئين

في هذه السلسلة سأطلعك على كيفية برمجة التطبيقات والألعاب البسيطة بلغة c# للمبتدئين مع إمكانية تحميل كود البرنامج. فالبرمجة أصبحت هامة جدا في عصرنا الحالي، وينبغي على الجميع ان يتقن ولو شيء قليل من البرمجة. بغض النظر عن الاختصاص سواء كان برمجة موقع، او برمجة تطبيقات او اي يكن الاختصاص.

تعلم البرمجة للمبتدئين | لعبة X-O بلغة سي شارب C#

اما اذا كنت تريد تعلم البرمجة من الصفر للمبتدئين فهناك الكثير من القنوات على يوتيوب يقومون بتعليم البرمجة بشكل احترافي. نحن هنا سنقوم فقط باستعراض بعض الألعاب البسيطة التي تمكنك من تطبيق ما تتعلمه. وفي هذا المقال سأستعرض لكم و بطريقة سهلة جدا كيفية انشاء لعبة X-O بلغة سي شارب #C للمبتدئين.

ما الذي سوف استفيد منه ان تابعت شروحات هذه السلسلة؟

في هذه السلسلة سنقوم بشرح برمجة تطبيقات سطح المكتب وبرمجة ألعاب بسيطة وسهلة ولا تتطلب ان تكون خبير في مجال البرمجة ويكفي أن تكون قد درست الأساسيات في لغة #C، وهدف هذه السلسلة هو تعلم البرمجة للمبتدئين. وبالتأكيد بعد انتهائك من هذه الشروحات ستكون قد قطعت شوطا كبيرا في تعلمك اساسيات وطريقة ترتيب الكود الصحيحة.

ما الفائدة من تعلم البرمجة؟

فوائد البرمجة كثيرة جدا ومنها أنه لها تأثير إيجابي على معظم المجالات في حياة الناس. وتعلم البرمجة يكسبك ايضا التفكير المنطقي في حل المشاكل في حياتنا الطبيعية

في إحدى محاضرات «تيدكس»، قال كريستين جينكو، إنّه على كل شخص كما ينصح جينكو، هو أن تصبح مبرمجًا، فهناك مئات الآلاف من المبرمجين حول العالم. يُوضح جينكو أن الهدف هو الاستفادة من البرمجة في ابتكار حلول تُسهل عليك أعمالك الحالية، إذ يعتقد أن البرمجة في السنوات القادمة ستكون بمثابة اللغة الأم حول العالم.

ما هي أهم لغات البرمجة المطلوبة في العالم؟ لغة C

  • لغة ++C
  • فيجوال بيسك visual basic
  • لغة بايثون python
  • لغة java
  • لغة PHP
  • لغة #C
  • ماتلاب MATLAB
  • سويفت SWİFT

طريقة انشاء لعبة X-O بلغة سي شارب #C

  • ننشئ Form من اجل القائمة الرئيسية.
  • ننشئ Form من اجل طور لعبة شخص ضد حاسوب.
  • ننشئ Form من اجل طور لعبة شخص ضد شخص.


داخل كود الـ Load نكتب الاكواد التالية:

  • من أجل الانتقال لفورم لعبة شخص ضد الحاسوب.

 private void _1player_button_Click(object senderEventArgs e)
        {
            Thread thread = new Thread(open_1player_Form);//انشاء فورم اخرى
            thread.SetApartmentState(ApartmentState.STA);//اعطاء خواص الفورم الاساسية

            thread.Start();//اظهار الفورم الخاصة باللعب ضد الحاسوب
            this.Close();//اغلاق الفورم الحالية
        }
        private void open_1player_Form()
        {
            Application.Run(new _1_Player());
        }

  • من أجل الانتقال لفورم لعبة شخص ضد شخص.


private void _2players_utton_Click(object sender, EventArgs e) private void _2players_utton_Click(object senderEventArgs e)
        {
            Thread thread = new Thread(open_2player_Form);//انشاء فورم اخرى
            thread.SetApartmentState(ApartmentState.STA);//اعطاء خواص الفورم الاساسية

            thread.Start();//بدء   *مؤقت* جديد
            this.Close();//اغلاق الفورم الحالية
        }
        private void open_2player_Form()
        {
            Application.Run(new _2_Players());//اظهار الفورم الخاصة باللعب ضد الحاسوب
        }

  • من أجل الخروج من اللعبة .


 private void exit_button_Click(object senderEventArgs e)
        {
            Close();//اغلاق الفورم الحالية
        }

داخل صفحة ال 1player نكتب الاكواد التالية:

  • نقوم بتعريف المتغيرات التالية والتي تخزن فيها ما إذا كانت الأزرار خالية أم لا، ولتخزين نقاط اللاعب والحاسوب.


public _1_Player()
        {
            InitializeComponent();
        }

        private void _1_Player_Load_1(object senderEventArgs e)
        {
            ButtonChangeColor(Color.Black);
        }


        bool[] buttonEmpty = new bool[10];

        int playerScor = 0;
        int cpuScor = 0;

  • ننشئ الدالة التالية ()ButtonsOpen والتي ستمكننا من الوصول للازرار.


 private void ButtunsOpen()
        {//سماح الوصول للازرار
            for (int i = 0i < buttonEmpty.Count(); i++)
                buttonEmpty[i] = true;
            continue_button.Enabled = true;
            nextLetter_label.Text = "X";
            nextLetter_label.ForeColor = Color.Green;
        }

  • ننشئ الدالة التالية () ButtonsClose والتي ستمكننا من أقفال الازرار.

 private void ButtonsClose()
        {//عدم السماح بالوصول للازرار
            for (int i = 0i < buttonEmpty.Count(); i++)
                buttonEmpty[i] = false;

            continue_button.Enabled = true;
        }

  • ننشئ الدالة التالية ()ButtonChangeColor من اجل تغير لون الازرار عند اقفالها او فتحها.


private void ButtonChangeColor(Color newColor)
        {//تغيير لون الازرار
            btn1.BackColor = newColor;
            btn2.BackColor = newColor;
            btn3.BackColor = newColor;
            btn4.BackColor = newColor;
            btn5.BackColor = newColor;
            btn6.BackColor = newColor;
            btn7.BackColor = newColor;
            btn8.BackColor = newColor;
            btn9.BackColor = newColor;
        }

  • ننشئ الدالة التالية ()ButtonsClear لكي نتمكن من تنظيف الأزرار عند بداية لعبة جديدة.


 private void ButtonsClear()
        {//تنظيف الازرار
            btn1.Text = "";
            btn2.Text = "";
            btn3.Text = "";
            btn4.Text = "";
            btn5.Text = "";
            btn6.Text = "";
            btn7.Text = "";
            btn8.Text = "";
            btn9.Text = "";
        }

  • ننشئ الدالة التالية ()ScoorClear لكي نتمكن من إرجاع عدد النقاط إلى 0.


private void ScoorClear()
        {//تنظيف العداد
            playerScor_label.Text = "0";
            cpuScor_label.Text = "0";

            playerScor = cpuScor = 0;
        }

  • ننشئ الدالة التالية ()X_O_Write من أجل تحديد ما الذي سنطبعه، إن كان حرف ال X او حرف O.


private void X_O_Write(Button newButton)
        {
            X_Write(newButton);//x كتابة حرف
            WinnerControl("X");//عمل كنترول اذا كان هناك فاىز

            if (buttonEmpty[1] == false && buttonEmpty[2] == false && buttonEmpty[3] == false &&
                buttonEmpty[4] == false && buttonEmpty[5] == false && buttonEmpty[6] == false &&
                buttonEmpty[7] == false && buttonEmpty[8] == false && buttonEmpty[9] == false)
                return;

            O_Write();//o كتابة حرف 
            WinnerControl("O");//عمل كنترول اذا كان هناك فاىز
        }

  • ننشئ الدالة التالية ()X_Write من أجل طباعة حرف X، وتغير لون الزر وما إلى ذلك.


private void X_Write(Button button)
        {//طباعة حرف  x
            button.Text = "X";
            button.ForeColor = Color.Green;
            button.BackColor = Color.Gray;

            nextLetter_label.Text = "O";
            nextLetter_label.ForeColor = Color.Red;
        }

  • ننشئ الدالة التالية ()O_Write من أجل طباعة حرف O، بالطبع سنبحث عن الازرار الفارغة ونختار احدها عشوائيا من اجل ان نطبع به (سيكون هذا دور لعب الحاسوب)، بالاضافة إلى تغير لون الزر وما إلى ذلك.


private void O_Write()
        {//o طباعة حرف
            Button newButton = new Button();
            Random random = new Random();
            int randomButton = random.Next(110);
            while (true)
            {
                if (buttonEmpty[randomButton] == false)
                    randomButton = random.Next(110);
                else
                    break;
            }
            if (randomButton == 1)
                newButton = btn1;
            else if (randomButton == 2)
                newButton = btn2;
            else if (randomButton == 3)
                newButton = btn3;
            else if (randomButton == 4)
                newButton = btn4;
            else if (randomButton == 5)
                newButton = btn5;
            else if (randomButton == 6)
                newButton = btn6;
            else if (randomButton == 7)
                newButton = btn7;
            else if (randomButton == 8)
                newButton = btn8;
            else if (randomButton == 9)
                newButton = btn9;
            newButton.Text = "O";
            newButton.ForeColor = Color.Red;
            newButton.BackColor = Color.Gray;

            nextLetter_label.Text = "X";
            nextLetter_label.ForeColor = Color.Green;

            buttonEmpty[randomButton] = false;
        }

  • ننشئ الدالة التالية ()WinnerControl من أجل اختبار ما إذا كان أحد الطرفين قد حقق أحد شروط الفوز في اللعبة.


private void WinnerControl(string letter)
        {//اختبار ما اذا كان هناك فاىز
            if (btn1.Text == letter && btn2.Text == letter && btn3.Text == letter)
                ThereİsA_Winner(btn1btn2btn3letter);
            else if (btn4.Text == letter && btn5.Text == letter && btn6.Text == letter)
                ThereİsA_Winner(btn4btn5btn6letter);
            else if (btn7.Text == letter && btn8.Text == letter && btn9.Text == letter)
                ThereİsA_Winner(btn7btn8btn9letter);
            else if (btn1.Text == letter && btn4.Text == letter && btn7.Text == letter)
                ThereİsA_Winner(btn1btn4btn7letter);
            else if (btn2.Text == letter && btn5.Text == letter && btn8.Text == letter)
                ThereİsA_Winner(btn2btn5btn8letter);
            else if (btn3.Text == letter && btn6.Text == letter && btn9.Text == letter)
                ThereİsA_Winner(btn3btn6btn9letter);
            else if (btn1.Text == letter && btn5.Text == letter && btn9.Text == letter)
                ThereİsA_Winner(btn1btn5btn9letter);
            else if (btn3.Text == letter && btn5.Text == letter && btn7.Text == letter)
                ThereİsA_Winner(btn3btn5btn7letter);
        }


  • ننشئ الدالة التالية ()ThereİsAWinner،ونستدعيها عندما يتحقق أحد شروط الفوز، وتستقبل الطرف الفائز كمتغير.


private void ThereİsA_Winner(Button button1Button button2Button button3string letter)
        {//عندما يفوز احد الطرفين
            Color newBackColor;

            if (letter == "X")
                newBackColor = Color.Green;
            else
                newBackColor = Color.Red;

            button1.BackColor = newBackColor;
            button2.BackColor = newBackColor;
            button3.BackColor = newBackColor;

            button1.ForeColor = Color.Gray;
            button2.ForeColor = Color.Gray;
            button3.ForeColor = Color.Gray;

            Scoorİncrease(letter);

            ButtonsClose();

            nextLetter_label.Text = "";
        }

  • ننشئ الدالة التالية ()Scoorİncrease ونستخدمها لزيادة نقاط احد الطرفين عندما يربح. تستدعيها عندما يفوز أحد الطرفين.


private void Scoorİncrease(string harf)
        {
            if (harf == "X")
            {
                playerScor++;
                playerScor_label.Text = playerScor.ToString();
            }
            else
            {
                cpuScor++;
                cpuScor_label.Text = cpuScor.ToString();
            }
        }

  • داخل كود زر new game نقوم بتنظيف الازرار والعداد بالاضافة الى تغير لون الازرار وجعلهم قابلين للطباعة عليهم.


private void newGame_button_Click(object senderEventArgs e)
        {
            ButtonsClear();

            ButtonChangeColor(Color.White);

            ButtunsOpen();

            ScoorClear();
        }

  • داخل كود زر continue نقوم بتنظيف الأزرار وتغيير لونهم وجعلهم قابلين للطباعة عليهم.


private void continue_button_Click(object senderEventArgs e)
        {
            ButtonsClear();

            ButtonChangeColor(Color.White);

            ButtunsOpen();
        }

  • داخل كود زر back نقوم بإخفاء الفورم الحالية ونستدعي فورم القائمة الرئيسية ونقوم بإظهارها.

private void back_button_Click(object senderEventArgs e)
        {
            Thread thread = new Thread(open_Load_Form);//انشاء فورم اخرى
            thread.SetApartmentState(ApartmentState.STA);//اعطاء خواص الفورم الاساسية

            thread.Start();//بدء   *مؤقت* جديد
            this.Close();//اغلاق الفورم الحالية
        }
        private void open_Load_Form()
        {
            Application.Run(new Load());//اظهار الفورم الخاصة باللعب ضد الحاسوب
        }    

  •  داخل كود exit نقوم باغلاق اللعبة عن طريق كتابة السطر التالي.


private void exit_button_Click(object senderEventArgs e)
        {
            Close();
        }

  • الآن نقوم بربط كل الازرار مع بعض باستخدام الحدث click كما هو موضح هنا.

  • داخل كود حدث click لكل الازرار نقوم بإضافة الكود التالي والذي يفحص ما إذا كان الزر المستهدف فارغ فيرسل أمر بطباعة الحرف،او اذا كان غير قابل للطباعة.



private void btn1_Click_1(object senderEventArgs e)
        {
            Button btn = (Button)sender;

            if (buttonEmpty[Convert.ToInt32(btn.Tag)])
            {//اذا كان الزر يمكن الوصول اليه
                buttonEmpty[Convert.ToInt32(btn.Tag)] = false;
                X_O_Write(btn);
            }
        }

داخل كود صفحة 2player

  • نقوم بكتابة كافة الدوال التي كنا قد اضفناها في صفحة 1player سابقا ونجري تعديل على اشياء بسيطة فقط.
  • في مكان تعريف المتغيرات نضيف متغير من اجل ان يحفظ دور اللاعب القادم.


bool xTurn = true;

  • في دالة ()X_O_Write نضع جملة شرطية من اجل ان نطبع الحرف الذي يأتي دوره.


private void X_O_Write(Button newButton)
        {
            if (xTurn)
            {
                X_Write(newButton);
                WinnerControl("X");
            }
            else
            {
                O_Write(newButton);
                WinnerControl("O");
            }
        }

  • في دالة ()X_Write سنضيف سطر واحد فقط من اجل تغير دور اللاعب القادم.كما هو موضح في الصورة في السطر 103.

private void X_Write(Button button)
        {//طباعة حرف  x
            button.Text = "X";
            button.ForeColor = Color.Green;
            button.BackColor = Color.Gray;
            //oجعل الدور لحرف ال
            xTurn = false;
            nextLetter_label.Text = "O";
            nextLetter_label.ForeColor = Color.Red;

        }

  • في دالة ()O_Write سنضيف سطر واحد فقط من اجل تغير دور اللاعب القادم.كما هو موضح في الصورة في السطر 115.


private void O_Write(Button button)
        {//o طباعة حرف
            button.Text = "O";
            button.ForeColor = Color.Red;
            button.BackColor = Color.Gray;
            //x جعل الدور لحرف ال
            xTurn = true;
            nextLetter_label.Text = "X";
            nextLetter_label.ForeColor = Color.Green;
        }


بهذا نكون قد انتهينا من صنع لعبة X-O بلغة سي شارب #C للمبتدئين.

يمكنك تحميل الكود من ميديا فاير من هنا

google-playkhamsatmostaqltradent