Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Морской Бой консольный, структура данных. структура данных 
:(
    Опции темы
LeSagra
  Дата 2.11.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 2.11.2011

Репутация: нет
Всего: нет



Здравствуйте! курс подходит к концу и нужно сдавать программки ((: я непрошу чтобы вы мне ее написали, просто помогите чисто теоретически, пишу я на языке 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, вещи в таком духе

п.с: если гдето видите лагуны в описании то пишите, допишу.
PM MAIL   Вверх
миг
Дата 6.11.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



Цитата(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 палубных.. но это не столь важно. Главное, чтобы корабли умещались на  поле и разделялись пустой клеткой))

Это сообщение отредактировал(а) миг - 6.11.2011, 11:21
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
maxdiver
Дата 6.11.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Если бы я реализовывал такое, то сделал бы гибрид варианта 1 и варианта 2.

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

Тогда мы получаем все преимущества обоих способов: по координатам клетки на поле мы сразу можем узнать, какой корабль тут стоит, и наоборот, для каждого корабля мы знаем все его клетки.
PM MAIL WWW ICQ   Вверх
LeSagra
  Дата 7.11.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 2.11.2011

Репутация: нет
Всего: нет



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

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

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

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

Это сообщение отредактировал(а) LeSagra - 7.11.2011, 11:08
PM MAIL   Вверх
maxdiver
Дата 8.11.2011, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



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

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

PM MAIL WWW ICQ   Вверх
LeSagra
Дата 8.11.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 2.11.2011

Репутация: нет
Всего: нет



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

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

maxim1000

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.