1 Востаннє редагувалося FakiNyan (10.09.2014 15:07:20)

Тема: Пошук "сусідів" клітинки

Хай. От є матриця 10 на 10. Якісь клітинки можуть бути білими, а якісь червоними.
При натисканні на клітинку має з'явитись віконце з кількістю її сусідів.
Проблем в том, що коли в клітинки 3 сусіда, воно чомусь каже, що їх лише 2. Хоча для інших клітинок все вірно працює.
Ось код пошуку сусідів

  private void method(int i, int j)
        {
            int count = 0;

            if (i - 1 > 0 && j - 1 > 0 &&
                       dataGridView1.Rows[i - 1].Cells[j - 1].Style.BackColor == Color.Red)
            {
                count++;
            }
            if (i - 1 > 0 &&
                dataGridView1.Rows[i - 1].Cells[j].Style.BackColor == Color.Red)
            {
                count++;
            }
            if (j - 1 > 0 &&
                dataGridView1.Rows[i].Cells[j - 1].Style.BackColor == Color.Red)
            {
                count++;
            }
            if (i + 1 < dataGridView1.RowCount && j + 1 < dataGridView1.ColumnCount &&
                dataGridView1.Rows[i + 1].Cells[j + 1].Style.BackColor == Color.Red)
            {
                count++;
            }
            if (i + 1 < dataGridView1.RowCount &&
                dataGridView1.Rows[i + 1].Cells[j].Style.BackColor == Color.Red)
            {
                count++;
            }

            if (j + 1 < dataGridView1.ColumnCount &&
                dataGridView1.Rows[i].Cells[j + 1].Style.BackColor == Color.Red)
            {
                count++;
            }
            if (i - 1 > 0 && j + 1 < dataGridView1.ColumnCount &&
                dataGridView1.Rows[i - 1].Cells[j + 1].Style.BackColor == Color.Red)
            {
                count++;
            }
            if (i + 1 < dataGridView1.RowCount && j - 1 > 0 &&
                dataGridView1.Rows[i + 1].Cells[j - 1].Style.BackColor == Color.Red)
            {
                count++;
            }
            MessageBox.Show(count.ToString());
        }

Сусіди рахуються по прямим та по діагоналі, тобто максимальна кількість сусідів == 8
Екзешку прикріпив. Тисніть Random аби заповнити поле червоними полями, а потім поклікайте на поля і перевірте, чи показується вірна кількість сусідів.

Post's attachments

ska1.rar 5.05 kb, 338 downloads since 2014-09-10 

2

Re: Пошук "сусідів" клітинки

Хоча для інших клітинок все вірно працює

http://не-дійсний-домен/i9/69a78eb4345ec4efbdb81385caaabfd2/1410355325/54486/777152/Bezymiannyi2.png

3

Re: Пошук "сусідів" клітинки

quez написав:

Хоча для інших клітинок все вірно працює

http://не-дійсний-домен/i9/69a78eb4345ec4efbdb81385caaabfd2/1410355325/54486/777152/Bezymiannyi2.png

Ну от я і кажу. Для якихось все норм, а для якихось зовсім не норм. Чо так?

4

Re: Пошук "сусідів" клітинки

розібрався, там тре було перевіряти не >0 а >=0

5

Re: Пошук "сусідів" клітинки

блін тільки вашу програму декомпілив а ви уже знайшли рішення, доречі похожий код?)

