Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Морской Бой консольный, структура данных.


Автор: LeSagra 2.11.2011, 19:03
Здравствуйте! курс подходит к концу и нужно сдавать программки ((: я непрошу чтобы вы мне ее написали, просто помогите чисто теоретически, пишу я на языке Picky некому он незнаком, препод его написал сам... он у нас такой - странный.
В чем заключается задача:
Нужно написать консольный морской бой, где все будет 2 игрока и у каждого по полю 10х10, и на каждом из полей корабли, 2 х 3Палубных, 3 х 2Палубных и 15 х 1Палубных. Координаты где ставить корабли будут считаться из файла данные.тхт, и потом координаты выстрелов также будут считаться оттуда, но на данном этапе "разработки" проблема вот в чем: не могу решить как лучше записывать корабли:

Вариант 1: инфа в каждой ячейке. будут пустые ячейки с таки миже регистрами(препод неразрешает пользоватся  регистрамы с вариантными записями.
ТипКорабль рекорд
    утоплен: булеан;
    подбитый: булеан;
    кординатыкорабля: ТипКорординаты; *массив с 2 ячеек в каждой из них еще один массив из 2 ячеек для записи координат начала и конца корабля*
енд рекорд;

ТипЯчейка рекорд
    скрыто: булеан;
    вода: булеан;
    корабль: ТипКорабль;
енд рекорд;

Вариант 2:
поле не имеет никакого отношения к кораблям  для них отдельный ссылочный тип, где будут висеть все корабли и по выстрелу буду проверять каждый из них, но так мне кажется очень долго искать будет, даже если оптимизировать что убитые уже корабли в конец слаживать и в них не искать, тогда в таком формате проверять что рядом нет корабля при постройке поля будет как то "геморно"?

3й Вариант:
Ваш вариант.


В конце программа должна на печатать что то вроде этого:
 1 2 3 4 5 6...
1####УУУ#
2##В#####
3###ПП###
4########
В - Вода(попал в воду)
П - Попадание в корабль
У - Корабль утоплен.

Да и подскажите все что можете,   я тут прочитал что лучше сделать ранг 12х12 для проверки принадлежности корабля к рангу, но игровое поле только 10х10, вещи в таком духе

п.с: если гдето видите лагуны в описании то пишите, допишу.

Автор: миг 6.11.2011, 11:07
Цитата(LeSagra @  2.11.2011,  19:03 Найти цитируемый пост)
В конце программа должна на печатать что то вроде этого:
 1 2 3 4 5 6...
1####УУУ#
2##В#####
3###ПП###
4########
В - Вода(попал в воду)
П - Попадание в корабль
У - Корабль утоплен.

Когда я делал такую игрушку. Создавал  двух мерный массива целых чисел в них цифра 0 -означала пустую клетку(вода). 1 - одна клетка корабля, 2- попадание в корабль. убит или попадание в корабль определял условием: "если вокруг(по вертикали и горизонтали) цифры 2 больше нет цифр 1, то убит, в противном случае ранен".  Создавал дополнительный массив в котором отмечал выстрелы в этом массиве и цифро -0 означает ячейка уже проверена по ней стрелять не надо. цифра 1 означала убитый, 2 раненый корабль, цифра 3 означала ячейки по которой еще не стреляли. Такие же 2 массива создавал для второго игрока. У меня индексы в массиве это и есть координаты расстановки кораблей и координаты  для выстрелов. Еще делал рандомную расстановку кораблей в начале игры. Логика выстрелов вначале рандомная, потом в зависимости от ранил или убил начинал обстреливать ячейки вокруг раненого корабля.. и еще после уничтожения корабля нужно было вокруг него отметить ячейки по которым уже не надо стрелять.

Добавлено @ 11:13
Цитата(LeSagra @  2.11.2011,  19:03 Найти цитируемый пост)
Нужно написать консольный морской бой, где все будет 2 игрока и у каждого по полю 10х10, и на каждом из полей корабли, 2 х 3Палубных, 3 х 2Палубных и 15 х 1Палубных

у меня еще присутствовал 1х 4 палубный.. и 4 х 1 палубных.. но это не столь важно. Главное, чтобы корабли умещались на  поле и разделялись пустой клеткой))

Автор: maxdiver 6.11.2011, 18:03
Если бы я реализовывал такое, то сделал бы гибрид варианта 1 и варианта 2.

Т.е. каждый корабль хранится в виде отдельной структуры в некотором массиве. А поле представляет собой двумерный массив, каждая клетка которого хранит указатель на корабль, стоящий в этой клетке, или nil - если в этой клетке ничего не стоит.

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

Автор: LeSagra 7.11.2011, 11:05
Цитата(maxdiver @ 6.11.2011,  18:03)
maxdiver
Если бы я реализовывал такое, то сделал бы гибрид варианта 1 и варианта 2.

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

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

п.п.с. может я немножко запутался, расскажите детальности. 
Спасибо smile)

Автор: maxdiver 8.11.2011, 12:12
Я вижу себе это так.
Есть запись "Корабль", у которой есть такие поля:
  •  длина корабля (палубность)
  •  координаты самой левой верхней клетки корабля на поле
  •  сколько клеток живых осталось у корабля

Есть двумерный массив "Поле", каждая ячейка которого - запись "Клетка поля" с полями:
  •  указатель на запись "Корабль" (если он равен nil, то, значит, в этой клетке пусто)
  •  флаг, били в это поле уже или нет

Автор: LeSagra 8.11.2011, 12:34
а если после конфигурации поля, тоесть выстроить динамический список кораблей и потом от сортировать их, то запись в масиве поле (указатель в памяти) уже будет неверным, да?

Добавлено через 5 минут и 56 секунд
тоже нужно проверять был ли выстрел раньше в ячейку, наверно записать корабль как ранг не получится, препод дает координаты выстрелов в файле и как попало, если 2 раза в одно и то самое место нужно игнорировать, а если в ранг корабля то можно весь корабль убить стреляя в одно точку, конечно можно прогонять через уже выстрелившие координаты(отдельный массив) но думаю долго так каждый рас, как то не оперативно. посоветуете записывать корабль ячейками??

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)