C# da kichkinagina aqlni charxlovchi o'yin dasturi

Assalomu alaykum opennet.uz ahli! bugun birinchi maqolamni yozib qoldirishga qaror qildim, birinchi maqolam bo'lganligi uchun ilk dasturlash olamiga qadam qo'yganimda o'rganish uchun tuzgan dasturimni qoldirmoqdaman(to'g'risi kurs ishim uchun majburlikdan qilganman)). Ehtimol quyida keltiriladigan dastur ko'pchilikka tanishdir, lekin biror kishiga foydasi tegib qolar degan umidda yozyapman.

Dastur o'sib kelayotgan yosh avlodni intelektual salohiyatini oshirish maqsadida tuzilgan, algoritmi yoki kod ning umumiy tavsifi komentariy qismida to'laligicha ochib berishga harakat qilingan…

o'yin quyidagicha:
«Surat» menyusidan suratni ochib olamiz.
1-rasm

«Bosqichlari» menyusidan suratni nxn matritsa ko'rinishida aralashish bosqichlarini belgilaymiz.
2-rasm
Aralashgandan keyingi holat.
3-rasm
«Yordam» menyusi, yordam kerak bo'lsa qo'ldan kelguncha ;)
4-rasm
Tiklangandan keyingi holat.
5-rasm

