Wpis z mikrobloga

Cześć, mam pewien problem (a właściwie pytanie) czy istnieje jakiś fajny algorytm do wyznaczania prawdziwego dystansu pomiędzy dwoma punktami i na podchodzenie do nich? Chodzi o to że mam koordynaty potworka i swoje (gra jest w dwóch wymiarach) i teraz aby postać zaatakowała wymagany jest dystans 6 komórek pomiędzy nimi, dystans obliczam tak:
abs(mojex - xpotworka) + abs(mojey + ypotworka);
i teoretycznie to działa, z taką różnicą, że w grze oczywiście możemy atakować także na ukos, czyli jeżeli potwór będzie w odległości ukośnej 6 komórek, to mój kod pokaże, że dla niego to jest 12 komórek.
Sprawę podchodzenia do potworków w miarę rozwiązałem, jednak też nie do końca i pewnie okrężną drogą.
Jeśli komuś chcę się zerknąć to: http://pastebin.com/m7TYVJUz
Mam nadzieję że jest wystarczająco dużo komentarzy. :P
#programowanie #naukaprogramowania
  • 33
@morsisko: jesli mozemy atakowac na ukos to na pewno 6 komorek ukosnie to nie jest ta sama odleglosc co 6 komorek pion/poziomo (jest to sqrt(2) razy wiecej, wiec nie powinno byc mozliwosci na atak po skosie w odl wiekszej niz okolo 4 komorki (6 dzielone przez sqrt(2) i zaokraglone do liczby calkowitej w dol (floor (x)), część całkowita - jest to pewna matematyczna operacja)
@ktose:
Nad Pitagorasem myślałem, ale oczywiście nie wszystkie mooby są na ukos od mojej postaci, niektóre są w linii prostej, więc trzeba by było sprawdzać jeszcze czy da się zbudować trójkąt.
@anonim1133:
W sumie to dobra propozycja, przyznam szczerze że na to nie wpadłem, tutaj w sumie trzeba sprawdzać tylko przynależność punktu do koła :D
@plasticstone
Właśnie gra ma taki algorytm że 6 ukośnie to to samo co 6 w
@Wiktor426: Ale tak właśnie robię z tą różnicą że zamiast sqrt(pow(x,2) używam abs() co jest chyba trochę lepsze i bardziej przejrzyste, ale takie coś nie uwzględni odległości ukośnej.
@Wiktor426: Ale to nie daje takiego samego efektu?
Przykład: Moje koordynaty: 155,50
Przeciwnika: 165,80

z abs = abs(165-155) + abs (80 - 50) = 40
z sqrt(pow(x,2) = sqrt((165-155)^2) + sqrt((50-80)^2)) = 40

@plasticstone Nie mój, ale może tak miało być? :)
@morsisko:
aby uwzglednic skosne odleglosci proponuje
function [retval] = distancemanh (x1,y1,x2,y2)
min
delta = min(abs(x1-x2), abs(y1-y2));
max_delta = max(abs(x1-x2), abs(y1-y2));
retval = 14*min_delta+10*(maxdelta - mindelta);
endfunction
jest to w matlabie ale moge ci napisac w kazdym jezyku, ta funkcja zwraca odlegosc miedzy dwoma 'kratkami' na mapie, przy czym mozliwy jest ruch po skosie i w pionie i poziomie (najpierw liczymy zeby dojsc po skosie tyle ile jest mozliwe