Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для nekonihilist
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141

Очистка пустых полей в Сапере

30.01.2019, 14:47. Показов 935. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется следующий код
C#
1
2
3
4
5
6
7
8
9
10
11
        private void Clear()
        {
            foreach(var but in Controls.OfType<Button>())
            {
                if(mines[but.TabIndex]==false)//где mines массив, определяющий положение мин
                {
                    cells[but.TabIndex].Image = null;//где cells массив всех кнопок, отвечающих за поля для сапера
                    cells[but.TabIndex].BackColor = Color.Gray;
                }
            }
        }
моя цель сделать так, чтобы все пустые поля очищались, как в оригинальном сапере, но этот код очищает все поля кроме тех, где есть мины, подскажите код уже неделю бьюсь
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.01.2019, 14:47
Ответы с готовыми решениями:

Проверка пустых полей
Добрый вечер. Подскажите как проверить пустые ли поля text box на форме?если нет, то выводить сообщение &quot;Заполните пустые поля&quot;

Объединение не пустых полей
Приветствую всех! Есть база FireBird, в ней таблица Users, в таблице 4 поля: te1, tel2, tel3 и tel4. Хочу все эти 4 поля объединить в...

Отображение пустых полей
Задача: вывести только то общежитие, в котором находится оценка 4 или 5 Суть проблемы: я сделал подсчет 2-ек и 3-ек, но функция count...

10
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
30.01.2019, 15:24
надо смотреть, есть ли вокруг поля хотя бы одно поле с миной, и только если таких полей нет - "очищать"
0
 Аватар для nekonihilist
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141
30.01.2019, 17:42  [ТС]
я понимаю, но у меня не получается скооперировать проверку на мины и очистку, можешь привести самый легкий пример, может я где то невнимателен

