Wyznaczenie ruchów gońca

0

W dziale C++ rozważamy o szachach i taka łamigłówka (bo pewnie mało osób widziało topic) do rozwiązania.
Z pozycji startowej (x, y) należy wyznaczyć końcowe punkty na które może pojechać goniec (2, 3, lub 4 wektory).
Mam coś takiego, ale wydaje mi się ze przekombinowane. Klasa Point to normalna klasa mająca x i y, oraz przeładowane operatory porównania. zmienna coord, to położenie figury.

const int Bishop::Track[4][2] = { {1, 1}, {-1, 1}, {-1, -1}, {1, -1} };
	for(int i = 0; i < 4; ++ i)
	{
		Point p(coord);
		
		p.x += Track[i][0] * 7;
		p.y += Track[i][1] * 7;
		
		while(p.x > 8 || p.y > 8)
		{
			p.x = p.x - 1;
			p.y = p.y - 1;
		}
		while(p.x < 1 || p.y < 1)
		{
			p.x = p.x + 1;
			p.y = p.y + 1;
		}
		if(coord != p)
		{
                        //istnieje wektor
		}
		
	}
0

tamto było źle, tu lepiej już :>

	for(int i = 0; i < 4; ++ i)
	{
		Point p(coord);
		
		for(;;)
		{
			int x = p.x + Track[i][0];
			int y = p.y + Track[i][1];
			
			if(x < 1 || x > NMAX || y < 1 || y > NMAX)
				break;
			else
			{
				p.x = x;
				p.y = y;
			}
		}

		if(coord != p)
		{
                       //jest
		}
2

Przenosząc szachownicę na układ kartezjański goniec może siedzieć w dowolnym punkcie od 0,0 do 8,8.Wektor ruchu jaki może wykonać jest opisany funkcjami y=x+b i y=-x+b.Ponieważ jak widzę nie wprowadziłeś rozpatrywania blokowania ruchu przez inne figury zadanie sprowadza się do znalezienia b i punktów przecięcia prostych z osiami układu współrzędnych oraz prostymi y=8 i x=8

A co tam,masz kod funkcji (nie testowany za mocno wprawdzie,ale w 3 przypadkach dał wyniki dobre)

void bishopVectors(int bishopX, int bishopY)
{
//tutaj wiadomo,trza by sprawdzić czy dostajesz współrzędne z przedziału <0, maxPos>,ale to Ty się baw w implementację Bracie ;P
#define maxPos 7
	//znalezienie b1 i b2 dla wspomnianych funkcji y = x + b i y = -x + b
	int b1 = bishopY - bishopX;
	int b2 = bishopY + bishopX;

	//wyznaczenie punktów przecięcia wektorów ruchu z krawędziami szachownicy
	//dla y = x + b1 rozpatrując "w prawo" albo przetnie y = maxPos albo x = maxPos
	//jeśli przetnie y = maxPos to równanie ma postać maxPos = x + b1
	int x1 = (maxPos - b1) > maxPos ? maxPos : maxPos - b1;//jeśli x1 wyjdzie większy od maxPos,znaczy to że przecina prostą x = maxPos
	int y1 = x1 + b1;

	//rozpatrując "w lewo" przetnie y = 0 albo x = 0
	//jeśli przecina y=0 to równaniem jest 0 = x+b1
	int x2 = -b1 < 0 ? 0 : -b1;//jeśli wyjdzie x < 0 to znak,że prosta przecina prostą x=0
	int y2 = x2 + b1;

	//teraz pora na prostą y = -x + b2
	//rozpatrując "w prawo" proste mogą się przeciąć na y = 0 albo x = maxPos
	//dla przecięcia na y = 0 równanie ma postać 0 = -x + b2
	int x3 = b2 > maxPos ? maxPos : b2;
	int y3 = -x3 + b2;

	//patrząc "w lewo" przecięcie nastąpi na y = maxPos albo x = 0
	//jeśli przecina y = maxPos to równaniem jest maxPos = -x + b2
	int x4 = b2 - maxPos < 0 ? 0 : b2-maxPos;
	int y4 = -x4 + b2;

	//jakoś se ładnie to poukładaj teraz,wypełnij jakąś tablicę otrzymanymi współrzednymi czy cuś w ten deseń
	//qDebug()<<"Punkt1("<<x1<<','<<y1<<')';
	//qDebug()<<"Punkt2("<<x2<<','<<y2<<')';
	//qDebug()<<"Punkt3("<<x3<<','<<y3<<')';
	//qDebug()<<"Punkt4("<<x4<<','<<y4<<')';
#undef maxPos
}
0

Ale to chyba i tak prościej nie będzie niż to co napisałem ?
Bo nie "widzę" Twojej odpowiedzi w oczach C++ :>

0

No dzięki, zaraz sprawdzę.
Trzeba jeszcze i tak dać warunki, jesli Biszop jest na krawędziach (wtedy mniej wektorów)

0

Heh, dodam Cie do Credits (oczywiście jak prędzej się nie wkurzę czymś)
Więc robię dalej i pewnie za jakiś czas wrócę z jakimś pytaniem...

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