Skocz do zawartości

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.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Słowa czytane z pliku.


  • Zamknięty Temat jest zamknięty
10 odpowiedzi w tym temacie

#1 GoldeN

    Wszechmogący

  • Zbanowany

Reputacja: 69
Pomocny

  • Postów:676
  • Imię:Kamil
  • Lokalizacja:DG
Offline

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 "xD". Ofc. Chce zastosować Array.

#2 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

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");
}
}

  • +
  • -
  • 1

#3 GoldeN

    Wszechmogący

  • Autor tematu
  • Zbanowany

Reputacja: 69
Pomocny

  • Postów:676
  • Imię:Kamil
  • Lokalizacja:DG
Offline

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?

#4 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

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


  • +
  • -
  • 1

#5 GoldeN

    Wszechmogący

  • Autor tematu
  • Zbanowany

Reputacja: 69
Pomocny

  • Postów:676
  • Imię:Kamil
  • Lokalizacja:DG
Offline

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?

#6 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 03.06.2011 10:02

no jak zajrzysz do źródła to zobaczysz, że będzie to "xD - Wpisales lol"
  • +
  • -
  • 1

#7 GoldeN

    Wszechmogący

  • Autor tematu
  • Zbanowany

Reputacja: 69
Pomocny

  • Postów:676
  • Imię:Kamil
  • Lokalizacja:DG
Offline

Napisano 03.06.2011 10:11

A jakbym chciał dołożyć do tego trzecie słowo w tym pliku? xD

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 "xD" 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 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

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
  • +
  • -
  • 1

#9 GoldeN

    Wszechmogący

  • Autor tematu
  • Zbanowany

Reputacja: 69
Pomocny

  • Postów:676
  • Imię:Kamil
  • Lokalizacja:DG
Offline

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 "xD"

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 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 04.06.2011 17:52

remove_quotes
  • +
  • -
  • 1

#11 GoldeN

    Wszechmogący

  • Autor tematu
  • Zbanowany

Reputacja: 69
Pomocny

  • Postów:676
  • Imię:Kamil
  • Lokalizacja:DG
Offline

Napisano 04.06.2011 22:09

PORADZIŁEM SOBIE.

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