private void NeighboursCount()
        {
            int num = 0;
            for (int index1 = 0; index1 < this.matrix.GetLength(0); ++index1)
            {
                for (int index2 = 0; index2 < this.matrix.GetLength(1); ++index2)
                {
                    if (index1 - 1 > 0 && index2 - 1 > 0 && this.dataGridView1.Rows[index1 - 1].Cells[index2 - 1].Style.BackColor == Color.Red)
                        ++num;
                    if (index1 - 1 > 0 && this.dataGridView1.Rows[index1 - 1].Cells[index2].Style.BackColor == Color.Red)
                        ++num;
                    if (index2 - 1 > 0 && this.dataGridView1.Rows[index1].Cells[index2 - 1].Style.BackColor == Color.Red)
                        ++num;
                    if (index1 + 1 < this.dataGridView1.RowCount && index2 + 1 < this.dataGridView1.ColumnCount && this.dataGridView1.Rows[index1 + 1].Cells[index2 + 1].Style.BackColor == Color.Red)
                        ++num;
                    if (index1 + 1 < this.dataGridView1.RowCount && this.dataGridView1.Rows[index1 + 1].Cells[index2].Style.BackColor == Color.Red)
                        ++num;
                    if (index2 + 1 < this.dataGridView1.ColumnCount && this.dataGridView1.Rows[index1].Cells[index2 + 1].Style.BackColor == Color.Red)
                        ++num;
                    if (index1 - 1 > 0 && index2 + 1 < this.dataGridView1.ColumnCount && this.dataGridView1.Rows[index1 - 1].Cells[index2 + 1].Style.BackColor == Color.Red)
                        ++num;
                    if (index1 + 1 < this.dataGridView1.RowCount && index2 - 1 > 0 && this.dataGridView1.Rows[index1 + 1].Cells[index2 - 1].Style.BackColor == Color.Red)
                        ++num;
                    if (num == 3 && this.dataGridView1.Rows[index1].Cells[index2].Style.BackColor == Color.White)
                        this.matrix[index1, index2] = 2;
                    if (num <= 1 && this.dataGridView1.Rows[index1].Cells[index2].Style.BackColor == Color.Red)
                        this.matrix[index1, index2] = 1;
                    num = 0;
                }
            }
            for (int index1 = 0; index1 < this.matrix.GetLength(0); ++index1)
            {
                for (int index2 = 0; index2 < this.matrix.GetLength(1); ++index2)
                {
                    if (this.matrix[index1, index2] == 1)
                        this.dataGridView1.Rows[index1].Cells[index2].Style.BackColor = Color.White;
                    if (this.matrix[index1, index2] == 2)
                        this.dataGridView1.Rows[index1].Cells[index2].Style.BackColor = Color.Red;
                }
            }
        }

6

Re: Пошук "сусідів" клітинки

truesupport, то він і є

7

Re: Пошук "сусідів" клітинки

По-перше, ніколи не працюйте з візуальними елементами в середині робочого коду. Ввід - обробка - вивід, і тільки так. Тобто копіюйте все в масив, а потім лічіть.
По-друге, нумерація в масивах починається з 0, і (i - 1 > 0) гарантує, що при i = 1 значення обчислене не буде.
Ну і по-третє, хоч би якось спробували в два цикли від -1 до 1 запхати це, чи в один по точкам (-1, -1), (-1,0),...,(1,1), просто соромно...

8

Re: Пошук "сусідів" клітинки

koala написав:

По-перше, ніколи не працюйте з візуальними елементами в середині робочого коду. Ввід - обробка - вивід, і тільки так. Тобто копіюйте все в масив, а потім лічіть.
По-друге, нумерація в масивах починається з 0, і (i - 1 > 0) гарантує, що при i = 1 значення обчислене не буде.
Ну і по-третє, хоч би якось спробували в два цикли від -1 до 1 запхати це, чи в один по точкам (-1, -1), (-1,0),...,(1,1), просто соромно...

а мені не соромно, тому що при написанні я не думав про красу коду. Там ще мона було б оті перевірки, в подвійному циклі, винести в делегат, бо вони там різні кароч бувають, чи шось таке
ну шоб було щось типу

void Method(delegate del)
for(int i = 0; i<10; i++)
    for(int j =0; j<10; j++)
     del(i,j);        

9

Re: Пошук "сусідів" клітинки

А давайте тоді АІ для танчиків писати. Бо самому коли нема з ким мірятись якось не цікаво.

10

Re: Пошук "сусідів" клітинки

Vo_Vik написав:

А давайте тоді АІ для танчиків писати. Бо самому коли нема з ким мірятись якось не цікаво.

ццццц.. ще чого. Мені тре
1) Робити лаби
2) Робити лаби по іншому предмету
3) Написати онлайн-магазин (це теж лаба)
4) Вчитись малювати
5) Вчити японську
6) Дивитись мангу
7) Читати аніме
8) Догодити koala, коли в слід. раз буду постити свій код
9) Обрати тему для диплому
10) Грати в онлайн-гру
А ви мені ще танчики писати пропонуєте.

11

Re: Пошук "сусідів" клітинки

Давайте пункт десять на танчики поміняємо)

12

Re: Пошук "сусідів" клітинки

Vo_Vik написав:

Давайте пункт десять на танчики поміняємо)

Ні.