Перейти к содержимому

Фото
- - - - -

Delphi - вопросы и ответы


  • Вы не можете создать новую тему
  • Please log in to reply
2 ответов в этой теме

#1 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 396 сообщений

Отправлено 08 сентября 2014 - 17:40

Нужна помощь в работе с массивами:

Имеем:

1. Игра типа Blocks (уничтожать несколько блоков кликом, если рядом находятся несколько блоков одного цвета.)
2. Редактор уровней для игры.

Задача:

Создавать в редакторе и переносить в игру уровни.

 

[spoiler='Редактор уровней']
...

var
Form1: TForm1;
...
Mass: array of array of Byte; // Динамический массив хранящий состояние игрового поля.
MassFile: file of Byte;

...

procedure TForm1.N1Click(Sender: TObject); // Процедура сохранения массива в файл
var
i, j: Integer;
begin
SaveDialog1.Execute;
AssignFile(MassFile,SaveDialog1.FileName);
//Reset(MassFile);
Rewrite(MassFile);
for i:=Low(Mass) to High(Mass) do
for j:=Low(Mass) to High(Mass) do begin
Write(MassFile,Mass[i,j]);
end;
CloseFile(MassFile);
end;

...

procedure TForm1.N2Click(Sender: TObject); // Процедура чтения массива из файла.
var
i,j: Integer;
begin
OpenDialog1.Execute;
AssignFile(MassFile,OpenDialog1.FileName);
// Rewrite(MassFile);
Reset(MassFile);
for i:=Low(Mass) to High(Mass) do
if not Eof(MassFile)then
begin
for j:=Low(Mass) to High(Mass) do begin
Read(MassFile,Mass[i,j]);
end;
end;
CloseFile(MassFile);
end;

...

end. 
[/spoiler]

 

Массив 'Mass' двухмерный динамический, тип данных 'Byte', поле игры может быть разных размеров (11x11, 13x13, 15x15, 17x17 клеток). Очень хочется понять правильно ли я делаю запись\чтение массива файл в целом. А так же объясните пожалуйста как указать при сохранении или при чтении файла размерность сохранённого массива, чтобы когда открывался файл сохранения, в самой игре переназначать размерность согласно тому массиву что читается из файла. Т.е если в редакторе созданно поле 11x11 то в  самой игре, при чтении этого файла. сформировать массив нужной размерности и прочитать в него данные.

 


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#2 Vitalts

Vitalts
  • Постоялец
  • 1 852 сообщений

Отправлено 09 сентября 2014 - 08:29

BiHiTRiLL, создаешь record, в нем описываешь все параметры своей карты, как-то версия, размер поля, чексумм рекорда и т.д. Сперва записываешь в файл этот рекорд, потом уже саму карту. При чтении, зная размер рекорда и остается проверить лишь, что размер файла не меньше рекорда, зачитать его, проверить по чек сумм, что мы все таки имеем дело с нашими картами, проверить версию, годитсья ли используемый код для чтения этих карт, берем из рекорда размеры карты, устанавливаем длинну массива, зачитываем оставшееся из файла в массив.

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


  • 0

#3 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 396 сообщений

Отправлено 09 сентября 2014 - 09:00

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

 

[spoiler='Процедура записи']
procedure TForm1.N1Click(Sender: TObject);
var
i, j: Integer;
begin
if not SaveDialog1.Execute then exit;
 AssignFile(MassFile,SaveDialog1.FileName);
    //Reset(MassFile);
    Rewrite(MassFile);
    Write(MassFile,Box);

      for i:=Low(Mass) to High(Mass) do
        for j:=Low(Mass) to High(Mass) do begin
          Write(MassFile,Mass[i,j]);
      end;
    CloseFile(MassFile);
    Form1.Caption:=SaveDialog1.FileName;
end; 
[/spoiler]

 

Сейчас пробую на основе этого сделать чтобы всё писалось в один файл.


Сообщение изменено: BiHiTRiLL (09 сентября 2014 - 09:00 )

  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu