pomoc v pascale, asi pomocou rekurzie by sa to dalo spravit.

Programovacie jazyky, rady, poradňa...
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

pomoc v pascale, asi pomocou rekurzie by sa to dalo spravit.

Príspevok od používateľa retsil »

zdar mam taky problem, vsetko je vysvetlene na obrazku, za akukolvek pomoc vopred dik!!
Prílohy
needhelp.JPG
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Neviem, či sa aspoň trochu vyznáš v C. Momentálne nemám Pascal , takže som to urobil v C. Dôležitá je funkcia fill. (ak sa v tom nebudeš orientovať, môžem sa pokúsiť prerobiť to do Pascalu)

Kód: Vybrať všetko

#include	<stdio.h>

#define SIRKA	10
#define	VYSKA	10

int		pole[SIRKA][VYSKA];

void init(void)
{
	int		i, j;

	for (i = 0; i < SIRKA; i++) {
		for (j = 0; j < VYSKA; j++) {
			pole[i][j] = 0;
		}
	}

	pole[1][2] = 1;
	pole[2][2] = 1;

	pole[0][3] = 1;
	pole[1][3] = 1;
	pole[2][3] = 1;

	pole[2][4] = 1;
	pole[3][4] = 1;

	pole[1][5] = 1;
	pole[2][5] = 1;
	pole[3][5] = 1;
}

// x,y - poloha bodu, od ktoreho zacneme vyplnat
// c1 - farba policok, ktorym budeme menit farbu
// c2 - nova farba policok
void fill(int x, int y, int c1, int c2)
{
	// skontrolujeme, ci je spravna poloha; ak nie vyskocime z funkcie
	if (x < 0 || x >= SIRKA || y < 0 || y >= VYSKA)
		return;

	// skontrolujeme, ci je na aktualnej pozicii spravna farba; ak nie vyskocime z funkcie
	if (pole[x][y] != c1)
		return;

//	printf("%ix%i - %i:%i\n", x, y, c1, pole[x][y]);

	// pole vyplnime novou farbou
	pole[x][y] = c2;

	fill(x-1, y, c1, c2);
	fill(x+1, y, c1, c2);
	fill(x, y-1, c1, c2);
	fill(x, y+1, c1, c2);
}

int main(void)
{
	init();
	fill(2, 4, 1, 2);
}
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

fuuu, vazne dik za pomoc, ale C mi neni az take blizke :( keby si sa to teda pokusil prerobit do pascalu? alebo aspon mi nak pomoct ako na to, ta matica bude mat 10x16 policok... mmm ale vazim si pomoci, dik moc, ak-tak tak by som to niekomu poslal kto vie C aby mi to pomohol spravit do pascalu...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

NETESTOVANÉ

Kód: Vybrať všetko

const
  SIRKA = 10;
  VYSKA = 16;

var
  plocha: array[0..SIRKA-1, 0..VYSKA-1] of Integer;
  
procedure fill(x, y, c1, c2: Integer);
begin
	if x < 0 OR x >= SIRKA OR y < 0 OR y >= VYSKA then
		return;
	if (pole[x,y] <> c1) then
		return;
	pole[x,y] := c2;
	fill(x-1, y, c1, c2);
	fill(x+1, y, c1, c2);
	fill(x, y-1, c1, c2);
	fill(x, y+1, c1, c2);
end;
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

keby si mi aspon tuto cast dokazal dako vysvetlit?

// printf("%ix%i - %i:%i\n", x, y, c1, pole[x][y]);

// pole vyplnime novou farbou
pole[x][y] = c2;

fill(x-1, y, c1, c2);
fill(x+1, y, c1, c2);
fill(x, y-1, c1, c2);
fill(x, y+1, c1, c2);
}

int main(void)
{
init();
fill(2, 4, 1, 2);
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Pozri si tú verziu v Pascale, ak to nepochopíš, napíš. :) (pokúsim sa ti to vysvetliť)
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

