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

Морской бой с визуальными компонентами

21.06.2013, 17:18. Показов 10485. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времени суток, уважаемые гуру программирования.
Я начал переделать игру Морской бой с визуальными компонентами из консольного приложения, т.е. сам алгоритм уже есть.
Проблема возникает на этапе создания поля. На данном этапе я создал 2 поле, каждое из которых состоит из 100 объектов PictureBox, т.е. в сумме 200 объектов, что, разумеется, ведет к огромному расширению кода. Само по себе это не было бы большой проблемой, но мне сложно представить, как можно мой алгоритм "привинтить" к данному полю относительно экономно.
Буду очень благодарен всем, кто попытается помочь!
С уважением, Letsifer.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2013, 17:18
Ответы с готовыми решениями:

Морской бой
Здравствуйте господа. Мне нужно сделать игру морской бой. Игровое поле- 10x10 Корабли на игровом поле: Четыре одноклеточных, три...

Морской бой
Добрый день, форумчане! Такая проблема, на учебной практике резко с консольного c# перескочили на формы. И встала задача написать...

Морской бой
Добрый вечер, можете покидать ссылки на проекты игры Морской Бой любой сложности. Спасибо

17
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
21.06.2013, 22:49
А что вас смущает? Ну двести так двести. Для отображения используйте tableLayoutPanel1 - задайте нужное количество строк и столбцов, добавьте в него ваши контролы. Для удобства дальнейшего доступа к контролам сохраните их в отдельном массиве:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private PictureBox[,] pictureBoxes = new PictureBox[10, 10];
 
public Form1()
{
    InitializeComponent();
 
    tableLayoutPanel1.ColumnCount = 10;
    tableLayoutPanel1.RowCount = 10;
 
    for (int y = 0; y < 10; y++)
    {
        for (int x = 0; x < 10; x++)
        {
            var pictureBox = new PictureBox();
            pictureBoxes[y, x] = pictureBox;
            tableLayoutPanel1.Controls.Add(pictureBox);
        }
    }            
}    
 
// Где-то далее в программе
pictureBoxes[3, 5].Image = Properties.Resources.image1;
0
5 / 5 / 5
Регистрация: 16.06.2013
Сообщений: 40
22.06.2013, 00:24
оу-оу-оу, 200 PictureBox'ов... а не слишком ли много? Может проще заранее сделать графические тайлы всех кораблей, а потом просто один раз их нарисовать на единственном PictureBoxе и потом отмечать попадания?
0
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
22.06.2013, 07:41  [ТС]
@canopen, в какой место программы надо писать Ваш кусок? И нужно что-то ли еще? Объясните пошагово, пожалуйста. Просто я только начинаю работать в Windows Forms, и еще не имею опыта работы с ней, а практику учебную задали в ней делать. Вставил вот так - выдает 39 ошибок аж.
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
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            this->label_player = (gcnew System::Windows::Forms::Label());
            this->label_computer = (gcnew System::Windows::Forms::Label());
            this->pole_player = (gcnew System::Windows::Forms::TableLayoutPanel());
            this->pole_computer = (gcnew System::Windows::Forms::TableLayoutPanel());
            private: PictureBox[,] pictureBoxes = new PictureBox[10, 10];
            this->SuspendLayout();
            
            
            pole_player.ColumnCount = 10;
            pole_player.RowCount = 10;
 
            for (int y = 0; y < 10; y++)
                {
                for (int x = 0; x < 10; x++)
                    {
                    var pictureBox = new PictureBox();
                    pictureBoxes[y, x] = pictureBox;
                    pole_player.Controls.Add(pictureBox);
                    }
                }
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
22.06.2013, 09:42
Нет, нет, файл Form1.Designer.cs даже и не думайте трогать - он создается каждый раз автоматически и даже если вы в нем что-то и измените, то эти изменения потеряются. Вам нужен файл Form1.cs (для его редактирования в дизайнере в контекстном меню формы выберите "View Code"). Ну и кстати подумайте заодно, нужны ли вам именно PictureBox'ы. Может, для начала сделать поле из ComboBox'ов чтобы пользователь мог сразу указывать клетки по которым стрелять?
0
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
22.06.2013, 10:39  [ТС]
@canopen, почему ComboBox? Может быть надо MaskedTextBox? Тогда пользователь вводит предполагаемую координату по образцу, и затем будет по ней выстрел произведен. Только я не знаю, как связать MaskedTextBox и само поле.
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
22.06.2013, 11:12
Извиняюсь, я имел в виду не ComboBox. а CheckBox конечно. Чтобы можно было выбрать клетку просто кликнув по ней.
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
22.06.2013, 11:49
Что-то вроде такого
Миниатюры
Морской бой с визуальными компонентами  
1
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
23.06.2013, 07:44  [ТС]
Т.е. создать 200 CheckBox и работать с ними?

Добавлено через 16 минут
И подскажите мне, пожалуйста, как эти все объекты связать с внутренним представлением то?
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
23.06.2013, 10:02
Да, создать 200 ChechBox. Appearance выставить в Appearance.Button, в Tag хранить Point с координатами клетки к которой относится чекбокс.
Предположим, расположение противника, как и чекбоксы, тоже хранится в массиве:
C#
1
2
private CheckBox[,] checkBoxesEnemy = new CheckBox[10, 10];
private readonly bool[,] enemyArea = new bool[10, 10];
Тогда обработчик события CheckedChanged этих чекбоксов может выглядеть так:
C#
1
2
3
4
5
6
7
8
private void CheckBoxCheckedChanged(object sender, EventArgs e)
{
    var checkBox = (CheckBox)sender;
    var point = (Point)checkBox.Tag;
    var hit = enemyArea[point.Y, point.X];
    checkBox.Checked = hit;
    checkBox.Enabled = false;
}
То есть по координатам чекбокса вы всегда можете найти внутреннее состояние. И наоборот, по координатам состояния найти соответствующий чекбокс.
0
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
23.06.2013, 10:26  [ТС]
И для каждого чекБокса нужно будет делать свой обработчик событий получается?
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
23.06.2013, 10:31
Зачем же? Одного хватит. В обработчик же передается отправитель сообщения (через параметр sender), то есть вы будете знать какой чекбокс вызвал событие. А если хранить, как я сказал, в свойстве Tag чекбокса его координаты, то и их сможете определить в обработчике.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2013, 00:04
@canopen, нафига так делать? Товарищ @starcheater правильно сказал, нужно рисовать на единственном пикчер-боксе, нефиг проблемы индейцев на шерифа перекладывать. Этож как тормозить будет, страх один. Не у всех гигабайты памяти и шестиядерные зеоны...
1
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
24.06.2013, 04:09
Тогда уж лучше к черту Windows Forms и сразу на Direct3D переходить - с аппаратным ускорением-то точно быстро все будет.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2013, 08:23
@canopen, что за ерунду вы пишете? ... Что за истерика?
0
 Аватар для MrGladus
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
24.06.2013, 12:05
Не знаю на счет двухсот pictureBox'ов, но я когда-то умудрился сделать морской бой с помощью двух dataGridView - вроде норм вышло, даже по инету работало) Вот даже я нашел вам установщик игры, мб попозже найду исходники то кину вам.
Вложения
Тип файла: rar Морской Бой1.rar (1.63 Мб, 281 просмотров)
2
 Аватар для MrGladus
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
24.06.2013, 12:09
Вот и исходники
Вложения
Тип файла: rar BattleShips.rar (3.43 Мб, 467 просмотров)
2
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2013, 13:54
Цитата Сообщение от MrGladus Посмотреть сообщение
я когда-то умудрился сделать морской бой с помощью двух dataGridView
мсье знает толк
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.06.2013, 13:54
Помогаю со студенческими работами здесь

Морской бой
Вопрос решен, можно удалить

Морской бой, Battleship
Здравствуйте, может есть у кого реализация игры &quot;Морской бой&quot; C# win forms. Спасибо

Морской бой через DataGridView
ПОМОГИТЕ СОЗДАТЬ МОРСКОЙ БОЙ ЧЕРЕЗ DATAGRIDVIEV 1)Как заблочить изменение размеров ячейки при запуске формы 2)Как создать корабли(как...

Реализация игры морской бой
подскажите плз алгоритм написания морского боя и основные аспекты ... мои мысли : поле Как сделать поле ? что оно из себя будет...

Поле для игры морской бой
Нужно будет написать игру морской бой, хотел бы реализовать такое же поле как на скрине. Как это сделать?) Или может еще какие...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru