Wyznaczenie ruchów gońca

Odpowiedz Nowy wątek
2011-07-23 18:33
Cpp
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
        }
 
    }
edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-07-23 19:05
Cpp
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
        }

Pozostało 580 znaków

2011-07-23 19:13
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
}

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 4x, ostatnio: MasterBLB, 2011-09-16 10:37
chciałeś powiedzieć od 0 do 7, albo od 1 do 8. ale myślę że podejście geometryczne to trochę "overkill". - Azarien 2011-07-23 19:26
No wiadomo,na realia informatyczne to będzie 0-7.Ale czemu overkill?Z nudów właśnie napisałem implementację,i jest ona bajecznie prosta - MasterBLB 2011-07-23 19:31

Pozostało 580 znaków

2011-07-23 19:34
Cpp
0

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

O'rly?To patrz teraz ;] - MasterBLB 2011-07-23 19:36

Pozostało 580 znaków

2011-07-23 19:47
Cpp
0

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

w mojej implementacji nie trzeba ;] algorytm sam to wykrywa i wyliczy dobrze punkty - MasterBLB 2011-07-23 19:53

Pozostało 580 znaków

2011-07-23 20:05
Cpp
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...

To odptaszkuj użyteczny post coby inni użytkowniy 4p widzieli,że temat jest rozwiązany ;) - MasterBLB 2011-07-23 20:11
Ptaszkowanie innaczej się robi,kliknij odwrócone > pod jedynką - MasterBLB 2011-07-24 12:39

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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