Помощь новичкам


#1998

Хочу чтобы все под рукой было :grinning:


#1999

Разбейте на отдельные типы.

К примеру координаты - лучше представить в виде записи с 2 полями.

Список клеток - лучше представить записью содержащей координаты 2 концов, если я правильно понял что это морской бой. А какие клетки пробиты - всё равно надо хранить в отдельном 2-х мерном массиве. Потому что даже по пустым клеткам, в которых нет корабля - всё равно стрелять нельзя.

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


#2000

В многомерном массиве не под рукой? Ерунда какая-то…

А вообще, Вам правильно подсказывают, надо вводить разные уровни абстракции за счет типов, а лучше - классов.


#2001

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

А в остальном - записи лучше. Их и копировать проще, если сделать только List<Ship>, где Ship - запись-корабль, то можно копировать чисто через 1 .ToList.


#2002

Почему?


#2003

Я примерно понял о чем Вы, попробую сначала реализацию на классах, словарями пользоваться не умею :roll_eyes:. Спасибо!


#2004

Потому что много кода, а смысла в этом мало. Всё равно, всё что отличается у разных типов кораблей - это длинна, для которой хватит 1 поля. А если через наследование - у каждого класса придётся объявить override свойство/функцию возвращающую тип корабля. А без этого - наследование вообще бесполезно в данном случае.


#2005

Я не понял изначально, что речь идёт про морской бой)


#2006

Что там не уметь

begin
  var d := new Dictionary<integer,integer>;
  d[3] := 5;
  d[3] -= 1;
  d[3].Println;
end.

Поэкспериментируйте с этим кодом, посмотрите что показывает если написать d., мин 10 должно хватить чтоб со всем разобраться.


#2007

С записями в Паскале работа менее удобна, чем с классами, да и запись - по факту тот же класс.


#2008

А что вы называете типом? Ибо и класс и запись - это тип вообще то.


#2009

Наверное, type T = array[0…9, 0…9] of integer;


#2010

Ты так не шути, а то вдруг @Midel серьёзно воспримет))

P.S. А вообще, вот это очень даже вариант:

type
  CellType = (Empty, Ship, Destroyed);

begin
  var field := new CellType[10,10];
end.

Но только не через статичные массивы, ни в коем случае.


#2011

То же, что и все. Справка, в том числе. Да, и класс, и запись - это тип. Там описка, я хотел написать не с типами, а с записями. Поправлю


#2012

И чем же с записями работа менее удобная?


#2013

Они проще гораздо. Их проще записывать в файлы, им не нужно определять свойства (но можно), их не нужно определять и вы с ними никогда не получите NullReference.


#2014

Это вкусовщина чистейшей воды.


#2015

Так и есть, и тут тоже:

И у тех и у тех свои применения. Надо просто знать где что использовать. А вкусовщина в данном случае вообще не применима.


#2016

Я не собираюсь с Вами открывать дискуссию на тему о том, что где применять. У Вас свое мнение, у меня - свое.


#2017

Понятно, что тип клеток должен быть (пусто, корабль, выстрел), но хотелось бы уточнить, почему для задачи Морской бой в Pascal Abc . Net с фиксированными полями не следует использовать статические (заранее известные и фиксированные) массивы?

Спасибо.