Добавлено через 1 час 32 минуты
ну вот тот самый метод(да, возможно, написан он ужасно, но что уж есть + я изначально сглупил и представил массив одномерным, теперь и получаются подобные комичные ситуации)метод Numbers вычисляет кол-во бомб вокруг кнопки;
несмотря на все рекомендации, программа работать нормально не желает, что не так?
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
 private void Clear(Button bt)
        {
            int n = bt.TabIndex;
            do
            {
                try
                {
                    Number(cells[n + 1]);
                    if (mins == 0)
                    {
                        cells[n + 1].BackColor = Color.Gray;
                        n++;
                    }
                    else
                    {
                        break;
                    }
                }
                catch(IndexOutOfRangeException)
                {
                    break;
                }
            } while (n!=100);
            n = bt.TabIndex;
            do
            {
                try
                {
                    Number(cells[n - 1]);
                    if (mins == 0)
                    {
                        cells[n - 1].Image = null;
                        cells[n - 1].BackColor = Color.Gray;
                        n--;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
            n = bt.TabIndex;
            do
            {
                try
                {
                    Number(cells[n - 1]);
                    if (mins == 0)
                    {
                        cells[n - 1].Image = null;
                        cells[n - 1].BackColor = Color.Gray;
                        n--;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
            n = bt.TabIndex;
            do
            {
                try
                {
                    Number(cells[n + 8]);
                    if (mins == 0)
                    {
                        cells[n + 8].Image = null;
                        cells[n + 8].BackColor = Color.Gray;
                        n+=8;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
            do
            {
                try
                {
                    Number(cells[n - 8]);
                    if (mins == 0)
                    {
                        cells[n - 8].Image = null;
                        cells[n - 8].BackColor = Color.Gray;
                        n -= 8;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
            do
            {
                try
                {
                    Number(cells[n + 9]);
                    if (mins == 0)
                    {
                        cells[n + 9].Image = null;
                        cells[n + 9].BackColor = Color.Gray;
                        n += 9;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
            do
            {
                try
                {
                    Number(cells[n - 9]);
                    if (mins == 0)
                    {
                        cells[n - 9].Image = null;
                        cells[n - 9].BackColor = Color.Gray;
                        n -= 9;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
            do
            {
                try
                {
                    Number(cells[n + 10]);
                    if (mins == 0)
                    {
                        cells[n + 10].Image = null;
                        cells[n + 10].BackColor = Color.Gray;
                        n += 10;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
            do
            {
                try
                {
                    Number(cells[n - 10]);
                    if (mins == 0)
                    {
                        cells[n - 10].Image = null;
                        cells[n - 10].BackColor = Color.Gray;
                        n -= 10;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            } while (n != 100);
        }
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
30.01.2019, 18:20
Цитата Сообщение от nekonihilist Посмотреть сообщение
представил массив одномерным
угу, отстой)

в общем.
я не понимаю, что такое mins.
Перепишите метод Number так, чтобы он возвращал количество мин вокруг какой-либо клетки.
Поле у вас, я так понимаю, квадратное

Навскидку
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    /// <summary>
    /// 
    /// </summary>
    /// <param name="mines">словарь индекс поля - есть ли мина</param>
    /// <param name="cellIndex">индекс проверяемого поля</param>
    /// <param name="rowLength">количество ячеек в строке</param>
    /// <returns></returns>
    static int MinesAroundCellCount(Dictionary<int, bool> mines, int cellIndex, int rowLength)
    {
        var indexesToCheck = new[]
        {
            cellIndex - (rowLength + 1), cellIndex - rowLength, cellIndex - (rowLength - 1),
            cellIndex - 1, cellIndex, cellIndex + 1,
            cellIndex + (rowLength - 1), cellIndex + 10, cellIndex + (rowLength + 1)
        };
 
        return indexesToCheck.Where(index => index >= 0).Select(index => mines[index]).Count(value => value);
    }
Если метод вернет 0 - то ячейку можно "очищать"

Еще есть нюанс, который заключается в том, что надо проверять не абсолютно все ячейки... и тут надо чуть подумать с рекурсивным вызовом метода очищения ячейки
2
 Аватар для nekonihilist
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141
30.01.2019, 18:32  [ТС]
C#
1
mins
тут является количеством мин

Добавлено через 6 минут
у меня метод Numbers определяет количество мин, в Clear я их просто проверяю, но он не работает так, как предполагалось
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
30.01.2019, 18:35
Цитата Сообщение от nekonihilist Посмотреть сообщение
у меня метод Numbers определяет количество мин
общее количество мин или что?
0
 Аватар для nekonihilist
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141
30.01.2019, 18:37  [ТС]
количество мин для одной кнопки, чтобы потом добавить ей картинку, отображающая число мин вокруг
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
31.01.2019, 07:03
Вот готовый вариант:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
    public partial class Saper : Form
    {
        public class Game
        {
            private int length;
            private int mines;
            public int flags;
            public bool gameover = false;
            private int[,] field;
            private int[,] field_flags;
            public Game(int _length, int _mines)
            {
                field = new int[_length, _length];
                field_flags = new int[_length, _length];
                field.Initialize();
                field_flags.Initialize();
 
                length = _length;
                mines = _mines;
                flags = mines;
                setMines();
            }
            private void setMines()
            {
                Random rand = new Random();
                for (int i = 0; i < mines; i++)
                {
                    bool done = true;
                    while (done)
                    {
                        int x = rand.Next(length);
                        int y = rand.Next(length);
                        if (field[x, y] != -1)
                        {
                            field[x, y] = -1;
                            done = false;
                            setValue(x, y);
                        }
                    }
                }
            }
            private void setValue(int x, int y)
            {
                int xst = (x - 1 >= 0 ? x - 1 : 0);
                int xen = (x + 1 < length ? x + 1 : length - 1);
                int yst = (y - 1 >= 0 ? y - 1 : 0);
                int yen = (y + 1 < length ? y + 1 : length - 1);
                for (int i = xst; i <= xen; i++)
                    for (int j = yst; j <= yen; j++)
                        if (field[i, j] != -1) field[i, j]++;
            }
            public bool checkWinCond()
            {
                int sum = 0;
                for (int i = 0; i < length; i++)
                    for (int j = 0; j < length; j++) if (field_flags[i, j] < 0) sum++;
                return sum + mines == length * length;
            }
            public int setFlag(int x, int y)
            {
                if ((field_flags[x, y] != -1) && (flags > 0))
                {
                    if (field_flags[x, y] == 0)
                    {
                        field_flags[x, y] = 1;
                        flags--;
                        return 1;
                    }
                    else
                    {
                        field_flags[x, y] = 0;
                        flags++;
                        return -1;
                    }
                }
                return 0;
            }
            public int getValue(int x, int y, bool setFlag = true)
            {
                if (field_flags[x, y] == 1)
                    return -2;
                else
                {
                    if (setFlag)
                    {
                        field_flags[x, y] = -1;
                    }
                    return field[x, y];
                }
            }
            public List<Point> getCircleValue(int x, int y)
            {
                List<Point> li = new List<Point>();
                int xst = (x - 1 >= 0 ? x - 1 : 0);
                int xen = (x + 1 < length ? x + 1 : length - 1);
                int yst = (y - 1 >= 0 ? y - 1 : 0);
                int yen = (y + 1 < length ? y + 1 : length - 1);
                int flags = 0;
                for (int i = xst; i <= xen; i++)
                    for (int j = yst; j <= yen; j++)
                    {
                        if (!((i == x) && (j == y)))
                        {
                            int val = getValue(i, j, false);
                            if (val > -2)
                                li.Add(new Point(i, j));
                            else flags++;
                        }
                    }
                if (field[x, y] == flags)
                {
                    return li;
                }
                else
                {
                    return new List<Point>();
                }
            }
            public List<Point> getAllmines()
            {
                List<Point> li = new List<Point>();
 
                for (int i = 0; i < length; i++)
                    for (int j = 0; j < length; j++) 
                        if ((field_flags[i,j]==0)&&(field[i,j]==-1)) li.Add(new Point(i,j));
 
                        return li;
            }
        }
        private Game gm;
 
        public Saper()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int xst = 12;
            int yst = 41;
 
            int length = int.Parse(textBox1.Text);
            removeCheckbox();
            gm = new Game(int.Parse(textBox1.Text), int.Parse(textBox2.Text));
 
            for (int i = 0; i < length; i++)
                for (int j = 0; j < length; j++)
                {
                    CheckBox cb = new CheckBox
                    {
                        Appearance = Appearance.Button,
                        Size = new System.Drawing.Size(25, 25),
                        Location = new Point(xst + i * 25, yst + j * 25),
                        Name = String.Format("cb{0}_{1}", i, j),
                        Tag = String.Format("{0} {1}", i, j),
                        TextAlign = System.Drawing.ContentAlignment.MiddleCenter
                    };
                    cb.MouseUp += checkBox1_MouseUp;
                    cb.CheckedChanged += checkBox_CheckedChanged;
                    this.Controls.Add(cb);
                }
 
 
        }
 
        private void checkBox_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox cb = sender as CheckBox;
            if (!gm.gameover)
            {
                string[] sep = cb.Tag.ToString().Split(' ');
                int x = int.Parse(sep[0]);
                int y = int.Parse(sep[1]);
 
                if (!cb.Checked)
                {
                    List<Point> di = gm.getCircleValue(x, y);
                    foreach (Point kp in di)
                    {
                        (this.Controls.Find(String.Format("cb{0}_{1}", kp.X, kp.Y), false).First() as CheckBox).Checked = true;
                    }
                    cb.Checked = true;
                }
                else
                {
                    int val = gm.getValue(x, y);
                    if (val != -2)
                    {
                        if (val == -1)
                        {
                            cb.Text = "X";
                            gm.gameover = true;
                            List<Point> di = gm.getAllmines();
                            foreach (Point kp in di)
                            {
                                CheckBox tek_cb = (this.Controls.Find(String.Format("cb{0}_{1}", kp.X, kp.Y), false).First() as CheckBox);
                                tek_cb.Checked = true;
                                tek_cb.Text = "X";
                            }
                            this.Update();
                            MessageBox.Show("Вы проиграли");
                            enabledCheckbox();
                        }
                        else
                        {
                            cb.Text = val.ToString();
                            if (val == 0)
                            {
 
                                List<Point> di = gm.getCircleValue(x, y);
                                foreach (Point kp in di)
                                {
                                    (this.Controls.Find(String.Format("cb{0}_{1}", kp.X, kp.Y), false).First() as CheckBox).Checked = true;
                                }
                                cb.Text = "";
 
                            }
                            if (gm.checkWinCond())
                            {
                                gm.gameover = true;
                                MessageBox.Show("Вы выиграли");
                                enabledCheckbox();
                            }
                        }
                    }
                    else
                    {
                        cb.Checked = false;
                    }
                }
            }
        }
 
        private void removeCheckbox()
        {
            List<CheckBox> li = this.Controls.OfType<CheckBox>().ToList();
            foreach (CheckBox ctrl in li)
            {
                ctrl.Dispose();
            }
            this.Update();
        }
 
        private void enabledCheckbox()
        {
            List<CheckBox> li = this.Controls.OfType<CheckBox>().ToList();
            foreach (CheckBox ctrl in li)
            {
                ctrl.Enabled = false;
            }
            this.Update();
        }
 
        private void checkBox1_MouseUp(object sender, MouseEventArgs e)
        {
            CheckBox cb = sender as CheckBox;
            if (!gm.gameover)
                if (e.Button == MouseButtons.Right)
                {
                    string[] sep = cb.Tag.ToString().Split(' ');
                    int val = gm.setFlag(int.Parse(sep[0]), int.Parse(sep[1]));
                    if (val == 1)
                        cb.Text = "!";
                    if (val == -1)
                        cb.Text = "";
                    label1.Text = String.Format("Мин осталось: {0}",gm.flags);
                }
        }
    }
0
 Аватар для nekonihilist
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141
31.01.2019, 11:37  [ТС]
это все хорошо, но мне нужен ответ на мой вопрос, а не вся программа, просто скопипастить проект неинтересно
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
01.02.2019, 06:50
Цитата Сообщение от nekonihilist Посмотреть сообщение
но мне нужен ответ на мой вопрос,
Для того чтобы ответить на ваш вопрос нужно смотреть проект полностью, а не огрызки кода т. к. вариантов реализации много.
Вообще мне проще сделать новый проект с нуля на коленке, чем править эту бредятину.
Цитата Сообщение от nekonihilist Посмотреть сообщение
скопипастить проект неинтересно
Вам никто и не предлагал тупо копипастить, а вот изучить тот или иной момент реализации и адаптировать по своему почему бы и нет?
1
 Аватар для nekonihilist
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141
02.02.2019, 06:45  [ТС]
вопрос уже решен, всем спасибо, вся загвоздка была в сортировке, в массиве кнопки шли наоборот, сейчас пытаюсь обработать координаты очистки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2019, 06:45
Помогаю со студенческими работами здесь

Обработка пустых полей
package lab_4; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.Set; /** ...

Чтение пустых полей
На WCF сервисе выбираются данные вот таким методом: public List&lt;TypeBO&gt; GetAllType() { string query...

Выборка пустых полей
Доброго времени суток!! Имеется база(см. вложения) И есть запрос: SELECT Ремонт.Код, Ремонт., Клиенты.Фамилия, Клиенты.,...

Отсеивание пустых полей
Вывожу людей старше 34 лет, а оно заодно выводит людей в которых не пишет дата нородження. Не могу отсеять пустые поля типа date. select...

Запрет пустых полей
У меня возникла проблема при написании программы в делфи 7. получается если выбираем GroupBox1 то проверяем все ли галочки поставлены,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru