102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
1 | |
Реализация игры морской бой28.05.2014, 01:54. Показов 12297. Ответов 52
Метки нет (Все метки)
подскажите плз алгоритм написания морского боя и основные аспекты ...
мои мысли : поле Кликните здесь для просмотра всего текста
Как сделать поле ? что оно из себя будет представлять ? просто расположенные картинки на поле с определенными координатами ? или может быть вставить грид, а по ячейкам распихивать картинки ? не понятно ... корабли Кликните здесь для просмотра всего текста
Как сделать корабли ? что из себя представляют корабли различного размера ? если четырехпалубник, это 4 картинки однопалубных или одна большая картинка ? если одна большая картинка, как на ней фиксировать выстрелы ? если эту большую картинку распихать по гриду (можно ли вообще так, поместить 1 картинку в 4 ячейки ?), то какой событие будет срабатывать, клик на картинку или на ячейку грида ? немного важного для меня оффтопа Кликните здесь для просмотра всего текста
После того как построим поле с кораблями ( не важно каким способом ), стоит ли создать массив, в котором будут хранится -1, 0 и 1(не доступен, свободен, занят) ? Когда создаешь вариант игры с игроком и компьютером, как отследить какой вариант принят и как организовать код, чтобы не дублировать процедуры ? Если для этого использовать флаг, то каким его лучше сделать ? Если флаг разместить в классе и тоскать его по процедурам, не нарушает ли это принципов ООП ? Как из кода не получить костыль ? Не по теме: Как спойлерам дать заголовок ?
0
|
28.05.2014, 01:54 | |
Ответы с готовыми решениями:
52
Простейшая реализация игры "Морской бой" Поле для игры морской бой Для игры компьютера в морской бой реализовать стратегию в виде дерева Аналог игры "Морской бой" |
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
30.05.2014, 22:10 | 21 |
Ура!
Там еще довольно неплохо можно оптимизировать отрисовку — все-таки код делался просто как пример, без заморочек. Например, в данный момент при каждом вызове Invalidate вся поверхность переотрисовывается полностью, если даже переотрисовать нужно последний ряд (изменение размера формы, например). Экземпляр Graphics, передаваемый в метод аргументом, "знает", что все подряд отрисовывать не нужно, но действие тем не менее происходит.
1
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
30.05.2014, 23:30 [ТС] | 22 |
kolorotur, после того, как я закончу расстановку кораблей, не могли бы вы глянуть проект, может у вас получится оптимизировать отрисовку поля
Добавлено через 13 минут kolorotur, как по нажатию кнопки отрисовать всю панель заново с внесенными изменениями ?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
31.05.2014, 00:11 | 23 | |||||
Да без проблем, цепляйте.
1
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
31.05.2014, 00:53 [ТС] | 24 |
вот что есть на данный момент
0
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
31.05.2014, 01:29 [ТС] | 25 |
для двухпалубных я разобрался, изменив метод проверки... для остальных не знаю пока-что ...
Добавлено через 28 минут появилась идея для универсальной проверки для всех размеров, чуть позже напишу
0
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
01.06.2014, 02:17 [ТС] | 26 |
игра в предконечной стадии разработки, и тут появилась новая ошибка не знаю, из-за чего, возникает, когда играешь с компом ...
Не по теме: для начала игры нажмите автогенирация - готово, дальше клацайте на поле соперника
0
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
01.06.2014, 02:25 [ТС] | 27 |
видимо, ошибка происходит, когда комп попадает в тебя ...
Добавлено через 6 минут исправил проблему, убрав рекурсию
0
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
01.06.2014, 02:44 [ТС] | 28 |
kolorotur, вы обещали по окончанию попытаться оптимизировать отрисовку поля, проект уже готов, гляньте плз, так же может у вас получится сделать взрывы корабликов(типо когда взрывается двухпалубный, например, то соседнии от него клетки, закрашиваются в цвет промоха)
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
01.06.2014, 11:44 | 29 |
Я помню
У меня дома проект не открывается, т.к. имеется только 2010-я студия. Гляну с работы во время перерыва.
1
|
C#,XNA Game Studio
36 / 36 / 8
Регистрация: 26.04.2014
Сообщений: 195
|
|
01.06.2014, 12:04 | 30 |
методы проверки по матрице по матрице по-моему достаточно просты скажем каждый элемент матрицы кроме координат икс и игрик имеет поле статуса, 0 -незанято,1- однопалубный,2-двупалубный, и так далее, плюс к этому нужно указать идентификатор корабля чтобы сослаться на него. Параллельно с этим список кораблей должен быть, List<List<Point>>, тоесть у каждого корабля список точек которые обозначают координаты клеток в матрице, но сюда кроме поинтов нужно добавить статус к каждой точке жив/мертв, и еще такой же статус ко всему кораблю, значит нам еще и количество оставшихся в живых клеток нужно каунтить для каждого корабля пр попадании.Помоему так проще..)наверное..)
1
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
01.06.2014, 14:01 [ТС] | 31 |
kolorotur, чтобы с 2010 студии открывалось, нада просто фреймворк 4.5 поставить
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||||||||||||
01.06.2014, 19:44 | 32 | |||||||||||||||
Глянул.
Перво-наперво, оптимизация отрисовки. Вот код обработчика Paint:
Поставьте панельке свойство BorderStyle на FixedSingle — не придется вручную еще и рамку рисовать. Я, правда, так и не увидел, где вы сохраняете координаты предыдущего квадрата, чтобы переотрисовывать только при смене ячейки. Нет смысла постоянно рисовать ячейку, если возить мышкой в пределах ее границ. Добавил такое в класс Battle:
Общие соображения: 1. Не ленитесь давать элементам управления нормальные имена, потому что разбираться во всех этих button1 и checkbox5 очень скучно. 2. Цепляйте один и тот же обработчик на событие Paint обеих панелек — нет смысла копировать один и тот же код. 3. Старайтесь сразу же избавляться от т.н. "китайского" кода — это когда вместо циклов используется дублирование кода, что у вас очень бодренько наблюдается в классе Battle. Потому как вот такой метод читать решительно невозможно, не говоря уже о том, чтобы его понять: 18+
1
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
01.06.2014, 21:12 [ТС] | 33 |
а можно как-то избежать ошибки, при обращении к несуществующей ячейке и продолжить выполнение следующего кода ?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
02.06.2014, 00:27 | 34 |
Fene4ka_, конечно можно — надо всего лишь проверять, чтобы текущий индекс не выходил за пределы массива.
Вообще проверку же сделать очень просто: корабль — это прямоугольник с определенными длиной и шириной, измеряемыми в ячейках поля. Например, трехпалубник по горизонтали — это прямоугольник в 1х3 ячеек. По вертикали — 3х1. Так как нельзя, чтобы корабли соприкасались, то накиньте еще по две клетки на ширину или высоту, получится 3х5 по горизонтали или 5х3 по вертикали. Если какая-то из координат лежит у границы поля, то с той стороны отнимите единицу, т.е. вертикальный трехпалубник в колонке А будет иметь размер (для проверки) 5х2 ячеек. Он же в колонке Б и в ряду 1 будет 4х3, в колонке А в первом ряду — 4х2. Разобравшись с этим, достаточно в цикле пробежать по ячейкам, образованным этим кораблем. Если в массиве на этом месте уже есть хотя бы одна занятая ячейка, то корабль там разместить нельзя.
1
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
||||||
02.06.2014, 02:57 [ТС] | 35 | |||||
kolorotur, ту страшную процедуру получилось переделать в такую )))
12+
Добавлено через 46 минут а также упростил 60% кода, исправил отрисовку, чтобы теперь обновлялся только прямоугольник, где кораблик ... Добавлено через 15 секунд kolorotur, где вы раньше были с своим советом ...
0
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
02.06.2014, 03:24 [ТС] | 36 |
скидываю, что получилось
0
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
02.06.2014, 03:31 [ТС] | 37 |
из побочных эффектов, программа стала ощутимо медленнее работать, вопрос о взрывах кораблей остается открытым
Добавлено через 44 секунды Не по теме: после переименования кнопок, имена их событий не переименовались, можно их как-то автоматом переименовать ? :) Добавлено через 3 минуты WhiteMaster, к сожеление на данный момент, матрица имеет след координаты - координаты
0 - клетка не занята 1 - клетка временно резервируется для отображения кораблика при формировании поля 2 - клетка занята ячейкой кораблика 3 - попадание 4 - промах Добавлено через 1 минуту Не по теме: возьму уроки создания не костыля :)
0
|
C#,XNA Game Studio
36 / 36 / 8
Регистрация: 26.04.2014
Сообщений: 195
|
|
02.06.2014, 09:36 | 38 |
Fene4ka_, есть такая вещь XNA Game Studio, как раз для написания игр на си шарпе http://www.microsoft.com/en-us... x?id=23714
1
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
02.06.2014, 11:46 | 39 | |||||
Как насчет такого варианта?
То же самое что в коде выше, только проверять, что квадрат пустой и вместо возврата его метить как отстрелянный. Добавлено через 3 минуты Правым кликом на имени метода, Refactor -> Rename
1
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
02.06.2014, 13:13 [ТС] | 40 |
что это такое ?
Добавлено через 3 минуты kolorotur, для того, чтобы это работало со взрывами, туда нада отправить координаты, а также размер отстреляного корабля, из-за этого может быть неоднозначно ...
0
|
02.06.2014, 13:13 | |
02.06.2014, 13:13 | |
Помогаю со студенческими работами здесь
40
Разработка класса "Корабль" для игры "Морской бой" Морской бой Морской бой Морской бой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |