Wczytywanie planszy z pliku w Delphi

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.