Szerző Téma: Random checkpoint: ne legyen ugyanaz  (Megtekintve 801 alkalommal)

Random checkpoint: ne legyen ugyanaz
« Dátum: 2013. január 02. - 17:10:39 »
0 Show voters
Ahoy, lenne 10 db csekpoínt, melybõl random módon 3-at kell teljesítenie / érintenie a játékosnak.
Ezek ugye véletlenszerûen változnak, ám olykor elõfordul, hogy egymás után ugyanaz jön egy küldetés alatt...  :nono:
Példa: érinti az elsõt, érinti a másodikat, majd benne van az esély, hogy újra az elsõ CP hely jön elõ.
 
new Float: Cimzett[][11] =
{
{1550.3191,1121.7886,10.8203}, {1115.6642,1365.1157,10.8203}, {1036.4130,2313.1960,11.4683}, {1458.4666,1953.5004,11.4683}, {1599.9231,2144.2908,11.4609},
{1655.5189,1736.1045,10.8281}, {2025.9143,998.1968,10.8203}, {2192.9465,1994.2487,12.2969}, {1530.4325,2355.3801,10.8203}, {1347.0576,2608.6394,10.8203}
};

 

new rand = random(sizeof(Cimzett)); SetPlayerCheckpoint(playerid,Cimzett[rand][0],Cimzett[rand][1],Cimzett[rand][2], 1.0);

 
Hogyan lehetne azt tehát, hogy ha már belépett egy CP-be, akkor ugyanazon a helyen ne jelenjen meg újra CP a küldetés során?

Random checkpoint: ne legyen ugyanaz
« Válasz #1 Dátum: 2013. január 02. - 20:19:25 »
+1 Show voters
Epsilon szkriptjében láttam egy eljárást melyet én is használtam a poker szkriptemben mivel egyszerûbb volt annál amit én írtam, ez pedig a következõ lenne, már átalakítva számodra:
 
#include <a_samp>
#define MAXCP       10
#define MAX_RANDCP    3
#define DEBUG
 
stock
RandomCP(array[])
{
new
bool:e[MAXCP] = { false, ... };
for(new p = 0; p < MAX_RANDCP; p++)
{
do
   array[p] = random(MAXCP);
while(e[array[p]])
e[array[p]] = true;
}
}
new
Float:Cimzett[MAXCP][] =
{
{ 1550.3191, 1121.7886, 10.8203 },
{ 1115.6642, 1365.1157, 10.8203 },
{ 1036.4130, 2313.1960, 11.4683 },
{ 1458.4666, 1953.5004, 11.4683 },
{ 1599.9231, 2144.2908, 11.4609 },
{ 1655.5189, 1736.1045, 10.8281 },
{ 2025.9143, 998.1968, 10.8203 },
{ 2192.9465, 1994.2487, 12.2969 },
{ 1530.4325, 2355.3801, 10.8203 },
{ 1347.0576, 2608.6394, 10.8203 }
};
new
Cp_Player[MAX_PLAYERS][MAX_RANDCP];
public
OnPlayerConnect(playerid)
{
for(new i; i < MAX_RANDCP; i++)
{
Cp_Player[playerid] = -1;
}
return 1;
}
public
OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, \"/start\", true) == 0)
{
if(Cp_Player[playerid][0] != -1) return SendClientMessage(playerid, -1, \"Már elindítva.\");
RandomCP(Cp_Player[playerid]);
#if defined DEBUG   
   new
      str[128];
   format(str, sizeof str, \"%d, %d, %d,\", Cp_Player[playerid][0] , Cp_Player[playerid][1] , Cp_Player[playerid][2]);
   SendClientMessage(playerid, -1, str);
#endif
SetPlayerCheckpoint(playerid,    Cimzett[  Cp_Player[playerid][0]  ][0],
                        Cimzett[  Cp_Player[playerid][0]  ][1],
                        Cimzett[  Cp_Player[playerid][0]  ][2],
                  1.0);
Cp_Player[playerid][0] = -2;
return 1;
}
#if defined DEBUG
if(strcmp(cmdtext, \"/gotocp\", true, 7) == 0)
{
   new
      t = strval(cmdtext[8]);
   if(!(0 <= t < MAXCP)) return SendClientMessage(playerid, -1, \"Nincs ilyen cp, maximális érték (\" #MAXCP \" minusz 1)\");
   SetPlayerPos(playerid,          Cimzett[  t  ][0] + 1.5,
                           Cimzett[  t  ][1],
                           Cimzett[  t  ][2]);
   return 1;
}
#endif
return 0;
}
public
OnPlayerEnterCheckpoint(playerid)
{
DisablePlayerCheckpoint(playerid);
if(Cp_Player[playerid][1] != -1)
{
SetPlayerCheckpoint(playerid,    Cimzett[  Cp_Player[playerid][1]  ][0],
                        Cimzett[  Cp_Player[playerid][1]  ][1],
                        Cimzett[  Cp_Player[playerid][1]  ][2],
         1.0);
Cp_Player[playerid][1] = -1;
}
else if(Cp_Player[playerid][2] != -1)
{   
SetPlayerCheckpoint(playerid,    Cimzett[  Cp_Player[playerid][2]  ][0],
                        Cimzett[  Cp_Player[playerid][2]  ][1],
                        Cimzett[  Cp_Player[playerid][2]  ][2],
         1.0);
Cp_Player[playerid][2] = -1;
}
else if(Cp_Player[playerid][0] == -2)
{
SendClientMessage(playerid, -1, \"Game Over\");
Cp_Player[playerid][0] = -1;
}
return 1;
}

 
Lehet hogy bonyolult lett, de ha kiszeded a debug részeket lehet kicsit átláthatóbb.

Random checkpoint: ne legyen ugyanaz
« Válasz #2 Dátum: 2013. január 02. - 21:30:40 »
0 Show voters
Hupsz kicsit szétcsúszott ahogy nézem :D
Összébb raktam pawnoba, így lett 92 errormentes sör sor.
Milyen Debug részt szedjek ki? Amit írtál abban az 58-tól 63-ig illetve 72-tõl 83-ig lévõ sorokat kiszedhetem, arra gondoltál?
« Utoljára szerkesztve: 2013. január 02. - 21:45:51 írta takehun »

Random checkpoint: ne legyen ugyanaz
« Válasz #3 Dátum: 2013. január 02. - 22:29:11 »
+1 Show voters
Igen azokra gondoltam.
Amúgy nem tudom nálad mi lehet a gond, én kimásolom innen beillesztem egy új fájlba, megnyomom az F5-öt, beírom az új fájl nevét és hiba nélkül lefordítja.
Igaz én notepad++-t használok, sima pawn editorral nem próbáltam.
Kiszedtem én:
 
#include <a_samp>
#define MAXCP           10
#define MAX_RANDCP      3     
     
stock
RandomCP(array[])
{
new
bool:e[MAXCP] = { false, ... };
for(new p = 0; p < MAX_RANDCP; p++)
{
do
   array[p] = random(MAXCP);
while(e[array[p]])
e[array[p]] = true;
}
}
     
new
Float:Cimzett[MAXCP][] =
{
{ 1550.3191, 1121.7886, 10.8203 },
{ 1115.6642, 1365.1157, 10.8203 },
{ 1036.4130, 2313.1960, 11.4683 },
{ 1458.4666, 1953.5004, 11.4683 },
{ 1599.9231, 2144.2908, 11.4609 },
{ 1655.5189, 1736.1045, 10.8281 },
{ 2025.9143, 998.1968, 10.8203 },
{ 2192.9465, 1994.2487, 12.2969 },
{ 1530.4325, 2355.3801, 10.8203 },
{ 1347.0576, 2608.6394, 10.8203 }
};
     
new
Cp_Player[MAX_PLAYERS][MAX_RANDCP];
public
OnPlayerConnect(playerid)
{
for(new i; i < MAX_RANDCP; i++)
{
Cp_Player[playerid] = -1;
}
return 1;
}
     
public
OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, \"/start\", true) == 0)
{
if(Cp_Player[playerid][0] != -1) return SendClientMessage(playerid, -1, \"Már elindítva.\");
RandomCP(Cp_Player[playerid]);
SetPlayerCheckpoint(playerid, Cimzett[Cp_Player[playerid][0]][0], Cimzett[Cp_Player[playerid][0]][1], Cimzett[Cp_Player[playerid][0]][2], 1.0);
Cp_Player[playerid][0] = -2;
return 1;
}
return 0;
}
public
OnPlayerEnterCheckpoint(playerid)
{
DisablePlayerCheckpoint(playerid);
if(Cp_Player[playerid][1] != -1)
{
SetPlayerCheckpoint(playerid, Cimzett[Cp_Player[playerid][1]][0], Cimzett[Cp_Player[playerid][1]][1], Cimzett[Cp_Player[playerid][1]][2], 1.0);
Cp_Player[playerid][1] = -1;
}
else if(Cp_Player[playerid][2] != -1)
{     
SetPlayerCheckpoint(playerid, Cimzett[Cp_Player[playerid][2]][0], Cimzett[Cp_Player[playerid][2]][1], Cimzett[Cp_Player[playerid][2]][2], 1.0);
Cp_Player[playerid][2] = -1;
}
else if(Cp_Player[playerid][0] == -2)
{
SendClientMessage(playerid, -1, \"Game Over\");
Cp_Player[playerid][0] = -1;
}
return 1;
}
« Utoljára szerkesztve: 2013. január 02. - 22:36:19 írta ɐʞzssǝlosz »

Random checkpoint: ne legyen ugyanaz
« Válasz #4 Dátum: 2013. január 02. - 23:28:10 »
0 Show voters
Ha minden igaz mûködik, köszönöm a segítségedet & átírást MESTER!  :yes:  :thumbsup:

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal