Nadpisywanie się danych w tablicy rekordów.

0

Witam, mam taki problem, jak w temacie że nadpisują mi się dane w tablicy rekordów. Pisze sobie grę dla zabawy i ćwiczenia [rozgrywa toczy się poprzez wpisywanie komend]. W grze będzie można zbierać przedmioty które są zapisywane w w plecaku [tablica rekordów]. Problemem jest to, że gdy gracz zbierze przedmiot, to wszystkie pozostałe przedmioty które miał w plecaku zamieniają się w ten który właśnie zebrał.

Dla przykładu:
1. Znajdujesz przedmiot Grabie

(konsola)
Statystyki:
Oranie Pola: 10
Bicie sąsiada: 5

2. Zabieram przedmiot
3. Sprawdzam plecak:

(konsola)
IDX Przedmiotu: 0
Nazwa: Grabie
Oranie Pola: 10
Bicie sąsiada: 5

4. Idę dalej
5. Znajdujesz przedmiot łopata
6. Zabieram przedmiot
7. Sprawdzam plecak:

(konsola)
IDX Przedmiotu: 0
Nazwa: łopata
Oranie Pola: 0
Bicie sąsiada: 0
IDX Przedmiotu: 1
Nazwa: łopata
Oranie Pola: 0
Bicie sąsiada: 0

Kody źródłowe:
TYPE, VAR, itd

CONST
  maxitem_bp = 101;

TYPE
  bp_record =
    record
    bp_item_name : string;
    bp_item_hp : integer;
    bp_item_mp : integer;
    bp_item_atk : integer;
    bp_item_def : integer;
    bp_item_sp : integer;
    bp_item_xp : integer;
  end;
  bpDB = array[0..maxitem_bp - 1] of bp_record; {Tablica z rekordami}

VAR
  bp_t : word;
  bp_list : bpDB;
  1. Znalezienie przedmiotu
procedure item_p;
begin
  if tab[x, y] = 5 then
  begin
    random_item_p;

    writeln('Znalazles ', item_name, ' !');
    writeln('Chcesz go zebrac[zbierz] czy zostawic[zostaw] w spokoju?');
    readln(wez);
    if wez = 'zbierz' then
    begin
      dodaj_item_bp_p;
      tab[x][y] := 0;
    end;
  end;
end;
  1. Dodanie do plecaka
procedure dodaj_item_bp_p;
begin
  if (bp_t < maxitem_bp) then
  begin
    Inc(bp_t);
    WriteLn;
    wczytaj_item_p(bp_t - t);
  end
  else
    WriteLn('Twoj ekwipunek jest pelny - nie mozesz niesc wiecej.');
end;
  1. 'wczytaj_item_p'
procedure wczytaj_item_p(I : Word);
begin
  if (I < bp_t) then
  begin
    bp_list[I].bp_item_name := item_list[t2].item_name;
    bp_list[I].bp_item_hp := item_list[t2].item_hp;
    bp_list[I].bp_item_mp := item_list[t2].item_mp;
    bp_list[I].bp_item_atk := item_list[t2].item_atk;
    bp_list[I].bp_item_def := item_list[t2].item_def;
    bp_list[I].bp_item_sp := item_list[t2].item_sp;
    bp_list[I].bp_item_xp := item_list[t2].item_xp;
  end;
end;
  1. Wyświetlenie zawartości plecaka
{WCZEŚNIEJ JEST PĘTLA KTÓRA POWTARZA CZYNNOŚĆ X RAZY}
procedure wypisz_bp_p(I : Word);
begin
  if (I < bp_t) then
    with bp_list[I] do
    begin
      Writeln(' ', I, '. ');
      Writeln('Nazwa      : ', item_name);
      Writeln('HP bonus   : ', item_hp);
      Writeln('MP bonus   : ', item_mp);
      Writeln('Atk        : ', item_atk);
      Writeln('Def        : ', item_def);
      Writeln('SP         : ', item_sp);
      Writeln('XP bonus   : ', item_xp);
      WriteLn;
    end;
end;

Jakieś pomysły?

0

problem w:
{WCZEŚNIEJ JEST PĘTLA KTÓRA POWTARZA CZYNNOŚĆ X RAZY}

0

mmm, to jak w takim wypadku będę mógł wyświetlić zawartość tablicy niż za pomocą takiej pętli:

procedure pokaz_bp_p;
var
  I : Word;
  bp_i : string;

begin
  if bp_i = 'wyswietl' then
  begin
    for I := 0 to maxitem_bp do
      wypisz_bp_p(I);
  end;
end;
0

Wyjaśnij jeszcze skąd się bierze "t" w:
wczytaj_item_p(bp_t - t);
oraz skąd się bierze t2 w:
bp_list[I].bp_item_name := item_list[t2].item_name;
Gdzie się zmianie bp_i w procedurze pokaz_bp_p;

Czemu nie zrobisz:

procedure pokaz_bp_p;
var I : Integer;
begin
  for I:=0 to bp_t-1 do
  begin
    with bp_list[I] do
    begin
      Writeln(' ', I, '. ');
      Writeln('Nazwa      : ', item_name);
      Writeln('HP bonus   : ', item_hp);
      Writeln('MP bonus   : ', item_mp);
      Writeln('Atk        : ', item_atk);
      Writeln('Def        : ', item_def);
      Writeln('SP         : ', item_sp);
      Writeln('XP bonus   : ', item_xp);
      WriteLn;
    end;
  end;
end;
0

t - widać pozostałości po moich wcześniejszych próbach, nie ma zastosowania, bo nie powinno tam tego być
t2 - kiedy nadepniesz na odpowiednie pole na mapie jest losowany przedmiot za pomocą funkcji Randomize; t2:=Random(2) [na razie 2 przedmioty tylko są;p] po czym jest pytanie czy chce się dany przedmiot zebrać, jeśli tak to następuje owy kod z tym t2
bp_i - służy tylko do wyboru opcji, nie ma wpływu na żadną pętle czy coś

0

No to po zlikwidowaniu tego t powinno być już dobrze.

0

nah, nic się nie zmieniło;s

0

Hmm a ja się dziwię, że w ogóle Ci wpisuje. No bo masz:

procedure wczytaj_item_p(I : Word);
begin
  if (I < bp_t) then
  begin
 

a wywołujesz:

 wczytaj_item_p(bp_t)

więc bp_t = I i nigdy nie będzie I < bp_t

0

hej, sorry że tak późno odpowiadam, ale nie miałem czasu się zająć swoim projektem ostatnio. Napisałem sobie ten kod od nowa, bo faktycznie za dużo namieszane było, dzięki za wskazówki, bo tym razem bardzo pomogły przy pisaniu od nowa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1