←  Pluginy

AMXX.pl: Support AMX Mod X i SourceMod

»

Modyfikacja
random_num() - jak powtórzyć "losowani...


Najlepsza odpowiedź MAGNET 19.11.2014 19:13

new utwor;
 
public RoundSound()
{
numer = random_num(1, 13);
if(utwor == numer)
RoundSound();
else
{
utwor = numer;
new Players[32],num;
get_players(Players,num)
for(new ajdi = 0;ajdi<num;ajdi++)
{
if(mute[ajdi])
Graj(ajdi);
}
}
return PLUGIN_CONTINUE;
}
Przejdź do postu

  • +
  • -
psilocybe - zdjęcie psilocybe 18.11.2014

Jak w tytule, modyfikuję plugin SmartRS od Cheq i chciałem dodać warunek aby nie losowało mi dwa razy tej samej liczby.

Wstawiam fragment *.sma

public RoundSound()
{
numer = random_num(1, 13);
new Players[32],num;
get_players(Players,num)
for(new ajdi = 0;ajdi<num;ajdi++)
{
if(mute[ajdi])
Graj(ajdi);
}
return PLUGIN_CONTINUE;
}

Ktoś zapoda jakiś prosty przykład? Nie mogę nic znaleźć ;)

 

Edit: poza tym http://amxx.pl/topic...-bez-powtorzen/

Ale nie mam pojęcia o dynamicznych tablicach dobrze o tym wiecie :D

Liczę na pomoc.


Użytkownik psilocybe edytował ten post 18.11.2014 11:59
Odpowiedz

  • +
  • -
dasiek - zdjęcie dasiek 18.11.2014

chcesz żeby 2 razy z rzędu nie leciała taka sama piosenka, czy żeby nie powtórzyła się póki wszystkie się nie wylosują?

 

Odpowiedz

  • +
  • -
MAGNET - zdjęcie MAGNET 18.11.2014

Pisane z telefonu, wiec nie miałem jak użyć tabulacji. Jeśli przykładowo wylosuje się numer 7 siódma komórka zostanie zapelniona. Jeśli teraz wylosuje się 7, losowanie zostanie wykonane ponownie. Jeśli natomiast wszystikie komórki zostaną zapełnione, wszystkie komórki zostają wyzerowane. Metoda sama w sobie jest bardzo brzydka, ale na lekcji nie znajduje jak na razie innej możliwości

new zmienna[13]

public RoundSound()
{
for(new i;i<13;i++)
{
if(zmienna[i]) zmienna[i] = 0;
else
{

numer = random_num(1, 13);
if(!zmienna[zmienna])
{
new Players[32],num;
get_players(Players,num)
for(new ajdi = 0;ajdi<num;ajdi++)
{
if(mute[ajdi])
Graj(ajdi);
}
}
else RoundSound();
return PLUGIN_CONTINUE;
}
}
Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 18.11.2014

MAGNET, dzięki za odpowiedź ale pomimo że doszedłem do ładu z Twoim kodem to przy kompilacji:

 

linijka

if(!zmienna[zmienna])

zwraca

array must be indexed - variable "zmienna"

i na końcu publica RoundSound warn w kompilatorze

function RoundSound should return a value

Nie znam się, ale dlaczego pozornie proste rzeczy są tak skomplikowane? Nie ogarniam.

 

Btw.

 

Jeżeli losujemy numer to nie możemy go od razu zapisać do drugiej tablicy np. lastnumer[] i przed każdym puszczeniem sprawdzić czy wylosowany numer != lastnumer, jeżeli jest inaczej to PublicRoundsound :D

 

Nie było by?

 

Edit: CheQ nie zauważyłem Twojego posta, chcę opcję 1 :) Po prostu nie chce 2 razy z rzędu tej samej nuty.


Użytkownik psilocybe edytował ten post 18.11.2014 14:11
Odpowiedz

  • +
  • -
MAGNET - zdjęcie MAGNET 18.11.2014

zmienna[numer], pomyłkę zrobiłem ;)
a returna daj pod ostatnią klamrą

Ah, myślałem ze chcesz aby przeleciała cała playlista, a potem od nowa. Nie mam teraz czasu, ale jak ktoś mnie nie uprzedzi to napisze co i jak. Ale na postawione pytanie odpowiedziałeś sobie sam
Odpowiedz

  • +
  • -
MAGNET - zdjęcie MAGNET 18.11.2014

Jeżeli losujemy numer to możemy go od razu zapisać do drugiej tablicy np. lastnumer[] i przed każdym puszczeniem sprawdzić czy wylosowany numer != lastnumer, jeżeli jest inaczej to PublicRoundsound :D - masz odpowiedź
Odpowiedz

  • +
  • -
dasiek - zdjęcie dasiek 18.11.2014

spróbuj zmienić linijkę losowanie na tę.

public RoundSound() 
{ 
	new bardzoStaryNumer = numer;
	do{
		numer = random_num(1, sizeof numery_nut);
	}
	while(numer != bardzoStaryNumer);
	//dalszy kod
}
Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 18.11.2014

CheQ, plugin się kompiluje bez problemów ale crashuje serwer bez logów pomimo włączonego debug'a. Przecież powinno działać.

 

Odpowiedz

  • +
  • -
Najlepsza odpowiedź MAGNET - zdjęcie MAGNET 19.11.2014

new utwor;
 
public RoundSound()
{
numer = random_num(1, 13);
if(utwor == numer)
RoundSound();
else
{
utwor = numer;
new Players[32],num;
get_players(Players,num)
for(new ajdi = 0;ajdi<num;ajdi++)
{
if(mute[ajdi])
Graj(ajdi);
}
}
return PLUGIN_CONTINUE;
}

dasiek (20.11.2014 10:01):
wiedziałem że coś rekurencyjnie można ^^
MAGNET (20.11.2014 15:07):
Twój kod działał prawie tak samo, ale źle ulozyles warunek i wykonywał się on bez konca ;_

Użytkownik MAGNET edytował ten post 19.11.2014 19:13
Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 19.11.2014

Dziękuję :D

 

Plusik dla Ciebie zasłużony.

Odpowiedz