Skocz do zawartości

Floodnik

Użytkownicy
  • Postów

    188
  • Dołączył

  • Ostatnia wizyta

O mnie

  • Płeć
    Male

Osiągnięcia Floodnik

Minor User

Minor User (4/13)

0

Reputacja

  1. A o czymś takim jak standard c++ to Szanowny Pan Adam słyszał? :> Oto jak ma wyglądać funkcja main(dwa warianty): int main() int main(int argc, char** argv) Jeśli kompilator kompiluje inne wersje, to jest to jakaś niepotrzebna pozostałość niezgodna ze standardem; mówiąc dobitniej, nie jest to element języka C++. Wysokopoziomowość jest dobra.
  2. To już podchodzi pod sztuczną inteligencję, więc materiałów powinieneś szukać pod tym hasłem. e: co powiesz na kurs po angielsku? https://www.coursera.org/course/nlp niestety nie mam pojęcia, kiedy kurs się zacznie.
  3. No to napotykamy problem: "co autor miał na myśli" :) Pierwsze, co mi przychodzi do głowy, to przed wywołaniem rekurencyjnym sprawdzić, czy dany podciąg(lewa, prawa połówka) jest już posortowany, zwyczajnie przebiegając przez niego. Jeśli tak, nie robić wywołania. Czy to rozwiązuje nasze zadanie? Nie wiem. JAKIEŚ usprawnienie to jest - w przypadku niektórych ciągów(np. dla już posortowanego ciągu zrobisz tylko jedną pętlę, wyjdzie liniowy czas, normalny mergesort by standardowo jechał wszystkie wywołania). Więc teoretycznie zadanie zostało wykonane. Choć nie znajdujemy wszystkich podciągów rosnących... To by było imo bez sensu, mogłoby nawet zwiększyć złożoność. PS. Pisząc poprzedni post nie zwróciłem uwagi na to, że to miało być usprawnienie MergeSorta, a nie dodatkowa funkcjonalność(dlatego łapałem się za głowę o co chodzi). Przepraszam :P
  4. Masz je policzyć czy wypisać? Czy może znaleźć najdłuższy?
  5. Pierwszy pomysł, korzystający z wiedzy licealnej :P Być może da się szybciej, być może po poskracaniu wyjdzie to co napisał @adam014(a być może co innego), ale przedstawię swój tok rozumowania. Nie zraź się do kiepskiego rysunku, powoli wszystko opiszę! 1) Mamy dane: x1, y1, x2, y2 - początek i koniec ściany, x0, y0 - punkt zderzenia ze ścianą, wektor v = [vx, vy] (a początek 0, 0 - początek układu współrzędnych) - prędkość kulki 2) Przeskalowuję sobie mój wektor, umieszczając go tak, by jego koniec znajdował się w miejscu zderzenia kulki ze ścianą. początek wektora: x0 - vx; y0 - vy, koniec: x0, y0. 3) Korzystamy ze wzoru na prostą, na której leżą dwa punkty(licealne, do poszukania w internecie jeśli nie znasz), otrzymujemy prostą, na której leżą x1, y1, x2, y2. Potem, korzystając z kolejnego wzoru, otrzymujemy prostą prostopadłą do niej przechodzącą przez punkt zderzenia. 4) Teraz odbijamy symetrycznie początek wektora względem naszej prostej prostopadłej - kolejny wzór licealny, może być przydatne wcześniejsze poprowadzenie prostej równoległej do naszej początkowej prostej zawierającej ścianę, bo na tej nowej prostej znajduje się docelowy koniec wektora(rysunek). Otrzymane współrzędne to koniec wektora. Początek wektora zaś to punkt zderzenia. 5) Przeskalowujemy wektor spowrotem, by jego początek pokrywał się z początkiem układu współrzędnych. To wszystko. Proponuję nie robić obliczeń na bieżąco zgodnie z powyższym planem działania, tylko wyprowadzić sobie algebraicznie ostateczne wzory na Vx, Vy(ostateczne współrzędne wektora prędkości, które nas interesują) i zobaczyć co się stanie. Unikniemy dużo niepotrzebnych obliczeń. Pozdrawiam
  6. Wygląda na to, że jednak nie - gdybyś doskonale rozumiał zasadę ich działania, nie zadawałbyś powyższych pytań. ;) Ja Ci powiem jedno - to jest Twoja decyzja! Ty tworzysz grę, Ty wybierasz. Możesz oczywiście żywcem skopiować czyjąś pracę ale w ten sposób wstrzymujesz swój rozwój, nic kreatywnego nie zrobisz. Jeśli wiesz, jak działają TCP/UDP, to pomyśl, do jakich czynności zastosować jedno, a do jakich drugie. I zrób tak, a jeśli po testach uznasz, że lepiej byłoby inaczej, zrób inaczej :)
  7. Dodam, że chcąc się do tego ustosunkować, możnaby zaczerpnąć rozwiązanie z stla - w wektorze pamięć alokowana jest "co jakiś czas", tzn. robiony jest zapas w momencie, gdy zabraknie miejsca.
  8. Przyjrzałem się nieco bliżej temu rozwiązaniu i nie ma ono zbytniego sensu. Popatrz przykładowo na to: void Delete(size_t el) { zmienna[el] = NULL; } Dane pole nie jest usuwane, "wycinane", a jedynie zerowane. Co, jeśli użytkownik struktury chciałby mieć element o wartości zero? Wtedy metoda Add(type var) rozumiałaby to tak, że to pole nie istnieje(== NULL). Oprócz tego "zmienna[el] = NULL" nie powinno się skompilować w przypadku klasy takiej jak Player. Ja użyłbym tablicy wskaźników: private: Type** zmienna; Dzięki temu będziemy w stanie odróżnić "stan" pola(istnieje bądź nie) od jego wartości.
  9. Przeciążyłeś operator dla przypadku, gdy porównujesz dwóch graczy. bool operator ==( bool zmienna ) { return true; }
  10. Floodnik

    Przeskakiwanie pętli

    Jeśli masz tylko jednego NPC, to tak jak gnysek mówił. Na samym początku definiujesz zmienną np. bool isbroken=0; W ifach dajesz break; isbroken=1; za wewnętrznym forem dajesz if(isbroken) break; Jeśli jedna globalna funkcja steruje większą ilością NPC, to sprawa jest bardziej skomplikowana. Ja bym zrobił klasę dla NPC a każdy z nich byłby obiektem, który "myśli" samodzielnie. Skoro jednak chcesz zostawić obecny sposób poruszania się, to trzeba pokombinować. Przykładowo, zrób sobię tablicę bool zmienna[][] o wielkości takiej samej, jak mapa. Wartości są ustawiane na false na początku wykonywania setmove(). W ifach dajesz dodatkowy warunek - !zmienna[a], co oznacza, że NPC stojący w tym miejscu jeszcze się nie poruszył. W momencie ruchu ustawiasz dane miejsce w zmienna[][] o współrzędnej docelowej na true. Przykładowo w pierwszym ifie dopisujesz zmienna[a-1]=true; i tak dalej.
  11. Floodnik

    Teleportacja

    Zakładam, że x, y to współrzędne gracza? Oddalają się, bo tak ich zaprogramowałeś. Na przykładzie pierwszego ifa: if (a==y+1 or a==y+2 or a==y+3 or a==y+4) ... lvl[a][b]=0; lvl[a+1][b]=2; Jeśli npc jest przesunięty od gracza o 1/2/3/4 poziomy w dół(a==y+1 itd.), to npc przesuwa się o 1 poziom w dół(lvl[a+1]=2)... Czyli jeszcze bardziej się oddala. A teleportują się dlatego, że wykonujesz pętlę. Za każdym razem, kiedy powyższe warunki są spełnione, npc porusza się. Dajesz im taką możliwość kilka razy w ciągu wykonywania funkcji setmove()...
  12. Nie mam porównania, bo uczyłem się tylko z jednego kursu - http://xion.org.pl/productions/texts/coding/megatutorial/ Od strony technicznej. Potem pozostaje nauka poszczególnych bibliotek(które będą Ci potrzebne) i różnych informatycznych zagadnień, już luźno związanych z samym językiem. Materiałów na internecie jest pełno, gdy zobaczysz w czyimś kodzie słówko, z którym się nie spotkałeś, po prostu wklepujesz je w google.
  13. struct a; struct b { a* parent; void bla( a* p ); }; struct a { int val; b* son; }; void b::bla(a* p) { p->val = 4; }; Jeśli chcesz, żeby "bla" była funkcją inline(a taką jest, kiedy definiujesz ją w środku klasy/struktury), to dopisz z przodu inline. inline void b::bla(a* p) { p->val = 4; };
  14. Kompilacja przebiega pomyślnie. Jedyne, co zrobiłem, to dodanie funkcji main. Jaka jest treść tego błędu? PS. Jeszcze coś, do czego bym się przyczepił: Po co tak? :P Trochę naokoło. Nie lepiej zrobić p->parent = this; street.push_back(p); ? No i kolejna sprawa, tak jak mówił Tymon - używaj klas. Oczywiście na upartego możesz używać struktur, tylko w odpowiednich miejscach wstaw specyfikatory private/public/protected. Chodzi o bezpieczeństwo - wszystkie elementy klasy, które mogą być prywatne, powinny takie być. Dostęp do nich udzielaj metodami.
  15. Używam Code::Blocks z kompilatorem GCC i nie ma problemów. Jeszcze przykładowy kod prezentujący, że powyższa metoda działa: //bla bla #include <iostream> using namespace std; //bla bla int main() { town a; cout << &a << endl; a.push_street(new street); cout << a.streets.back()->parent << endl; }; Konsola pokaże dwa takie same adresy.
×
×
  • Dodaj nową pozycję...