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.
Ja tam byl dal to do gotowcow.
dokładnie, precz z tym z działu artykuły
Dobra, Nie kategorujcie tego tylko ocencie jako gotowca, czy coś innego:-)
hmm troche malo tego. Poza tym watpie, zeby ktos kto nie potrafi bawic sie TextFile zdolal ta mape wygenerowac/narysowac/zrobic cokolwiek z tablicy ;-)
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 :).
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.
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...
Powie mi ktoś jak zapisać coś do wybranej lini pliku tekstowego?