jj je to ok, ale problem je v tom ze to musim robit v starom pascale 7.0 a tam funckia fill nie je :? je tam dake fillchar a tak, ale hento nie
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Veď ja som tam dal (naprogramoval) funkciu fill (ak chceš, môžeš to meno zmeniť). V tej funkcii fill sa volá funkcia tá istá fill. (ak funkcia volá samú seba, volá sa to rekurzia) (v Pascalovsej terminológii je to procedúra a nie funkcia)
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

no jasneee, boha ja som sulin :oops: idem to teda otestovat.. vopred diikes moc!!!! dam vediet ci to fachci alebo nie :)
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

viesco ma to taku mensiu chybicku, neprejde to cez tento prvy riadok fill(x-1, y, c1, c2);
stale vlastne sa posuva iba tym smerom.... :?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Najskôr sa to bude posúvať smerom hore. Keď sa narazí na nesprávnu farbu, alebo už sa niet kam posúvať, smer sa zmení.
Ako si nastavil to pole pole? S akými parametrami si zavolal tú funkciu fill?
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

tak na zaciatku mam toto

Kód: Vybrať všetko

repeat
  kde_je_mys(x,y);
  x:=(x-15) div 20;
  y:=(y-110) div 20;
  farba:=pole[x,y];
until left;
klik(x,y,farba);
mam to v grafike, takze vlastne zistujem na ktore policko som klikol a potom prejdem do tej precedury klik

Kód: Vybrať všetko

procedure klik(px,py,pf:integer); //px,py:suradnice; pf:farba
begin
  if (px>=1)and(px<=10)and(py>=1)and(py<=16) then begin // ci sa nachadzam vobec v tej matici
   if pole[px,py]=pf then pole[px,py]:=256; // ak sa rovna farba, tak to zmeni na farbu 256
    klik(px,py-1,pf);
    klik(px+1,py,pf);
    klik(px,py+1,pf);
    klik(px-1,py,pf); 
  end;
end;
chapes ze ono to stale bude tu proceduru posuvat hore...mmm ale mam tam chybu, o tom viem a mozno uz aj tusim ako ju odsrtanim, tam treba este daku podmienku, ze ak to neni ta farba nech to posunie do ineho smeru
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Kód: Vybrať všetko

if pole[px,py]=pf then pole[px,py]:=256; // ak sa rovna farba, tak to zmeni na farbu 256
zmeň na

Kód: Vybrať všetko

if pole[px,py] <> pf then return; 
pole[px,py]:=256; // ak sa rovna farba, tak to zmeni na farbu 256
(lebo s tým tvojim by sa to naozaj opakovalo do nekonečna)
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

jj uz som to zmenil, ale je zaujimave, ze mi to funguje, ale vobec nie tam kde kliknem, ale spravi mi to inu cast tej matice :idea: a pritom suradnice x y tam mam v poriadku...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ako máš nadefinované to pole? Nebude problém v tom, že pole je od 0 a pri volaní tej funkcie klik sú parametre od 1 (alebo naopak)?
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

nie nie, potom ked mam proceduru vypln ktora mi to prekresli, tak som tam mal prehodene parametr i j...takze teraz to uz vlastne ide...ale potreboval by som este dat ochranu, ze ked nema okolo seba tu istu farbu, tak to neprekresli... ale robi mi tu aj dake haluze ako napriklad, ze ten moj tvar mi prekresli ok, ale pri tom prekresli este aj nieco ine (ale nie vzdy), musim tam dat dake ochrany na tie suradnice...
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

pocuj a vies co mi to robi? vyplni mi to ten obrazec, ale ak sa v celej matici nachadza presne taky isty obrazec tej istej farby, tak ho vyplni tiez...a celkovo mi daako cudne otaca tu maticu, a neviem preco :?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Daj sem celý program (PAS súbory zbaľ do rar, a vlož to sem ako prílohu).
retsil
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 293
Registrovaný: 01 jan 2006, 16:02
Bydlisko: ČSR
Kontaktovať používateľa:

Príspevok od používateľa retsil »

pockaj uz viem cim to je! ten hnusny pascal NESPRAVI vobec nic nahodne! lebo do tej matice davam nahodne cisla pomocou random, ale predtym mam aj randomize, takze nechapem... lebo som si na tom obrazku vsimol, ze ono sa to opakuje :evil:
Napísať odpoveď