Dastur kodi quyidagicha:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace mosaic
{
             // bosh forma klassi, turli xil elementlarimizni qo'shish uchun 
            // masalan panel , to'rtburchak PictureBox va boshqalarini  o'z ichiga oladi.
    public partial class FormMain : Form
    {
        private int sec,minut;
        public FormMain()
        {
            InitializeComponent();
        }
                            // surat segmentini to'rburchakli massiv obektlar korinishida saqlash
        PictureBox[] PB = null;
                           // to'rtburchaklar uzunligi.
        int LengthSides = 3;
                             // surat saqash obekti.
        Bitmap Picture = null;
                          // surat o'lchamlarini aniqlashni  qulaylashtirish uchun
                          // PB massivining  to’g’riburchaklari panel 1 panelida joylashtiriladi.
        void CreatePictureRegion()
        {
            // yangi massiv yasash uchun eskisini o'chiramiz.
            if (PB != null)
            {
                for (int i = 0; i < PB.Length; i++)
                {
                    PB[i].Dispose();
                }
                PB = null;
            }
                       int num = LengthSides;
      // lengthSides X lengthSides o’lchamdagi to’g’riburchaklar massiv yaratamiz.
            PB = new PictureBox[num * num];
       // to'rtburchak gabarit o'lchamlarini aniqlaymiz.
            int w = panel1.Width / num;
            int h = panel1.Height / num;

            int countX = 0; // X koordinatasi bo’yicha bir qatorda joylashgan to’rtburchaklar          //xisoblagichi.                                                    
            int countY = 0; // Y koordinatasi bo’yicha bir ustunda to’rtburchaklar xisoblagichi.
            for (int i = 0; i < PB.Length; i++)
            {
                PB[i] = new PictureBox(); //  Massiv elementi, to’g`riburchaklarni  hosil qilish.
                         // Yaratilgan burchakni joylashgan o’lchamlari va koordinatalari.
                PB[i].Width = w;
                PB[i].Height = h;
                PB[i].Left = 0 + countX * PB[i].Width;
                PB[i].Top = 0 + countY * PB[i].Height;

                // Aralashgan suratning qayta  tiklash,
                // suratni to`liq yig`ishni aniqlash uchun 
                // To`g`riburchaklarni boshlang`ich koordinatasini eslab qolamiz.
               
                Point pt = new Point();
                pt.X = PB[i].Left;
                pt.Y = PB[i].Top;
                PB[i].Tag = pt; // Harbir to’rtburchak  koordinatalarini “tag” xususiyatda saqlab qolamiz.
                  //  To’rtburchaklarni qatorlar va ustunlar bo’yicha sanab chiqamiz.
                countX++;
                if (countX == num)
                {
                    countX = 0;
                    countY++;
                }
                PB[i].Parent = panel1;  // To’rtburchaklarni panelda joylashtirib chiqamiz.
                PB[i].BorderStyle = BorderStyle.None;
                PB[i].SizeMode = PictureBoxSizeMode.StretchImage; // Suratning o’lchamlari to’rtburchak o’lchamlariga moslanadi.
                PB[i].Show();             // To’rtburchak ko’rinishining kafolati.
                //  Bir joydagi to’rtburchaklar koordinatalarini 
                //  aniqlashni qulaylashtirish uchun massivni  
                //  barcha to’rtburchaklari uchun sichqoncha bosilishi
                //  bir funksiyani o’zida amalga oshiriladi.
              
                PB[i].Click += new EventHandler(PB_Click);
            }
                       //  Rasmni segmenlarga bo’lamiz va xar bir 
                                //  segmetni o’z to’rtburchagimizga joylashtiramiz.
            DrawPicture();
        }
         void DrawPicture()
        {
            if (Picture == null) return;
            int countX = 0;
            int countY = 0;
            int num = LengthSides;
            for (int i = 0; i < PB.Length; i++)
            {
                int w = Picture.Width / num;
                int h = Picture.Height / num;
                PB[i].Image = Picture.Clone(new RectangleF(countX * w, countY * h, w, h), Picture.PixelFormat);
                countX++;
                if (countX == LengthSides)
                {      countX = 0;
                        countY++;
                } }}
             void PB_Click(object sender, EventArgs e)
        {
            PictureBox pb = (PictureBox)sender;
            for (int i = 0; i < PB.Length; i++)
            {
                // avval surat maydonida bo`sh jonyi tanlab olamiz.
                if (PB[i].Visible == false)
                {
                    // keyin bosilgan to`rburchakni tekshiramiz va
                    // agar koordinatalar x va y bo'yicha to'g'ri kelmasa
                    // diognal bo'yicha joylashgan to`rburchakni xisobdan olib tashlaymiz                  
                    // lekin bunda u bo'sh joydan eng qisqa masofada joylashtiriladi 
                    // (bo'sh joydan keyin joylashgan to`rburchakni olib tashlaymiz).
                    if (
                        (pb.Location.X == PB[i].Location.X &&
                         Math.Abs(pb.Location.Y - PB[i].Location.Y) == PB[i].Height)
                        ||
                        (pb.Location.Y == PB[i].Location.Y &&
                         Math.Abs(pb.Location.X - PB[i].Location.X) == PB[i].Width)
                        )
                    {
                                 // samarali tekshirishdan keyin bo'sh va bosilgan 
                                // to`rburchaklarni joylarini almashtiramiz.
                        Point pt = PB[i].Location;
                        PB[i].Location = pb.Location;
                        pb.Location = pt;

// har bir yurishdan keyin suratni to'liq yig`ishga tekshiriladi (yig`ildimi yo`qmi).
                      // *** TEKSHIRISH BLOKI ***
                        //  Agar istalgan to`rtburchakdagi real koordinatalari va 
                        //  boshlangichlari to’g’ri kelmay qolsa funksiyadan chiqib ketadi.
                        for (int j = 0; j < PB.Length; j++)
                        {
                            Point point = (Point)PB[j].Tag;
                            if (PB[j].Location != point)
                            {
                                return;               }}
                          //  Agar to’rtburchakning barcha boshlang’ich va
                        //  real koordinatalari to’g’ri kelsa surat yig’iladi !
                        for (int m = 0; m < PB.Length; m++)
                        {
                            PB[m].Visible = true;
                            PB[m].BorderStyle = BorderStyle.None; // Suratdagi chiziqlar olib tashlanadi.
                        }
            //                  *** TEKSHIRISH BLOKI TUGADI ***
                    }
                          break;
       } }}

        // Dialog oynasini ochish, fayl va yangi surat chizish maydonini xosil qilish.
                     private void toolStripButtonLoadPicture_Click(object sender, EventArgs e)
        {
                           OpenFileDialog ofDlg = new OpenFileDialog();
                         // Faqatgina ma’lum kengaytmali fayllarni ko’rsatish filtiri.
            ofDlg.Filter = "файлы картинок (*.bmp;*.jpg;*.jpeg;)|*.bmp;*.jpg;.jpeg|All files (*.*)|*.*";
            ofDlg.FilterIndex = 1;
            ofDlg.RestoreDirectory = true;

                            if (ofDlg.ShowDialog() == DialogResult.OK)
            {
                                            //  Tanlangan suratni yuklaymiz.
                Picture = new Bitmap(ofDlg.FileName);
                                        //  Chizish uchun yangi maydon ochamiz.
                CreatePictureRegion();
            }  }
        // To’rtburchaklarni aralashtirish, koordinatalarini xolatini o’zgartiramiz.
                     private void toolStripButtonMixed_Click(object sender, EventArgs e)
        {
                        if (Picture == null) return;

            // tasodifiy raqamlar generatsyalash obektini hosil qilamiz
            // turli xil tasodifiy raqamlarni yig'ishni "random" obekti orqali os 
            // yoqilgandan keyingi mili sekundlar miqdori xiasobida amalga oshiramiz
                                    // timerni ishlatish uchun
            start_game();
            sec = 0;                 //vaqt o`zgaruvchisi
            button1.Enabled = true;
                                       // timer tamom
             Random rand = new Random(Environment.TickCount);
            int r = 0;
            for (int i = 0; i < PB.Length; i++)
            {
                PB[i].Visible = true;
                r = rand.Next(0, PB.Length);
                Point ptR = PB[r].Location;
                Point ptI = PB[i].Location;
                PB[i].Location = ptR;
                PB[r].Location = ptI;
                PB[i].BorderStyle = BorderStyle.FixedSingle;
            }
                               // tasodifiy ravishda bo'sh to'rtburchak 
                                   // tanlaymiz va uni ko'rinmas qilamiz.
            r = rand.Next(0, PB.Length);
            PB[r].Visible = false;
        }
         // har bir to'rtburchakda suratning biror segmentini saqlaymiz.
          // suratni boshlang'ich koordinatalar asosida tiklaymiz.
                            private void toolStripButtonRestore_Click(object sender, EventArgs e)
        {
                         if (Picture == null) return;
                           for (int i = 0; i < PB.Length; i++)
            {
                          Point pt = (Point)PB[i].Tag;
                             PB[i].Location = pt;
                PB[i].Visible = true;
            }
        }
                                 // dasturni tuzatish diolog oynasini ochamiz.
                     private void toolStripButtonSetting_Click(object sender, EventArgs e)
        {
            SetDlg setDlg = new SetDlg();
            setDlg.LengthSides = LengthSides;
            if (setDlg.ShowDialog() == DialogResult.OK)
            {
                LengthSides = setDlg.LengthSides;
                CreatePictureRegion();
            } }
                //                   ### yordam oynasi ###
               // foydalanuvchining xotirasigakeltirish uchun 
               // suratning normal ko'rinishini dialog oynasida ochamiz.
        private void toolStripButtonHelp_Click(object sender, EventArgs e)
        {
            HelpDlg helpDlg = new HelpDlg();
            helpDlg.ImageDuplicate = Picture;
            helpDlg.ShowDialog();
        }
                     private void timer1_Tick(object sender, EventArgs e)
        {
            sec++;
            if (sec / 60 == 1) minut++;
            sec = sec % 60;
            label4.Text = minut + ":" + sec; 
        }
                   private void start_game()
        {
            label4.Text = "0";
            sec = 0;
            minut = 0;
            timer1.Enabled = true;
        }
                     private void button1_Click(object sender, EventArgs e)
        {
                       if (timer1.Enabled == false) 
            {
                label3.ForeColor = Color.Black;
                label4.ForeColor = Color.Black;
                timer1.Enabled = true;
                panel1.Enabled = true;
            }
            else 
            {
                label3.ForeColor =Color.Olive;
                label4.ForeColor = Color.Olive;
                timer1.Enabled = false;
                panel1.Enabled = false;
            }
        }
                       private void toolStripButton1_Click(object sender, EventArgs e)
        {
            Haqida Avtor = new Haqida();
            Avtor.ShowDialog();
     }
      private void button2_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }} } 



yuklab olish

Haya aytgancha nimaga «miyya hujayralarini ishlatamiz» deb yozganimni eslolmadim, manimcha uztozimiz Sulton Sanjar akaga kursga qatnaganimda shu gaplarni ko'p takrorlardilar o'shanda nimanidir o'ylab yozgandirman))

3 комментария

shranet
Ochig'i yarim soat o'ynab hech yutomadim. Oxirida 2 ta yonma-yon qolib ketadi. O'rinlari teskari holda. Nimaga?
1
U2B3K
Dasturni ko'rmadimu, lekin 15 o'yinini rasmli ko'rinishi bo'lsa unda 2 ta yonma yon qolib ketishini tushunish mumkin. 15 o'yinida oxirgi qatorda 13, 15, 14 sonlari bo'lib qolishi yechib bo'lmaydigan holat. Bunday holat dasturda bo'lmasligi uchun o'yin boshida bo'laklarni idishdan olmay aralashtirish kerak, ya'ni tasodifiy siljitishlar orqali
1
bars222
«miyya hujayralarini ishlatamiz» deb yozishingni sababi Erkyul Puaro shunday derdi, bu o'shani gapi;)
0