Хочу чтобы все под рукой было
Разбейте на отдельные типы.
К примеру координаты - лучше представить в виде записи с 2 полями.
Список клеток - лучше представить записью содержащей координаты 2 концов, если я правильно понял что это морской бой. А какие клетки пробиты - всё равно надо хранить в отдельном 2-х мерном массиве. Потому что даже по пустым клеткам, в которых нет корабля - всё равно стрелять нельзя.
А по виду их групировать вообще смысла нет. Хотите следить программно каких кораблей сколько - храните у записи-корабля так же номер его типа. И ведите отдельный словарь, с ключами - номерами типа и значениями - кол-вом сколько таких осталось.
В многомерном массиве не под рукой? Ерунда какая-то…
А вообще, Вам правильно подсказывают, надо вводить разные уровни абстракции за счет типов, а лучше - классов.
Классы это если бы тут был смысл в наследовании. А тут максимум что можно придумать - это наследовать все корабли от общего типа, но для каждого типа корабля - свой класс. Но это неудобно и того не стоит.
А в остальном - записи лучше. Их и копировать проще, если сделать только List<Ship>
, где Ship
- запись-корабль, то можно копировать чисто через 1 .ToList
.
Почему?
Я примерно понял о чем Вы, попробую сначала реализацию на классах, словарями пользоваться не умею . Спасибо!
Потому что много кода, а смысла в этом мало. Всё равно, всё что отличается у разных типов кораблей - это длинна, для которой хватит 1 поля. А если через наследование - у каждого класса придётся объявить override
свойство/функцию возвращающую тип корабля. А без этого - наследование вообще бесполезно в данном случае.
Я не понял изначально, что речь идёт про морской бой)
Что там не уметь
begin
var d := new Dictionary<integer,integer>;
d[3] := 5;
d[3] -= 1;
d[3].Println;
end.
Поэкспериментируйте с этим кодом, посмотрите что показывает если написать d.
, мин 10 должно хватить чтоб со всем разобраться.
С записями в Паскале работа менее удобна, чем с классами, да и запись - по факту тот же класс.
А что вы называете типом? Ибо и класс и запись - это тип вообще то.
Наверное, type T = array[0…9, 0…9] of integer;
Ты так не шути, а то вдруг @Midel серьёзно воспримет))
P.S. А вообще, вот это очень даже вариант:
type
CellType = (Empty, Ship, Destroyed);
begin
var field := new CellType[10,10];
end.
Но только не через статичные массивы, ни в коем случае.
То же, что и все. Справка, в том числе. Да, и класс, и запись - это тип. Там описка, я хотел написать не с типами, а с записями. Поправлю
И чем же с записями работа менее удобная?
Они проще гораздо. Их проще записывать в файлы, им не нужно определять свойства (но можно), их не нужно определять и вы с ними никогда не получите NullReference.
Это вкусовщина чистейшей воды.
Так и есть, и тут тоже:
И у тех и у тех свои применения. Надо просто знать где что использовать. А вкусовщина в данном случае вообще не применима.
Я не собираюсь с Вами открывать дискуссию на тему о том, что где применять. У Вас свое мнение, у меня - свое.
Понятно, что тип клеток должен быть (пусто, корабль, выстрел), но хотелось бы уточнить, почему для задачи Морской бой в Pascal Abc . Net с фиксированными полями не следует использовать статические (заранее известные и фиксированные) массивы?
Спасибо.