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); beginend;</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.
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.