Jak przerobić ten kod aby rysował obydwa kolory szachownicy ?

0

Witam wszystkich

Mam problem z kodem poniżej, otóż chcę go przerobić tak, aby w DialogResult.Yes: oprócz rysowanych czarnych lub w innym kolorze kwadratów rysował także białe (lub inny kolor to sobie przerobie pod ColorDialog, który pobierze kolor z SolidBrush). Z góry dziękuje za pomoc.

 

        int czarne;
            int biale;
            SolidBrush pierwszy_kolor = new SolidBrush(Pierwszy_kolor_wzoru_btn.BackColor);
            SolidBrush drugi_kolor = new SolidBrush(Drugi_kolor_wzoru_btn.BackColor);
            //     int sz = Math.Min(formaa1.pictureBox1.ClientSize.Width, formaa1.pictureBox1.ClientSize.Height) / 8;

            if (checkBox_liczba_pol.Checked == true)
            {
                czarne = Math.Min(formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height) / Convert.ToInt32(liczba_pol_txt.Text);
            }
            else
            {
                czarne = Math.Max(formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height) / 8;

            }
            biale = 2 * czarne;

            DialogResult rezultat = MessageBox.Show("Czy chcesz modyfikować kolory", "Program", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (rezultat)
            {
                case DialogResult.Yes:
                    formaa1.g.FillRectangle(drugi_kolor, formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height, czarne * 8, czarne * 8);

                    for (int x = 0; x < formaa1.bitmapa_główna.Width; x++)
                    {
                        for (int y = 0; y < formaa1.bitmapa_główna.Height; y++)
                        {

                            formaa1.g.FillRectangle(pierwszy_kolor, x * biale, y * biale, czarne, czarne);
                            formaa1.g.FillRectangle(pierwszy_kolor, x * biale + czarne, y * biale + czarne, czarne, czarne);

                        }
                    }


                       break;
                    case DialogResult.No:
                  
                  //      formaa1.g.FillRectangle(Brushes.White, 0, 0, sz * 8, sz * 8);
                        formaa1.g.FillRectangle(Brushes.White, formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height, czarne * 8, czarne * 8);
                        for (int x = 0; x < formaa1.bitmapa_główna.Width; x++)
                        {
                            for (int y = 0; y < formaa1.bitmapa_główna.Height; y++)
                            {
                                formaa1.g.FillRectangle(Brushes.Black, x * biale, y * biale, czarne, czarne);
                                formaa1.g.FillRectangle(Brushes.Black, x * biale + czarne, y * biale + czarne, czarne, czarne);
                            }
                        }
                        formaa1.pictureBox1.Image = formaa1.bitmapa_główna;
                        break;
                }


A i jeszcze jedno kod obsługuje kliknięcie przycisku.

0

Nie bardzo rozumiem Twój problem ale mam pytanie : czy filrectangle w pętlach nie wychodzą ci czasem poza rozmiar formaa1.bitmapa_główna.Width i formaa1.bitmapa_główna.Height

0

Nie

0

Nie, przepraszam za pomyłkę wyżej.Chodzi mi po prostu o oto aby program rysował szachownice a nie tylko czarne kwadraty.

0

na pewno ? załóżmy że masz formaa1.bitmapa_główna o rozmiarach np. 128x128
i wyliczysz czarne = Math.Max(formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height) / 8;
czyli czarne=16 i białe=32

Potem masz dwie pętle
for (int x = 0; x < formaa1.bitmapa_główna.Width; x++)
{
for (int y = 0; y < formaa1.bitmapa_główna.Height; y++)
{
gdzie x przyjmuje wartości 0,1,2,3 ...127 i tak samo y

czyli instrukcja formaa1.g.FillRectangle(pierwszy_kolor, x * biale, y * biale, czarne, czarne);
w ostatniej pętli będzie wypełniała prostokąt o po położeniu x=12732 i y=12732

0

Jak dobrze rozumiem ten kod to jedno FillRectngle jest odpowiedzialne za pion a drugie za poziom.Dla pewności dam cały kod.

 

 private void pictureBox2912_Click(object sender, EventArgs e)
        {
            int czarne;
            int biale;
            SolidBrush pierwszy_kolor = new SolidBrush(Pierwszy_kolor_wzoru_btn.BackColor);
            SolidBrush drugi_kolor = new SolidBrush(Drugi_kolor_wzoru_btn.BackColor);
            //     int sz = Math.Min(formaa1.pictureBox1.ClientSize.Width, formaa1.pictureBox1.ClientSize.Height) / 8;

            if (checkBox_liczba_pol.Checked == true)
            {
                czarne = Math.Min(formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height) / Convert.ToInt32(liczba_pol_txt.Text);
            }
            else
            {
                czarne = Math.Max(formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height) / 8;

            }
            biale = 2 * czarne;

            DialogResult rezultat = MessageBox.Show("Czy chcesz modyfikować kolory", "Program", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (rezultat)
            {
                case DialogResult.Yes:
                    formaa1.g.FillRectangle(drugi_kolor, formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height, czarne * 8, czarne * 8);

                    for (int x = 0; x < formaa1.bitmapa_główna.Width; x++)
                    {
                        for (int y = 0; y < formaa1.bitmapa_główna.Height; y++)
                        {

                            formaa1.g.FillRectangle(pierwszy_kolor, x * biale, y * biale, czarne, czarne);
                            formaa1.g.FillRectangle(pierwszy_kolor, x * biale + czarne, y * biale + czarne, czarne, czarne);

                        }
                    }
                        break;
                    case DialogResult.No:
                  
                  //      formaa1.g.FillRectangle(Brushes.White, 0, 0, sz * 8, sz * 8);
                        formaa1.g.FillRectangle(Brushes.White, formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height, czarne * 8, czarne * 8);
                        for (int x = 0; x < formaa1.bitmapa_główna.Width; x++)
                        {
                            for (int y = 0; y < formaa1.bitmapa_główna.Height; y++)
                            {
                                formaa1.g.FillRectangle(Brushes.Black, x * biale, y * biale, czarne, czarne);
                                formaa1.g.FillRectangle(Brushes.Black, x * biale + czarne, y * biale + czarne, czarne, czarne);
                            }
                        }
                        formaa1.pictureBox1.Image = formaa1.bitmapa_główna;
                        break;
                }
        
        
        }

0

jeśli chcesz/możesz to wyślij mi na priv cały projekt. Ciężko mi go ogarnąć po fragmencie kodu

1

spróbuj to :

 
  private void pictureBox2912_Click(object sender, EventArgs e)
        {
            int liczbaPol = (checkBox_liczba_pol.Checked)? Convert.ToInt32(liczba_pol_txt.Text):8;
            int rozmiarKafelka;
            SolidBrush pierwszy_kolor = new SolidBrush(Pierwszy_kolor_wzoru_btn.BackColor);
            SolidBrush drugi_kolor    = new SolidBrush(Drugi_kolor_wzoru_btn.BackColor);
            SolidBrush kolorBialy     = new SolidBrush(Color.White);
            rozmiarKafelka = Math.Max(formaa1.bitmapa_główna.Width, formaa1.bitmapa_główna.Height) / liczbaPol;
            
            Console.WriteLine("start {0},width {1},rozmiar kafelka {2}", DateTime.Now.ToString(),formaa1.bitmapa_główna.Width, drugi_kolor);
            DialogResult rezultat = MessageBox.Show("Czy chcesz modyfikować kolory", "Program", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            drugi_kolor = (rezultat == DialogResult.No) ? kolorBialy : drugi_kolor;

            for (int x = 0; x < liczbaPol; x++)
            {
                for (int y = 0; y < liczbaPol; y++)
                {
                    int k = x * rozmiarKafelka;
                    int w = y * rozmiarKafelka;
                    if ((x % 2 == 0 && y % 2 == 0) || (x % 2 == 1 && y % 2 == 1))
                    {

                        Console.WriteLine("pierwszy x {0} ,y {1} ,kolor {2},k {3},w {4}", x, y, pierwszy_kolor.Color.ToArgb(), k, w);
                        formaa1.g.FillRectangle(pierwszy_kolor, k, w, rozmiarKafelka, rozmiarKafelka);
                    }
                    else
                    {
                        Console.WriteLine("drugi x {0} ,y {1} ,kolor {2},k {3},w {4}", x, y, pierwszy_kolor.Color.ToArgb(), k, w);
                        formaa1.g.FillRectangle(drugi_kolor, k, w, rozmiarKafelka, rozmiarKafelka);
                    }
                }
            }
            Console.WriteLine("koniec {0}",DateTime.Now.ToString());
        }

0

Działa Wielkie dzięki :)

1

zamiast if-a

for (int x = 0; x < liczbaPol; x++)
            {
                for (int y = 0; y < liczbaPol; y++)
                {
                    int k = x * rozmiarKafelka;
                    int w = y * rozmiarKafelka;
                    formaa1.g.FillRectangle((x%2==y%2)?pierwszy_kolor:drugi_kolor, k, w, rozmiarKafelka, rozmiarKafelka);
                   
                }
            }
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1