Wyznaczenie ruchów gońca

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 6x, ostatnio: MasterBLB, 2018-09-05 07:34
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

Liczba odpowiedzi na stronę

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