Dobra, znów szperałem w necie i doszedłem do wniosku, że to i tak nie pomoże bo nic w nim nie ma co by mnie interesowało a jak jest to nie potrafię tego wykorzystać.
Zacząłem robić coś co by mi w jakikolwiek sposób pomogło w zrozumieniu tej funkcji.
I zrobiłem, że gdy jakikolwiek warunek zostanie spełniony to wypluwa mi tekst do gracza.
Co wyszło? Moim zdaniem ta funkcja nie działa poprawnie.
Code:
if(a.size() > 1)
{
player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "1");
}
Gdy napiszę w grze jakąkolwiek (w sumie tylko jedną!) literkę z tego mojego zbioru to jest spełniony ten warunek. Czyli coś jest nie tak... Powinno spełniać warunek gdy ten napisany tekst będzie się składał z więcej niż jednej litery, a tu inaczej to rozpatruje. Warunek niby jest że większe niż 1 a działa na odwrót.
Dalej... Czytając post Elf'a wnioskuję iż ten warunek
asLowerCaseString(a[0]) to jest główna fraza jaka jest wyszukiwana. Zamieniłem sobie że:
Code:
if(asLowerCaseString(a[0]) == "e")
{
player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "2");
}
Gdy napiszę jedno
e, czy dziesięć
e czy jako pierwsze będzie
e lub jako ostatnie w całym zdaniu. To nigdy nie jest spełniony ten warunek. Pytanie, dlaczego?
Dalej:
Rozpatruje sobie to w taki sposób:
Code:
if(a[1] == "e")
{
player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "3");
}
Próbowałem wszystkich możliwości nigdy ten warunek nie był spełniony.
Zatem wnioskuje, że chyba Elf się gdzieś machnął z kodem, bo jakoś szfankuje albo inaczej działa.
Ogólnie: gdy napiszę jedno
e to jest spełniony warunek
1, gdy cokolwiek innego to żaden z warunków nie jest spełniony.
A, no i to
StringVec a wygląda tak:
Code:
StringVec a = explodeString("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM ", text, true, 1);
Z resztą nie ważne jak wygląda bo i tak nic nie działa.
Proszę o jakąkolwiek pomoc, albo inne rozwiązanie.
Prosiłbym Cię, abyś nie pisał, że się gdziekolwiek machnąłem, bo sobie tego nie życzę, skoro nawet nie wiesz, jak działa zwykłe explode (bazujące na php.net/explode).
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM " - co to kurwa ma być? Po to dałem samo " ", jako delim~, abyś nie musiał się wysilać i za dużo myśleć, a Ty po polsku oczywiście pełne przekombinowanie.
Code:
if(a.size() > 1)
{
player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "1");
}
Trudno żebyś uzyskał inny wynik, skoro sprawdzasz wielkość wektoru (tablicy)... Zresztą, wynik będzie zawsze 1 lub 2, ponieważ do funkcji explodeString przekazujesz parametr limit = 1 - w przypadku nie znalezienia delimetera (czyli brak spacji- abyś zrozumiał), będzie 1; jeśli jednak znajdzie, to dwa.
Funkcja asLowerCaseString ułatwia wyszukiwanie konkretnych informacji poprzez zmniejszanie wielkości liter, aby inteligent właśnie Twojego pokroju nie musiał wstawiać czegoś takiego:
Code:
if(a[1] == "o" || a[1] == "O")
Widzę, że nawet z podstawami u Ciebie słaaaaaaabiutko... Wpis 0 w wektorze a to komenda, czyli będzie zawsze !event. Natomiast wpis 1 będzie zawsze Twoim parametrem. Czyli jak napiszesz !event chuj, to a[0] = "!event", natomiast a[1] = "chuj"
Teraz krótka lekcja o stringach... Jeśli pierdolniesz:
Code:
std::string string = "asdf";
if(string == "a")
to trudno, abyś uzyskał pozytywny wynik. Równie dobrze polecam iść dzielić przez zero, może wymyślisz nową teorię, bo jest to równoznaczne z:
Jeśli natomiast chcesz sprawdzić czy pierwsza literka to a, to robisz to w zajebiście dziecinny sposób, bo porównujesz chary:
Code:
std::string string = "asdf";
if(string[0] == 'a')
wtedy zwróci Ci true. Jeśli chodzi o kolejne literki poza pierwszą, to sugeruję najpierw sprawdzać długość stringa, inaczej przyszłego pechowca korzystającego z Twojego jakże marnego kodu, za który nigdy nie powinieneś się brać bo najwyraźniej nadajesz się tylko do mycia podłóg i tylko na tym raczej dorobisz sobie na "wypady", spotka jakże smutny SEGV (segmentation fault). A na to też jest prosty sposób:
Code:
std::string string = "asdf";
if(string.length() > 1 && string[1] == 's')
I, uwaga, nie możesz sobie dobrowolnie wybierać między " i ', jak w Lua. " to całe stringi, ' to pojedyncze chary.
Próbowałem być miły, ale serio, zajmij się lepiej podłogami lub malowaniem ścian...
To była krótka lekcja, jak korzystać ze stringów i tablic w C++. Zapamiętaj ją lepiej, bo więcej nie będzie.
Ogólnie odradzam Tobie dalszą współpracę z tym językiem. Zasugerowałem Tobie powyższe rozwiązanie, ponieważ myślałem, że podstawy podstaw znasz. Niestety- myślę nawet, że po przeczytaniu tego posta wejdziesz na cplusplus.com i zaczniesz szukać różnić między char a string. I nie, żadnej "nowej" "funkcji" nie trzeba.
Odradzam również wszystkim w przyszłości korzystającym z usług GarQeta korzystania z nich, bo potem rodzą się gadki pt. TFS niestabilny. No i ogólnie dla własnego bezpieczeństwa.