Poruszanie się po tablicy jak po układzie współrzędnych?

0

Witam, otóż tworze sobie dla własnej satysfakcji [i też próby nauczenia się pascala] grę, w której wszystkie polecenia [na razie] będą odbywać się za pomocą wpisywania komend. Wymyśliłem sobie że mapy po których gracz będzie się poruszał będą w postaci pliku który jest wczytywany do tablicy, następnie gracz będzie mógł ruszyć się tam gdzie wartość danego elementu jest różny od 1 [1 = ściany]. Zrobiłem program wczytujący mape, system sprawdzający gdzie może się ruszyć gracz. I teraz pojawia się problem:

Jak przypisać pozycje startową [tu indeksy danego elementu np 4,3], tj dokładnie chodzi mi o to że po znalezieniu przez program wartości 2 w tablicy [miejsce startu], nie umiem zmusić go żeby przypisał indeksy tej wartości do pozycji startowej, gdzie potem program by dalej sprawdzał gdzie mogę iść, i ew potem po moim poleceniu ruszył się tam.

kod programu:
kod pomiedzy {-----} to moja próba rozwiązania problemu, ale nie działa i nie ma sensu wg mnie:p

USES CRT,DOS,GRAPH;

const N=12; {liczba kolumn i wierszy w tablicy}

var
curposx,curposy:integer;
c2:char;
tab:array[1..N,1..N] of integer;
szukana:integer;
linja:string;
plik:text;
startposx,startposy:integer;

{********************************************************}
function PobierzLiczbe( idx : integer; linja : string):integer;
 var
 pos1,pos2,x,i : integer;
 pomoc,tmp : string;
 wartosc : integer;
begin
 pomoc:=linja;
 if pos(';',pomoc)=0 then
  begin
   PobierzLiczbe:=0;
   exit;
  end;
 for x:=1 to idx do
  begin
   pos1:=1;
   pos2:=(pos(';',pomoc));
   if pos2=0 then pos2:=999;
   tmp:=copy(pomoc,pos1,pos2-1);
   val(tmp,wartosc,i);
   PobierzLiczbe:=wartosc;
   delete(pomoc,pos1,pos2);
  end;
end;
{********************************************************}


begin
{********************************************************}
    Assign(plik,'D:\~~~~~gra1\Nowy folder\mapa.txt');
     {$I-}
      Reset(plik);
     {$I+}

for curposx:=1 to N do
 begin
  readln(plik,linja);
  for curposy:=1 to N do tab[curposx][curposy]:=PobierzLiczbe(curposy,linja);
 end;
Close(plik);
{********************************************************}

{-------------------------------------------------------------------------}
szukana:=2;
for curposx:=1 to N do
for curposy:=1 to N do
if (tab[curposx][curposy]=szukana) then
begin
writeln('Indeksy szukanego elementu : ',curposx,' , ',curposy);
curposx:=curposx;
curposy:=curposy;
writeln(curposx,' ',curposy);
end;
{-------------------------------------------------------------------------}

if (tab[curposx+1,curposy] <> 1) and (tab[curposx-1,curposy] <> 1) and (tab[curposx,curposy+1] <> 1) and (tab[curposx,curposy-1] <> 1) then
begin
writeln('N S E W');
	if (tab[curposx,curposy+1] <> 1) and (tab[curposx,curposy-1] <> 1) and (tab[curposx+1,curposy] <> 1) then
	begin
	writeln('N S E');
		if (tab[curposx-1,curposy] <> 1) and (tab[curposx,curposy+1] <> 1) and (tab[curposx,curposy-1] <> 1) then
		begin
		writeln('N S W');
			if (tab[curposx,curposy-1] <> 1) and (tab[curposx+1,curposy] <> 1) and (tab[curposx-1,curposy] <> 1) then
			begin
			writeln('S E W');
				if (tab[curposx,curposy+1] <> 1) and (tab[curposx+1,curposy] <> 1) and (tab[curposx-1,curposy] <> 1) then
				begin
				writeln('N E W');
					if (tab[curposx,curposy+1] <> 1) and (tab[curposx,curposy-1] <> 1) then
					begin
					writeln('N S');
						if (tab[curposx+1,curposy] <> 1) and (tab[curposx-1,curposy] <> 1) then
						begin
						writeln('E W');
							if (tab[curposx,curposy+1] <> 1) and (tab[curposx-1,curposy] <> 1) then
							begin
							writeln('N W');
								if (tab[curposx,curposy-1] <> 1) and (tab[curposx-1,curposy] <> 1) then
								begin
								writeln('S W');
									if (tab[curposx,curposy-1] <> 1) and (tab[curposx+1,curposy] <> 1) then
									begin
									writeln('S E');
										if (tab[curposx,curposy-1] <> 1) and (tab[curposx+1,curposy] <> 1) and (tab[curposx-1,curposy] <> 1) then
										begin
										writeln('S E W');
											if (tab[curposx,curposy+1] <> 1) and  (tab[curposx+1,curposy] <> 1) and (tab[curposx-1,curposy] <> 1) then
											begin
											writeln('N E W');
												if (tab[curposx,curposy+1] <> 1) and (tab[curposx,curposy-1] <> 1) and (tab[curposx+1,curposy] <> 1) then
												begin
												writeln('N S E');
													if (tab[curposx,curposy+1] <> 1) and (tab[curposx,curposy-1] <> 1) and (tab[curposx-1,curposy] <> 1) then
													begin
													writeln('N S W');
														if (tab[curposx,curposy-1] <> 1) then
														begin
														writeln('S');
															if (tab[curposx,curposy+1] <> 1) then
															begin
															writeln('N');
																if (tab[curposx+1,curposy] <> 1) then
																begin
																writeln('E');
																	if (tab[curposx-1,curposy] <> 1) then
																	begin
																	writeln('W');
																	end;
																end;
															end;
														end;
													end;
												end;
											end;
										end;
									end;
								end;
							end;
						end;
					end;
				end;
			end;
		end;
	end;
end;
end;

c2:=readkey;

end.
 

oraz zawartość pliku mapa.txt:

0;1;1;1;1;1;0;0;0;0;0;0
0;1;0;0;0;1;0;0;0;0;0;0
0;1;0;1;0;1;0;0;0;0;0;0
0;1;2;1;3;1;0;0;0;0;0;0
0;1;1;1;1;1;0;0;0;0;0;0
0;0;0;0;0;0;0;0;0;0;0;0
0;0;0;0;0;0;0;0;0;0;0;0
0;0;0;0;0;0;0;0;0;0;0;0
0;0;0;0;0;0;0;0;0;0;0;0
0;0;0;0;0;0;0;0;0;0;0;0
0;0;0;0;0;0;0;0;0;0;0;0
0;0;0;0;0;0;0;0;0;0;0;0

0 - puste pola - można po nich chodzić
1 - ściany
2 - start
3 - koniec

fragmenty kodu pomiedzy {********} nie sa napisanie przeze mnie! zeby nikt sie nie plul ze kradne czyjas prace, znalazlem to na innym forum jako rozwiazanie do innego zadania.

0

WOOOOT! :O
Coś ty tam popełnił, brrr, aż mi się przypomniała legenda o programie do rozwiązywania sudoku napisanym bez pętli :x

...
var s:string;
...
s='';
if (y>0)
  if (t[x,y-1]<>1) then s=s+'N';
if (y<maxY)
  if (t[x,y+1]<>1) then s=s+'S';
if (x>0)
  if (t[x-1,y]<>1) then s=s+'W';
if (x>maxX)
  if (t[x+1,y]<>1) then s=s+'E';
WriteLn('Mozliwe kierunki: ',s);
0

masz takie coś
curposx:=curposx;
curposy:=curposy;
jaki jest tego sens?

0
qwert napisał(a)

WOOOOT! :O
Coś ty tam popełnił, brrr, aż mi się przypomniała legenda o programie do rozwiązywania sudoku napisanym bez pętli :x

dlatego napisałem to w forum dla newbie :P

Xitami napisał(a)

masz takie coś
curposx:=curposx;
curposy:=curposy;
jaki jest tego sens?

przecież napisałem że moje rozwiązanie nie ma sensu :)

0

a ja leniwy jestem i sam łaził nie będę kiedy może komputer
http://ideone.com/353fS

0

Zapamięaj sobie pozycje startu gdzieś obok

...
// W tym  wyszukiwaniu startu
PlayerX=curposx; PlayerY=curposY;
// i podobnie dla mety
EndX=curposx; EndY=curposY;
...
while(true) do  //  nieskonczona petla
begin
  //podanie luserowi mozliwosci ruchu ( sprawdzasz sobie po PlayerX i Y )
  c= ReadKey();
  case c of
    'N': if (PlayerY>0) then PlayerY=PlayerY-1;
    'S': if (PlayerY<MaxY) then PlayerY=PlayerY+1;
    'W': if (PlayerX>0) then PlayerX=PlayerX-1;
    'E': if (PlayerX<MaxX) then PlayerX=PlayerX+1;
  end;
end;
...
if ( PlayerX=EndX) and (PlayerY=EndY)
begin
  WriteLn('Hurraa!');
  break; // zakanczamy petle
end;
0
Xitami napisał(a)

a ja leniwy jestem i sam łaził nie będę kiedy może komputer
http://ideone.com/353fS

dobra nie ogarnąłem o co ci chodzi xD ale widzę że napisałeś(?) prawie cały program który potrzebuje, cóż podpatrze w takim wypadku kilka rozwiązań, i ew się odezwę [nie, nie chcę całego programu na gotowca;p]

@Edit - edytowałem sobie twoją pętle napisaną wcześniej, i prawie wszystko działa, poza tym że niby ciągle mogę poruszać się w lewo, mimo że wg mapy powinienem móc tylko w górę. Jak pod koniec programu sprawdzam, to x i y mają odpowiednie wartości, ale w pętli tak jakby coś się mieszało. Jakieś pomysły?


.................................

szukana:=2;
for curposx:=1 to N do
for curposy:=1 to N do
if (tab[curposx][curposy]=szukana) then
begin
writeln('Indeksy szukanego elementu : ',curposx,' , ',curposy);
x:=curposx;
y:=curposy;
writeln(x,' ',y);
end;

maxy:=1;
maxx:=1;

ruch:='';

s:='';
if (y>0) then
  if (tab[x,y-1]<>1) then s:=s+'N';
if (y<maxY) then
  if (tab[x,y+1]<>1) then s:=s+'S';
if (x>0) then
  if (tab[x-1,y]<>1) then s:=s+'W';
if (x>maxX) then
  if (tab[x+1,y]<>1) then s:=s+'E';
WriteLn('Mozliwe kierunki: ',s);
writeln('gdzie chcesz isc? komenda na spr pozycji: mpoz');

readln(ruch);
if ruch='mpoz' then writeln(x,',',y);

end.
0

mrwaah

maxy:=1;
maxx:=1;

toż to bez sensu :p
MaxX jak Maksymalna Wartość Współrzędnej X, więc będzie to 11 lub 12, zależy czy indeksujesz tablicę od 0 cyz od 1.
Jeśli indeksujesz od 1 ( tab[1..x] etc ) to zmień if(y>0) na if(y>1), to samo dla x.

0

szukana:=2;
for curposx:=1 to N do
for curposy:=1 to N do
if (tab[curposx][curposy]=szukana) then
begin
writeln('Indeksy szukanego elementu : ',curposx,' , ',curposy);
x:=curposx;
y:=curposy;
writeln(x,' ',y);
end;

maxY:=12;
maxX:=12;

ruch:='';

s:='';
if (y>1) then
  if (tab[x,y-1]<>1) then s:=s+'N';
if (y<maxY) then
  if (tab[x,y+1]<>1) then s:=s+'S';
if (x>1) then
  if (tab[x-1,y]<>1) then s:=s+'W';
if (x>maxX) then
  if (tab[x+1,y]<>1) then s:=s+'E';
WriteLn('Mozliwe kierunki: ',s);
writeln('gdzie chcesz isc? komenda na spr pozycji: mpoz');

readln(ruch);
if ruch='mpoz' then writeln(x,',',y);

c2:=readkey;

end.

zmieniłem jak mówiłeś i nadal mi zwraca że mogę iść tylko w lewo, mimo że powinno być tylko w górę, już nie mam pomysłów :|

0

Ah, zamień miejscami X i Y :p
Wczytujesz plansze wierszami a pętle idą kolumnami, stąd błąd.

0

nooooooooooo, nareszcie działa :D, dzięki.
Pewnie będę się na forum odzywać z kolejnymi problemami, ale przynajmniej ten rozwiązany, dzięki jeszcze raz:)

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