Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Guest Message by DevFuse
Słowa czytane z pliku.
Temat rozp.
GoldeN
, 02.06.2011 14:29
10 odpowiedzi w tym temacie
#1
Napisano 02.06.2011 14:29
Mam w pliku powpisywane slowa o osobnych linijkach. Jak mogę uzyskać takie coś, że np w pliku mam 3 słowa:
a
b
c
Jak ktoś wpisze w chat jedno z tych liter to wyśw. się słowo "". Ofc. Chce zastosować Array.
a
b
c
Jak ktoś wpisze w chat jedno z tych liter to wyśw. się słowo "". Ofc. Chce zastosować Array.
#2
Napisano 02.06.2011 14:56
Lepiej to zrobic z pomoca Trie:
#include <amxmodx>
#include <amxmisc>
#include <celltrie>
#define PLUGIN "Slowa"
#define VERSION "1.0"
#define AUTHOR "R3X"
//wywal jak trzeba wpisac dokladnie tak jak w configu
//zostaw jesli Haslo i hASlO maja oznaczac to samo slowo
#define IGNORE_CASE
new Trie:Slowa;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
//Hook czatu
register_clcmd("say", "cmdSay");
}
public plugin_cfg(){
//inicjalizacja drzewa
Slowa = TrieCreate();
static szFile[198];
//budowa sciezki do pliku
get_configsdir(szFile, charsmax(szFile));
add(szFile, charsmax(szFile), "/slowa.txt");
//otworz plik do odczytu tekstowego
new fp = fopen(szFile, "rt");
if(fp){
//jesli istnieje
while( !feof(fp) ){ //dopoki nie koniec pliku
//odczytaj linijke
fgets(fp, szFile, charsmax(szFile));
//usun spacje z poczatku i z konca
trim(szFile);
#if defined IGNORE_CASE
//jesli wielkosc liter nie ma znaczenia zamien wszystkie na male
strtolower(szFile);
#endif
//ustaw klucz '<slowo>' w drzewie
TrieSetCell(Slowa, szFile, 1);
}
fclose(fp);
}
}
public cmdSay(id){
static szMessage[198];
//odczytaj co powiedzial gracz
read_args(szMessage, 197);
//usun ""
remove_quotes(szMessage);
//usun spacje z poczatku i z konca
trim(szMessage);
#if defined IGNORE_CASE
//jesli wielkosc liter nie ma znaczenia zamien wszystkie na male
strtolower(szMessage);
#endif
if(TrieKeyExists(Slowa, szMessage)){
client_print(id, print_chat, "XD");
}
}
#3
Napisano 02.06.2011 22:08
No dobra, a jeżeli w jednej linii w pliku mam tak:
"komenda" "cos"
To po wpisaniu komenda jak mogę odczytać to drugie słowo z cudzysłowia?
"komenda" "cos"
To po wpisaniu komenda jak mogę odczytać to drugie słowo z cudzysłowia?
#4
Napisano 03.06.2011 09:53
Taka najprostsza wersja to użycie parse() to pobrania argumentów i zamiast Cell w drzewie ustawiać String
Załączone pliki
#5
Napisano 03.06.2011 10:00
Dziękuję. Właśnie wiem, że z użyciem parse, ale nie wiedziałem, jak to dokłądnie zapisać. Czyli np. jeżeli mój plik zawira takie coś:
"lol" "Wpisales lol"
To po wpisaniu lol wyświetli się "Wpisales lol" tylko bez cudzyslowia?
"lol" "Wpisales lol"
To po wpisaniu lol wyświetli się "Wpisales lol" tylko bez cudzyslowia?
#6
Napisano 03.06.2011 10:02
no jak zajrzysz do źródła to zobaczysz, że będzie to " - Wpisales lol"
#7
Napisano 03.06.2011 10:11
A jakbym chciał dołożyć do tego trzecie słowo w tym pliku?
Wystarczy zmienić z:
na:
I na górze odczyt?
Czyli:
Bo troszkę tego trie nie ogarniam, a jak robiłem Arrayami i sprawdzałem pętlą wszystkie linijki to jakoś mi nie chciało iść. (No szło, ale "" pojawiało się dwa razy a Linijki = 0 wogóle nie odnajdywało.)
Wystarczy zmienić z:
if(TrieGetString(Slowa, szMessage, szMessage, 63)){
client_print(id, print_chat, "XD - %s", szMessage);
}
na:
if(TrieGetString(Slowa, szMessage, szMessage, 63, DrugieSlowo, 63)){
client_print(id, print_chat, "XD - %s, %s", szMessage, DrugieSlowo);
}
I na górze odczyt?
Czyli:
if(3 != parse(szFile, szFile, 31, szText, 64))
continue;
Bo troszkę tego trie nie ogarniam, a jak robiłem Arrayami i sprawdzałem pętlą wszystkie linijki to jakoś mi nie chciało iść. (No szło, ale "" pojawiało się dwa razy a Linijki = 0 wogóle nie odnajdywało.)
Użytkownik GoldeN edytował ten post 03.06.2011 10:12
#8
Napisano 03.06.2011 10:15
w trie mieści się tylko jedno słowo
możesz zrobić 2x Array: na 1 i na 2 słowo, wtedy do Trie dodawać tylko indeks w tych tablicach, gdybyś od tego zaczął to bym napisał, teraz już mi się nie chce
możesz zrobić 2x Array: na 1 i na 2 słowo, wtedy do Trie dodawać tylko indeks w tych tablicach, gdybyś od tego zaczął to bym napisał, teraz już mi się nie chce
#9
Napisano 03.06.2011 15:37
A mogę jakoś w Arrayach to zrobić? Bo zrobiłęm tak, że sprawdzam plik, linie zapisuję w Array a następnie pętlą sprawdzam, czy jest równe co napisał gracz z tym co jest w pliku.. No tylko, że nie czytało linii = 0 i wyświetlało po 2 ""
Dodano 04 czerwiec 2011 - 00:28:
Czemu nie działa coś takiego:
Ofc. Plik wczytany, Arraye stworzone.
Próbowałem też equali ale też nic. No i cmdSay wywołany gdy ktoś coś napisze.
Dodano 04 czerwiec 2011 - 00:28:
Czemu nie działa coś takiego:
public cmdSay(id){
new szMessage[192];
read_args(szMessage, 191);
new txt[512];
for(new i = 0; i <= ArraySize(Command); i++)
{
ArrayGetString(Command, i, txt, charsmax(txt));
if(containi(szMessage, txt) != -1)
client_print(id, print_chat, "XD");
}
}
Ofc. Plik wczytany, Arraye stworzone.
Próbowałem też equali ale też nic. No i cmdSay wywołany gdy ktoś coś napisze.
Użytkownik GoldeN edytował ten post 04.06.2011 00:29
#10
Napisano 04.06.2011 17:52
remove_quotes
#11
Napisano 04.06.2011 22:09
PORADZIŁEM SOBIE.
Można zamknąć.
Można zamknąć.
Użytkownik GoldeN edytował ten post 05.06.2011 10:14
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych