Wczytywanie planszy z pliku w Delphi

szatkus

Wczytywanie planszy z pliku w Delphi

</span></p>

Jeśli będziesz robił kiedyś grę w Delphi, może będziesz chciał wczytywać plansze z plików. I właśnie o tym będzie niniejszy text.

To na początek ustalmy, że ta "niby gra" będzie o jakimś ludku chodzącym sobie po planszy. Najpierw robimy planszę w powiedzmy pliku "level1.lvl".

<tt>1111111111
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1111111111</tt>

Bardzo obrazowe:-) Plansza ma wielkość 10X10, 1 to "ściany", a 0 to wolne pola. Oczywiście możemy wprowadzić o wiele więcej oznaczeń (0-9, A-Z, a-z i inne). Przed tym ciągiem możemy zawrzeć inne informacje, np. szerokość planszy. My jednak napiszemy tu pozycję startową Ludka.

<tt>
4
3
1111111111
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1111111111</tt>

I Ludek będzie startował z pola 4x, 3y. Ok, teraz przchodzimy do Delphi, tu będziemy odczytywać plik.

Tworzymy byle jaką procedurę.

<tt>procedure TForm1.Button1Click(Sender: TObject);
begin

end;
</tt>

O właśnie. Do odczytania pliku będą potrzebne odpowiednie zmienne, więc przechodzimy do sekcji var i dodajemy zmienną TextFile, która będzie nam potrzebna do odczytu pliku.

<tt>var
  Form1: TForm1;
  Plik: TextFile;</tt>

Na wszelki wypadek tłumaczę, że zmienna Form1 to zmienna formularza. No to jeszcze potrzebujemy zmiennych do przechowywania informacji o planszy (najlepiej tablica Boolean) i pozycji startowej Ludka (dwie zmienne typu SmallInt, dla oszczędności pamięci).

<tt>var
  Form1: TForm1;
  Plik: TextFile;
  Plansza: Array[1..10, 1..10] of Boolean;
  X, Y: SmallInt;</tt>

Jeszcze tylko w procedurze Button1Click tworzymy zmienną lokalną Temp typu String[10] oraz i i t typu SmallInt, potem zobaczysz po co nam ona.

<tt>procedure TForm1.Button1Click(Sender: TObject);
var
  Temp: String[10]</b>;
  i, t: SmallInt;
begin</tt>

No to teraz bierzemy się do programowania. Najpierw otwieramy plik i zaczynamy odczyt.

<tt>begin
  AssignFile(Plik, 'level1.lvl');
  Reset(Plik);
end;</tt>

Nie muszę chyba tłumaczyć składu i działania tych procedur? Dobra, to teraz odczytujemy pozycje startowe.

<tt>  Reset(Plik);
  Readln(Plik, X);
  Readln(Plik, Y);
end;</tt>

Teraz zacznie się zabawa:-] Więc plansza ma rozmiary 10X10, więc stwórzmy pętle, która odczyta wszystkie 10 linijek.

<tt>  Readln(Plik, Y);
  for i:=1 to 10 do
  begin

    Readln(Plik, Temp);
  end;
end;</tt>

Teraz musimy przy pomocy polecenia Copy odczytać po jednym znaku i jeśli będzie to 1 ustawić wartość w tablicy na true, a jeśli 0 to na false.

<tt>  for i:=1 to 10 do
  begin

    Readln(Plik, Temp);
    for t:=1 to 10 do
    begin
      if Copy(Temp, t, 1)='1' then Plansza[i][t]:=true
      else Plansza[i][t]:=false;
    end;
  end;</tt>

Jeszcze tylko zamykamy plik...

<tt>    end;
  end;
  CloseFile(Plik);
end;</tt>

Teraz informacje leżą grzecznie w tablicach i od ciebie zależy jak je wyświetlisz na ekranie. Powodzenia

Tip: Jeśli chcesz naprawdę oszczędzić pamięć możesz zastąpić SmallInt własnym typem w zakresie 1..10.

8 komentarzy

Powie mi ktoś jak zapisać coś do wybranej lini pliku tekstowego?

A ja mam pytanko czy ktoś się orjętuje w programie Delphi bo ja musze zrobić program typu gry w pamięć ale nie kapuje tego programu...

T_kOrreD ma rację do edycji trzeba oddzielny program poza tym
bawiłem się w to niedawno i powiem że przydało by się pakować plik bo w jednym pliku można zmieścić kilka plansz i wcale nie trzeba szukać znaku końca planszy wystarczy liczyć jej elementy (wtedy na początku planszy umiszczamy informacje o rozmiarze planszy) jednak przy takim rozwiązaniu nic oprucz plansz nie wepchniesz do pliku.

Ja tam bym użył TFileStream:

Plik := TFileStream(itd...)
Plik.ReadBuffer(Plansza,SizeOf(Plansza));
(wczytywanie pozostałych danych)
Plik.Free;

Gorzej z edytowaniem plansz, bo trzeba napisać oddzielny program. Ale to chyba lepze niż babranie się w notatniku :).

hmm troche malo tego. Poza tym watpie, zeby ktos kto nie potrafi bawic sie TextFile zdolal ta mape wygenerowac/narysowac/zrobic cokolwiek z tablicy ;-)

Dobra, Nie kategorujcie tego tylko ocencie jako gotowca, czy coś innego:-)

dokładnie, precz z tym z działu artykuły

Ja tam byl dal to do gotowcow.