Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 10.11.2017
Сообщений: 52

Сапер с DataGridView

06.10.2018, 13:37. Показов 2075. Ответов 15

Студворк — интернет-сервис помощи студентам
В задачи:у нас есть поле datagrid 10*10 и две кнопки, одна заполняет поле (которое состоит из 0 и 1) а другая очищает. После нажатия кнопки заполнения нужно чтобы поле заполнилось но ячеек видно не было. Далее пользователь нажимает на любую ячейку и если он попал в 1-ку то ячейка закрашивается красным, например, и высвечивается окошко "вы проиграли", а если попадет в 0 то ячейка закрашивается зеленым и игра продолжается.

На данный момент только заполнили datagrid
C#
1
2
3
4
5
6
7
8
9
 //заполнение поля
            Random rand = new Random();
            for (int x = 0; x < dataGridView1.ColumnCount; x++)
            {
                for (int y = 0; y < dataGridView1.RowCount; y++)
                {
                    dataGridView1[x, y].Value = rand.Next(0, 2);
                }
            }
И нашли команду как по шелчку меняется цвет ячейки
C#
1
2
dataGridView1.CellContentClick += dataGridView1_CellContentClick;
                dataGridView1.CurrentCell.Style.BackColor = Color.Red;
Что делать дальше вообще хз, помогите
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2018, 13:37
Ответы с готовыми решениями:

Datagridview игра сапер
помогите сделать так что можно было задавать сколько бом в поле и когда я получается нахожу бомбу игра не только показывал вы проиграли но...

Сделать игру "Сапёр". Использовать кнопку "datagridview"
Помогите написать код.Нужно сделать игру &quot;САПЁР&quot; матрица 10x10.Использовать кнопку &quot;datagridview&quot;!!!!

Сапер на С++
помогите пожалуйста переделать игру сапер, программа работает, осталось оформить ее с классом &quot;Field&quot;, помогите пожалуйста, а то...

15
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
06.10.2018, 16:36
Цитата Сообщение от Ananas_ik Посмотреть сообщение
Что делать дальше вообще хз
Бросить затею с датагрид.
0
0 / 0 / 0
Регистрация: 10.11.2017
Сообщений: 52
06.10.2018, 16:54  [ТС]
хорошая идея, только придется делать
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
06.10.2018, 20:06
Ananas_ik, лучше кнопки используйте, как ячейки. Если рисовать не хочется.
0
C# = ♫♪♫♪♪♫
 Аватар для Sanek32
57 / 56 / 18
Регистрация: 02.08.2014
Сообщений: 283
08.10.2018, 12:05
TableLayoutPanel вместо DataGridView.
UserControl в качестве ячеек.
0
 Аватар для sysrepos
83 / 77 / 30
Регистрация: 08.08.2013
Сообщений: 461
Записей в блоге: 1
08.10.2018, 12:42
если я правильно понял, что вам нужно, чтобы все ячейки были серыми, то сделайте фон ячейки серым, и цвет шрифта таким же серым. Тогда ячейка будет будет полностью серой (шрифт сольется с фоном).
1
0 / 0 / 0
Регистрация: 10.11.2017
Сообщений: 52
08.10.2018, 16:01  [ТС]
Хорошая идея. Еще вопрос, как по условию сделать, что при нажатии программа понимала 1 там или 0 и выдавала соответствующее действие
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
08.10.2018, 16:27
Ananas_ik, Вот поэтому я вам про кнопки и написал, что замучаетесь вы нажатие ячеек обрабатывать.
0
0 / 0 / 0
Регистрация: 10.11.2017
Сообщений: 52
08.10.2018, 16:47  [ТС]
задание такое, а с кнопками какой принцип?
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
08.10.2018, 17:03
Цитата Сообщение от Ananas_ik Посмотреть сообщение
задание такое
Ну если задание такое, то
C#
1
2
3
4
5
6
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
 
    dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = System.Drawing.Color.Gray; //Так ячейка раскрасится при клике
    var cellValue = dataGridView1[e.ColumnIndex, e.RowIndex].Value; //Так вы получите значение ячейки.           
}
Опять же, нужно делать проверки. Если кликнуть по заголовку получите OutOfRangeException
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.10.2018, 17:16
Цитата Сообщение от Ananas_ik Посмотреть сообщение
хорошая идея, только придется делать
Можете начать здесь: Отрисовать модель дорожного полотна
Там где-то внизу есть мое сообщение с прицепленным проектом — в нем ячейки отрисовываются вручную и нажатия обрабатываются так же.
Делается все довольно просто, плюс легко сделать полное разделение логики игры и отрисовки.

Добавлено через 5 минут
Сами ячейки можете отрисовывать, используя метод DrawButton вместо DrawGrid/FillRectangle:
C#
1
2
3
4
5
6
7
8
9
10
11
private void OnRoadPaint(object sender, PaintEventArgs e)
{
    int w = pnlRoad.Width / road.GetLength(1);
    int h = pnlRoad.Height / road.GetLength(0);
 
    for (int i = 0; i < road.GetLength(0); i++) {
        for (int j = 0; j < road.GetLength(1); j++) {
            ControlPaint.DrawButton(e.Graphics, new Rectangle(j * w + 1, i * h + 1, w - 1, h - 1), road[i, j] == 1 ? ButtonState.Pushed : ButtonState.Normal);
        }
    }
}
0
0 / 0 / 0
Регистрация: 10.11.2017
Сообщений: 52
08.10.2018, 17:21  [ТС]
и дальше что? как условие писать?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.10.2018, 17:23
Цитата Сообщение от Ananas_ik Посмотреть сообщение
и дальше что?
А дальше берете код отрисовки и адаптируете под свои нужды.

Цитата Сообщение от Ananas_ik Посмотреть сообщение
как условие писать?
Условие чего?
Обычно через if
0
 Аватар для sysrepos
83 / 77 / 30
Регистрация: 08.08.2013
Сообщений: 461
Записей в блоге: 1
08.10.2018, 17:42
вот примерно то, что вы хотите. (+ см. сам проект)
Кнопки в ячейках.


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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace MyExp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            foreach (DataGridViewColumn column in dataGridView1.Columns)
            {
                column.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            }
 
            /*
            for (int i = 0; i < 10; i++) //добавление колонок программно (возникают проблемы с заполнением имен ячеек) колонки добавлены вручную в студии
            {
                DataGridViewButtonColumn kol5 = new DataGridViewButtonColumn();
                //DataGridViewTextBoxColumn kol5 = new DataGridViewTextBoxColumn();
                
                kol5.HeaderText = "k" + (i + 1).ToString();
                kol5.Name = "n";
                kol5.Text = "t"; //++
                kol5.UseColumnTextForButtonValue = true;
                kol5.Width = 100;
 
                dataGridView1.Columns.Add(kol5);
            }*/
 
            dataGridView1.Rows.Add(9);
 
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
 
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                //MessageBox.Show(i.ToString());
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    //MessageBox.Show(j.ToString());
                    dataGridView1.Rows[i].Cells[j].Value = i.ToString() + j.ToString();
                }
            }
 
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Random r = new Random();
 
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
 
                    dataGridView1.Rows[i].Cells[j].Value = r.Next(0,2).ToString();
                }
            }
        }
 
 
 
        private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
 
                    dataGridView1.Rows[i].Cells[j].Value = "";
                }
            }
        }
 
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
           
        }
    }
}
Миниатюры
Сапер с DataGridView  
Вложения
Тип файла: 7z 14-DataGrid ячейки кнопки (сапер).7z (29.0 Кб, 11 просмотров)
0
 Аватар для sysrepos
83 / 77 / 30
Регистрация: 08.08.2013
Сообщений: 461
Записей в блоге: 1
08.10.2018, 18:26
обновленная версия.
ячейки и строки создаются в коде
(нужно было свойство указать kol5.UseColumnTextForButtonValue = false; )
Вложения
Тип файла: 7z 14-DataGrid ячейки кнопки (сапер).7z (29.6 Кб, 18 просмотров)
0
 Аватар для Aferuga
645 / 529 / 324
Регистрация: 20.05.2015
Сообщений: 1,471
10.10.2018, 08:13
Цитата Сообщение от Ananas_ik Посмотреть сообщение
а с кнопками какой принцип?
Вот на коленке набросал:
Кликните здесь для просмотра всего текста
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
        public class Game
        {
            private int length;
            private int mines;
            public int use_check=0;
            public int[,] field;
            public Game(int _length, int _mines)
            {
                field = new int[_length, _length];
                field.Initialize();
                length = _length;
                mines = _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]++;
            }
 
        }
        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);
            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 = gm.field[i, j]
                    };
 
                    cb.CheckedChanged += checkBox_CheckedChanged;
                    this.Controls.Add(cb);
                }
 
 
        }
 
        private void checkBox_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox cb = sender as CheckBox;
 
                if ((int)cb.Tag == -1)
                {
                    cb.Text = "X";
                    MessageBox.Show("Вы проиграли");
                }
                else
                {
                    cb.Text = cb.Tag.ToString();
                    // cb.Enabled = false;
                    if ((int)cb.Tag == 0)
                    {
                        checkValue(int.Parse(cb.Name[2].ToString()), int.Parse(cb.Name[4].ToString()));
                        cb.Text = "";
                    }
                }
            
        }
        private void checkValue(int x, int y)
        {
 
            for (int i = x-1; i <= x+1; i++)
                for (int j = y-1; j <= y+1; j++)
                    if (this.Controls.Find(String.Format("cb{0}_{1}",i,j),false).Count()>0)
                         (this.Controls[String.Format("cb{0}_{1}", i, j)] as CheckBox).Checked = true;
        }

З. Ы. код конечно далек от идеала, но он хотя бы напоминает оригинальный сапер.

Добавлено через 21 минуту
З. З. Ы. А если конкретно по сабжу, то можно сделать так:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void dataGridView9_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            dataGridView1.ClearSelection();
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = (field[e.RowIndex, e.ColumnIndex]==0?Color.Green:Color.Red);
            if (field[e.RowIndex, e.ColumnIndex] == 1) MessageBox.Show("Вы проиграли");
        }
        private int[,] field;
        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.RowCount = 10;
            dataGridView1.ColumnCount = 10;
            field = new int[10, 10];
            Random rand = new Random();
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                    field[i, j] = rand.Next(2);
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.10.2018, 08:13
Помогаю со студенческими работами здесь

Сапер
Доброго времени суток! Хотел узнать, может у кого завалялись исходники игры &quot;сапер&quot; на Java?

сапёр
здравствуйте извините, если повторяюсь (видела, что подобная тема была, причём не одна, но не нашла там того, что надо), но мне срочно...

Сапер
Сделать игру сапера: 1) нарисовать доску функция с 2 параметрами(доска и количество мин) 2) ввод в поле количества...

Сапер
Пишу игру &quot;сапер&quot; на C++. Появилась небольшая проблемка. Всё поле храню в массиве. Бомбы разбрасываю случайно по полю, а после этого...

Сапер
Доброго времени суток! Подскажите пожалуйста, где я налажал в коде? Я запутался:( Ругается на константу двумерного массива... #include...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru