Jump to content
  • 0

pomoc Poradie v Race


StreetGuy

Dotaz

Popis problému:

Zdravím,

mám taký problém. Robím si race system, a skončil som u poradia.

Robím také klasické poradie, že keď hráči jazdia, aby vedeli kto je pred nimi, poprípade za nimi,

Všetko sa mi doteraz darilo, ale zastavil som sa u toho poradia,

 

Mám zadefinované pre každého hráča, koľko CP prešiel v RaceCount[playerid]

Neviem spraviť script, ktorý by zoradil hráčov od najviac prejdených CP, a ak by mali 2+ rovnaký CP., zistilo by to poradie podľa vzdialenosti od CP.

Vedeli by ste mi niekto poradiť ako to spraviť, poprípade poslať nejaký príklad ?

 

Chyby/varování kompilátoru a při běhu:

--

 

Kód:

 

--

 

 

 

Dodatečné poznámky:

--

Link to comment
Share on other sites

7 odpovědí na tuto otázku

Recommended Posts

  • 0

Neviem spraviť script, ktorý by zoradil hráčov od najviac prejdených CP,

for (...) {

	if (RaceCount[playerid] > RaceCount[i]) {

		/* Je ve předu před všemi */
	}
}

a ak by mali 2+ rovnaký CP., zistilo by to poradie podľa vzdialenosti od CP.

if (GetPlayerDistanceFromPoint(playerid, CheckpointX[cpid], CheckpointY[cpid], CheckpointZ[cpid]) < 100.0) {

	/* Pokud je méně než 100 metrů od checkpointu */
}
A pak ty vzdálenosti u obou porovnáš... Bez kódu ti sotva může někdo poradit(jestli jsi něco skutečně udělal tedy...)
Link to comment
Share on other sites

  • 0


forward Poradie();
public Poradie()
{
new str[50];
RTsec ++;
for(new i;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(i)) continue;
if(!inRace[i]) continue;

RacePoradie[i] = 1;
//Time
if(RTsec == 60) { RTsec=0; RTmin++; }
if(RTmin>=10) format(str,sizeof(str),"Cas: %i",RTmin);
else if(RTmin<=9) format(str,sizeof(str),"Cas: 0%i",RTmin);
if(RTsec>=10) format(str,sizeof(str),"%s:%i",str,RTsec);
else if(RTsec<=9) format(str,sizeof(str),"%s:0%i",str,RTsec);
PlayerTextDrawSetString(i,RaceTime[i],str);
PlayerTextDrawShow(i,RaceTime[i]);
//CP
format(str,sizeof(str),"CP: %i/%i",CpCount[i],MaxCp);
PlayerTextDrawSetString(i,RaceCP[i],str);
PlayerTextDrawShow(i,RaceCP[i]);
//Poradie
for(new j;j<100;j++)
{
if(j==100)
{
new specstr[50];
if(RacePoradie[i] == 1)
{
format(specstr,sizeof(specstr),"1:%s(%i)",GetName(i),i);
PlayerTextDrawSetString(j,Race[0][j],specstr);
PlayerTextDrawShow(j,Race[0][j]);
}
else if(RacePoradie[i] == 2)
{
format(specstr,sizeof(specstr),"2:%s(%i)",GetName(i),i);
PlayerTextDrawSetString(j,Race[0][j],specstr);
PlayerTextDrawShow(j,Race[0][j]);
}
}

if(!IsPlayerConnected(j)) continue;
else if(!inRace[j]) continue;
if(CpCount[i] < CpCount[j]) { RacePoradie[i]++; }
else if(CpCount[i] == CpCount[j])
{
new Float:disti = GetPlayerDistanceFromPoint(i,CP[CpCount[i]][cX], CP[CpCount[i]][cY], CP[CpCount[i]][cZ]);
new Float:distj = GetPlayerDistanceFromPoint(j,CP[CpCount[j]][cX], CP[CpCount[j]][cY], CP[CpCount[j]][cZ]);
if(disti < distj) RacePoradie[i]+=1;
else continue;
}
}
}
return 1;
}

 

Edited by StreetGuy
Link to comment
Share on other sites

  • 0
  • Globální moderátor

if(j==100) - tahle podmínka se totiž nevykoná nikdy... Někdo kdo programoval 3 roky by to mohl vědět

 

Also tvůj algoritmus porovnává hráče sám se sebou. Taky se pak dá zrychlit (složitost ovšem zůstává ale stejná) tím, že jakmile nějaký hráč má menší tedy 

CpCount > CpCount[j], tak vyskočíš z vnitřního cyklu

 

 

PS:

 

 

Jinak celá tenhle "věc", úplně špatně a neefektivní – co když bude 70s? Co s těma 10s? To je jako vyresetuješ?

if(RTsec == 60) { RTsec=0; RTmin++; }
if(RTmin>=10) format(str,sizeof(str),"Cas: %i",RTmin);
else if(RTmin<=9) format(str,sizeof(str),"Cas: 0%i",RTmin);
if(RTsec>=10) format(str,sizeof(str),"%s:%i",str,RTsec);
else if(RTsec<=9) format(str,sizeof(str),"%s:0%i",str,RTsec);
PlayerTextDrawSetString(i,RaceTime[i],str);

přepsat na:

format(str,sizeof(str),"Cas: %02d:%02d",RTsec/60,RTsec%60);
PlayerTextDrawSetString(i,RaceTime[i],str);
Link to comment
Share on other sites

  • 0

 

 

forward Poradie();
public Poradie()
{
    new str[50];
    RTsec ++;
	for(new i;i<MAX_PLAYERS;i++)
	{
	    if(!IsPlayerConnected(i)) continue;
	    if(!inRace[i]) continue;

        RacePoradie[i] = 1;
        RacePoradie[0] = 1;
		format(str,sizeof(str),"Cas: %02d:%02d",RTsec/60,RTsec%60);
		PlayerTextDrawSetString(i,RaceTime[i],str);
        PlayerTextDrawShow(i,RaceTime[i]);
        //CP
        format(str,sizeof(str),"CP: %i/%i",CpCount[i],MaxCp);
        PlayerTextDrawSetString(i,RaceCP[i],str);
        PlayerTextDrawShow(i,RaceCP[i]);
        //Poradie
		for(new j;j<=100;j++)
		{
		    if(j==100)
			{
		    	new specstr[50];
  	    		if(RacePoradie[i] == 1)
				{
					format(specstr,sizeof(specstr),"1:%s(%i)",GetName(i),i);
					PlayerTextDrawSetString(j,Race[0][j],specstr);
					PlayerTextDrawShow(j,Race[0][j]);
				}
				else if(RacePoradie[i] == 2)
				{
					format(specstr,sizeof(specstr),"2:%s(%i)",GetName(i),i);
					PlayerTextDrawSetString(j,Race[0][j],specstr);
					PlayerTextDrawShow(j,Race[0][j]);
				}
			}

		    if(!IsPlayerConnected(j)) continue;
		    if(!inRace[j]) continue;
		    if(i==j) continue;
			if(CpCount[i] < CpCount[j]) { RacePoradie[i]++; }
		    else if(CpCount[i] == CpCount[j])
		    {
		        new Float:disti = GetPlayerDistanceFromPoint(i,CP[CpCount[i]][cX], CP[CpCount[i]][cY], CP[CpCount[i]][cZ]);
		        new Float:distj = GetPlayerDistanceFromPoint(j,CP[CpCount[j]][cX], CP[CpCount[j]][cY], CP[CpCount[j]][cZ]);
		        if(disti < distj) RacePoradie[i]+=1;
		        else continue;
			}
		}
	}
	return 1;
} 

 
Opraveny kód + stále to nefunguje, to poradie, ale dik za ten time
Edited by StreetGuy
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...