Skocz do zawartości
Walvon

Losowanie

Rekomendowane odpowiedzi

Witam, zrobiłem se o to taki kodzik w timerze na losowanie gracza na którym sie wydarzy jakaś akcja, jednakże chce aby maksymalnie dwóch graczy było wylosowanych. Jak moge zrobić, aby maksymalnie dwóch graczy dobierało?

Tu kod:

   new randomPlayerId = random(GetMaxPlayers());

   if(IsPlayerConnected(randomPlayerId))
   {
   //
   }

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
new randomPlayerId = random(2);

Myślę, że powinieneś zmienić GetMaxPlayers() na po prostu liczbę 2.

Bo jak mogłeś zauważyć teraz stworzyłeś randoma dla wszystkich graczy, a chcesz tylko dla dwóch.

Edytowane przez MrKacu13

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
34 minut temu, MrKacu13 napisał:

Myślę, że powinieneś zmienić GetMaxPlayers() na po prostu liczbę 2.

Bo jak mogłeś zauważyć teraz stworzyłeś randoma dla wszystkich graczy, a chcesz tylko dla dwóch.

 

Każdy twój post jest albo bzdurą albo totalną głupotą. Na serwerze jest np. 20 graczy i kod ma wylosować dwóch z nich. Kod, który podałeś, wylosuje albo 0 albo 1 - co jeśli żaden gracz nie będzie mieć takiego ID?

 

Losowanie gracza poprzez funkcję random jest uciążliwe, bo nie wiadomo, czy wylosowane ID jest na serwerze, trzeba to robić w pętli while. Jest inny sposób, zrobić jedną pętlę for na wszystkich graczy i do tablicy zapisywać graczy online.

 

new pArray[MAX_PLAYERS], slotid;

for(new playerid, j = GetPlayerPoolSize(); playerid <= j; playerid++)
{
	if(IsPlayerConnected(playerid)) pArray[slotid++] = playerid;
}
                                                        
new p1 = pArray[random(slotid)];
new p2 = pArray[random(slotid)];

 

Oczywiście trzeba uwzględnić, że funkcja random może dwa razy wylosować tę samą liczbę. Jeszcze innym, najprostszym sposobem jest użycie funkcji Iter_Random jeśli korzystasz z foreach.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
3 godziny temu, BaLL napisał:

 

Każdy twój post jest albo bzdurą albo totalną głupotą. Na serwerze jest np. 20 graczy i kod ma wylosować dwóch z nich. Kod, który podałeś, wylosuje albo 0 albo 1 - co jeśli żaden gracz nie będzie mieć takiego ID?

 

Losowanie gracza poprzez funkcję random jest uciążliwe, bo nie wiadomo, czy wylosowane ID jest na serwerze, trzeba to robić w pętli while. Jest inny sposób, zrobić jedną pętlę for na wszystkich graczy i do tablicy zapisywać graczy online.

 


new pArray[MAX_PLAYERS], slotid;

for(new playerid, j = GetPlayerPoolSize(); playerid <= j; playerid++)
{
	if(IsPlayerConnected(playerid)) pArray[slotid++] = playerid;
}
                                                        
new p1 = pArray[random(slotid)];
new p2 = pArray[random(slotid)];

 

Oczywiście trzeba uwzględnić, że funkcja random może dwa razy wylosować tę samą liczbę. Jeszcze innym, najprostszym sposobem jest użycie funkcji Iter_Random jeśli korzystasz z foreach.

Okej i jak moge zrobić, że jeżeli gracz został wylosowany to coś sie z nim dzieje? if'em czy jak?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

	#include &lt;a_samp&gt;
	#include &lt;YSI\y_iterate&gt;
	public OnFilterScriptInit()
	{
	    new p[2];
	    
	    POWROT:
	    p[0] = Iter_Random(Player);
	    p[1] = Iter_Random(Player);
	    printf("Wylosowane ID Gracza : %d %d", p[0], p[1]);
	    if(p[0] == p[1]) goto POWROT; // Jeśli ID sa takie same
	    return 1;
	}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
2 godziny temu, Lagowy napisał:

 


	#include &lt;a_samp&gt;
	#include &lt;YSI\y_iterate&gt;
	public OnFilterScriptInit()
	{
	    new p[2];
	    
	    POWROT:
	    p[0] = Iter_Random(Player);
	    p[1] = Iter_Random(Player);
	    printf("Wylosowane ID Gracza : %d %d", p[0], p[1]);
	    if(p[0] == p[1]) goto POWROT; // Jeśli ID sa takie same
	    return 1;
	}

 

	#include &lt;a_samp&gt;
	#include &lt;YSI\y_iterate&gt;

??? Próbowałem bez tych ''znaczków'' z samym #include <YSI> i takie cacuszko wyskoczyło :v

D:\pawno\include\YSI\y_svar.inc(68) : fatal error 111: user error: Please define "MODE_NAME" before including y_svar.

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Te przygłupie znaki same się wstawiają , dodatkowo [ code ] jest zryte, a Administracja nic z tym nie robi już od kilku lat.(PS: chciałem zaznaczyć że jedyne co potrafią to trzymać moderatorów którzy wchodzą raz na tydzień i rozdawać rangi Programista osobom które nie mają nawet 100 postów - a ostatni był kilka(naście) miesięcy temu)

musisz dać tak: 

#include <a_samp>
#include <foreach> // jeśli nie masz daj #include <YSI\y_iterate>

Edytowane przez Lagowy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
2 godziny temu, Lagowy napisał:

Te przygłupie znaki same się wstawiają , dodatkowo [ code ] jest zryte, a Administracja nic z tym nie robi już od kilku lat.(PS: chciałem zaznaczyć że jedyne co potrafią to trzymać moderatorów którzy wchodzą raz na tydzień i rozdawać rangi Programista osobom które nie mają nawet 100 postów - a ostatni był kilka(naście) miesięcy temu)

musisz dać tak: 

#include <a_samp>
#include <foreach> // jeśli nie masz daj #include <YSI\y_iterate>

zarąbiscie, dzięki. Już wiem jak takie coś zrobić. Można temat zamknąć :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
10 godzin temu, BaLL napisał:

 

Każdy twój post jest albo bzdurą albo totalną głupotą. Na serwerze jest np. 20 graczy i kod ma wylosować dwóch z nich. Kod, który podałeś, wylosuje albo 0 albo 1 - co jeśli żaden gracz nie będzie mieć takiego ID?

Nie spinaj się tak, bo Ci żyłka pęknie. Ja też się uczę i mam prawo popełniać błędy, a Ty już na mnie najeżdżasz.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
6 godzin temu, Lagowy napisał:

Te przygłupie znaki same się wstawiają , dodatkowo [ code ] jest zryte, a Administracja nic z tym nie robi już od kilku lat.(PS: chciałem zaznaczyć że jedyne co potrafią to trzymać moderatorów którzy wchodzą raz na tydzień i rozdawać rangi Programista osobom które nie mają nawet 100 postów - a ostatni był kilka(naście) miesięcy temu)

musisz dać tak: 

#include <a_samp>
#include <foreach> // jeśli nie masz daj #include <YSI\y_iterate>

A to ma być w callbacku OnGameModeInit? Bo coś nie działa.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×