Programowanie w języku Delphi » Gotowce

Wczytywanie planszy z pliku w Delphi

<center>

Wczytywanie planszy z pliku w Delphi

</center>

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".


1111111111
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1111111111

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.



4
3
1111111111
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1111111111

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


Tworzymy byle jaką procedurę.


procedure TForm1.Button1Click(Sender: TObject);
begin

end;

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.


var
  Form1: TForm1;
  Plik: TextFile;

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).


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

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


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

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


begin
  AssignFile(Plik, 'level1.lvl');
  Reset(Plik);
end;

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


  Reset(Plik);
  Readln(Plik, X);
  Readln(Plik, Y);
end;

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


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

    Readln(Plik, Temp);
  end;
end;

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.


  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;

Jeszcze tylko zamykamy plik...


    end;
  end;
  CloseFile(Plik);
end;

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

kay 2008-01-21 23:42

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

iwonta 2008-04-07 13:04

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...

Booboo 2004-12-16 11:28

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.

T-kOrreD 2004-08-24 15:26

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 :).

Wolverine 2004-02-28 12:40

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

szatkus 2004-02-25 20:33

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

ŁF 2004-02-25 20:09

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

Wolverine 2004-02-25 17:39

Ja tam byl dal to do gotowcow.