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

Игра морской бой - как расставлять корабли

03.05.2009, 20:18. Показов 13658. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил написать игру чтоб опыта набраться. Вот возникла проблема: в верху формы расположены 4 кнопки(4вида кораблей) и ниже расположено поле. каким способом можно размещать на таблице корабли?в смысле какой код,чтобы нажав на кнопку можно было переместить стрелочкой корабль на поле?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.05.2009, 20:18
Ответы с готовыми решениями:

Игра морской бой: никак не придумаю как лучше реализовать корабли в игре
Пишу игру "Морской бой" на c# и никак не решу как лучше реализовать в программе корабли.

Морской Бой - как организовать поле и расстановку кораблей?
Добрый времени суток, необходимо создать игру "Морской Бой", извините за то, что вопрос возможно уже был задан. Вопрос такой как создать...

Морской бой - Как сделать единый обработчик нажатий на кнопки
Сам что-то не придумал...

56
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
04.05.2009, 07:27
На какой таблице? Какой стрелочкой? Какой ответ вы хотите услышать???
0
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
05.05.2009, 08:59  [ТС]
Хочу на форме нарисовать таблицу (DrawLine или что лучше подскажите?), сделать на таблице поля привязки(как их сделать тоже не знаю). Просто знаний у меня маловато,хочу набраться опыта.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
05.05.2009, 11:39
Для начала можно не заморачиваться и делать минимально просто
В момент расстановки нужно просто нажимать мышкой на клетки поля. Если нажал левой мышкой, то считаем, что корабль ставится вертикально, а точка, куда нажали - это верхняя часть корабля. Если нажимаем правой мышкой - то горизонтально. Корабли ставятся в принудительном порядке - сначала 4-хпалубные, потом 3-х и т.п. При сбоку этом надо отображать картинку, какой тип корабля сейчас ставится.

Этот вариант для человека неудобен, но он тем не менее прост в реализации. А потом спокойно себе пиши логику игры. КОгда всё будет готово - можешь снова вернуться к технике расстановки кораблей. Когда ты миллион раз будешь расставлять их неудобным способом, у тебя у самогО в голове появится куча идей, как это делать более удобно
1
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
05.05.2009, 16:00  [ТС]
Спасибо! А как поле лучше сделать? DrawLine?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
05.05.2009, 16:06
Ну тут я не советчик, я в .NET не разбираюсь
0
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
09.05.2009, 20:51  [ТС]
такой вопрос: как в этой игре создать проверку на правильное размещение кораблей ( они не должны касаться даже углами)?
Можно ли написать простую функцию, вычитающую расстояние между Rectanglами?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.05.2009, 18:33
М... не надо ничего делать через rectangl'ы

У тебя должно быть две вещи (хз каким словом это правильно назвать):
1. Внутреннее представление игры (допустим, это массив 10 на 10, в элемент которого записан 0, если поле пустое, 1, если эту клетку занимает однопалубный корабль, 2 - если двухпалубный и т.п.). Представление может быть и другиим - ты волен выбирать так, как тебе удобнее делать
2. Пользовательское представление игры. Это то, что видит человек на экране. Всё пользовательское представление рисуется с внутреннего.

Все свои действия по проверке на пересечение, подсчёту количества живых/потомлпнных кораблей и т.п. ты делаешь на внутреннем представлении, т.к. его ты выбираешь так, чтобы на нём было максимально удобно делать эти действия из программы.

Теперь, отвечу на твой вопрос. К примеру, ты решил выбрать по внутреннее представление, которое я тебе описал. Допустим уже поставлен один корабль. Значит в твоём массиве уже заполнены элементы, отвечающие за те клетки, на которых находится твой корабль. Теперь человек ставит другой корабль. Перед тем, как "установить" корабль, ты должен во внутреннем представлении пройтись по всем клеткам, на которых будет "стоять" твой новый корабль и убедиться, что клетки не заняты (а так же не заняты соседние клетки). Если проверка обломалась - выдаёшь сообщение об ошибке и просишь поставить корабль по новой. Если проверка прошла - устанавливаешь корабль на доску - отмечаешь поля в своём массиве
0
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
22.05.2009, 09:09  [ТС]
С внутренним представлением разобрался! Теперь такая проблема: при расстановке кораблей накапливается массив из rectangles,далее я вызываю в OnPaint DrawRectangles. Вот в чем проблема: он пейнт обрабатывается при запуске проги, когда массив пуст. И при записи очередного элемента в массив приходится перерисовывать форму(вызывал Invalidate). Это явно не верный подход. Подскажите как лучше нарисовать на форме фигуры? Какую функцию использовать?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.05.2009, 11:05
Я вопрос не совсем понял. Просто у тебя есть некое промежуточное представление в виде массива. После какждого изменения состояния тебе его нужно отобразить на экреане. Проще всего не заморачиваться и всегда перерисовывать всё поле целиком (а не разбираться и пытаться перерисовывать только то, что изменилось). Сделай отдельную процедуру, которая отображает внутреннее представление на экран и дёргай её каждый раз
0
85 / 85 / 6
Регистрация: 13.10.2008
Сообщений: 144
22.05.2009, 15:11
Цитата Сообщение от alexeev Посмотреть сообщение
приходится перерисовывать форму(вызывал Invalidate). Это явно не верный подход.
Думаю, рисовать лучше все же не на форме самой, а, скажем, в picteurBox-е, и вызывать для него Invalidate().
0
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
23.05.2009, 23:52  [ТС]
С PictureBox не работал,опыта мало. Допустим передаю я функции массив ректанглов, и как этот массив отобразить в PictureBox?
0
85 / 85 / 6
Регистрация: 13.10.2008
Сообщений: 144
24.05.2009, 00:27
Ровно также как и с формой. Создайте обработчик события Paint для pictureBox, в него и поместите всю логику отрисовки.
0
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
07.06.2009, 00:59  [ТС]
Вот и готовый результат, правда еще бета версия. Позже доработаю.
Жду отзывов/предложений
Вложения
Тип файла: rar sea-fight.rar (35.5 Кб, 306 просмотров)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.06.2009, 01:22
Возможно, что данную тему народ уже перестал читать. Попробуй вот сюда: https://www.cyberforum.ru/beta-testing/
0
 Аватар для EnzoMatrix
121 / 121 / 14
Регистрация: 14.03.2009
Сообщений: 462
07.06.2009, 01:37
в принципе мне понравилось, но неудобно до жути, то что расстановку откатить нельзя, и второе то что после того как корабль противника подобьешь он вокруг пустыми метками не заполняется
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.06.2009, 12:49
Т.е. начальную часть задачи ты сделал - она работает. Теперь тебе надо проработать пользовательский интерфейс. Вообще в задачах такого уровня получается, что бОльшуя часть программы занимает хороший интерфейс.

Попробую сформулировать идеи:
- возможность переставлять корабли (просьба Картмана). Наверно одно из самых сложных вещей, которые тяжело сделать аккуратно. Так что это оставлять напоследок
- вокруг подбитого корабля поле надо как-то подсвечивать (просьба Картмана). От себа добавлю, что не надо давать стрелять в область вокруг подбитого корабля. Да и сам подбитый корабль отмечать пожирнее
- Последний выстрел надо на поле отмечать, чтобы видно было, куда последний выстрел сделал ты и куда противник
- Для порядку рисовать, сколько и каких кораблей осталось у противника. Вроде бы ненужная мелочь, но дружественный пользовательский интерфейс требует этого

Хотел что-то ещё, но забыл
0
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
07.06.2009, 17:22  [ТС]
Спасибо за совет! будет время все сделаю, ща пока сессия.
0
3 / 3 / 0
Регистрация: 10.02.2009
Сообщений: 38
09.06.2009, 13:05  [ТС]
как можно поменять в верхнем левом углу программы значек Visual Studio (или как он называется?) на свой? Работаю с VS2008. И где еще можно написать версию программы? ver 1.2.4.1 к примеру
0
 Аватар для EnzoMatrix
121 / 121 / 14
Регистрация: 14.03.2009
Сообщений: 462
09.06.2009, 13:20
жмешь на свойства формы, там есть icon, вот его и меняешь на свой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2009, 13:20
Помогаю со студенческими работами здесь

Морской бой
Вот решил написать морской бой. Как всё это сделать примерно понимаю, но вот хочу посоветоваться с вами по некоторым вопросам. 1) Как...

Морской Бой
Вопрос в том как сделать меню какоенибудь чтоб выбор в игре был пример 1-палубные и двух палобные там две три чтоб ставить можно было +...

Морской бой
Здраствуйте. Простите пожалуйста, немогли бы вы мне помочь в поиске компонента C# для реализации поля в морском бое. Никак не могу найти...

Морской бой
Ребят, а как написать код, чтоб корабли в притык нельзя было ставить?! Зарание спасибо! вот мой код(недоделаный): using System; using...

Морской бой
хочу написать игру... но если честно, то даже не знаю с какой стороны подойти и как должно это выглядеть... подскажите пожалуйста... с чего...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru