AMXX Moderator: Others
Join Date: Sep 2007
Location: Street
|
06-24-2010
, 20:58
Re: [ES]Ayuda con for (No lo entiendo)
|
#4
|
Fijate si te sirve esto... todavia no lo termine (mas que nada me falta la parte del while).... y fijarme si hay algun error... pero como no se cuando lo voy a terminar, te posteo esto que hice hasta ahora. Lo hice en el momento que estaba sin internet :E
Te recomiendo que no copies y pegues en algun editor de texto como Notepad++ y asi lo puedas leer completo sin tener que correr las barras horizontales.
PHP Code:
/* * * Este tutorial muestra como hacer uso de los loops (for y while en este caso). * Se que ya hay varias especificaciones sobre estos, pero de todas formas quiero * hacer un tutorial propio y quizas a mas de uno le pueda servir mi explicacion. * * Cuando se empieza en el scripting, es normal que entender los loops sea un poco * complicado o molesto, pero de a poco... sin que uno se de cuenta lo va entendiendo. * * Un loop es una accion repetitiva a la cual nosotros le damos ciertos parametros. * Por ejemplo, la cantidad de repeticiones que va a hacer dicho loop. * * Un ejemplo sencillo de loop FOR es el siguiente: * */
for(new i = 0; i < 3; i++) { client_print(0, print_chat, "Soy el mensaje numero %d", i); }
/* * * Para poder analizar este codigo, deben saber primero como es la estructura del * loop FOR. La cual esta dividida en 3 segmentos y son los siguientes: * */
for("variable a usar"; "condicion"; "incremento de la variable") { // codigo a ejecutar }
/* * * Esta estructura anteriormente mostrada es la estructura del codigo anterior. No * siempre es de la misma forma, dicha estructura. Es decir, que puede variar... * Por ejemplo, en el tercer segmento, en vez de ser una incrementacion, puede ser * una decrecion de la variable (pero el ejemplo mostrado al principio es mayormente * el mas usado). * * Vuelvo a mostrar el codigo para que no quede arriba y se pueda explicar facilmente: * */
for(new i = 0; i < 3; i++) { client_print(0, print_chat, "Soy el mensaje numero %d", i); }
/* * * La accion de este codigo mostrado, esta dividida en varios pasos, y son los siguientes: * * 1) Se crea una variable llamada "i" y se le asigna el valor 0 * 2) La condicion es: "si i es menor a 3" * 3) Si la condicion se cumple, se ejecuta el codigo dentro del loop * 5) Luego se incrementa la variable en +1 * 6) Y asi se repite sucesivamente, exceptuando el primer segmento * 7) Hasta que no se cumpla la condicion (segundo segmento) * 8) Que es cuando la variable "i" sea igual a 3. Ya que en ese caso "i" no va a ser menor a 3. * * Por lo que con todo esto, podemos resumir en que el codigo dentro del for, se ejecuta * unas 3 veces seguidas. Y con esto ultimo, tambien podemos decir que el codigo anterior se * podria hacer de la siguiente manera: * */
client_print(0, print_chat, "Soy el mensaje numero 0"); client_print(0, print_chat, "Soy el mensaje numero 1"); client_print(0, print_chat, "Soy el mensaje numero 2");
/* * * Es lo mismo, solo que con el loop FOR se ocupa menos espacio y se repite automaticamente, quizas * no se note mucho con un numero bajo como es el 3, pero si hablamos de un numero mayor, es mucho * mas notable la diferencia. * * Ahora, si a la condicion del FOR, le agregamos un nuevo operador como por ejemplo: * */
for(new i = 0; i <= 3; i++) { client_print(0, print_chat, "Soy el mensaje numero %d", i); }
/* * * Antes la condicion era "Si i es menor a 3". Pero ahora la condicion es "Si i es menor o igual a 3". * Y ya con ese simple operador agregado a la condicion, el codigo dentro del loop se ejecutaria 4 * veces, en vez de 3. Tambien podemos obtener el mismo resultado si hacemos "i < 4". * * Muchas veces el loop FOR se usa para obtener el id de todos los players, para poder ejecutarles * alguna funcion o algo, a todos de una. Por ejemplo, para pasarlos a spec o darles armas, etc... * * Y aca va un ejemplo de plugin para pasar a todos a spec: * */
#include <amxmodx> #include <amxmisc> #include <cstrike>
#define PLUGIN "All Spec" #define AUTHOR "Alucard" #define VERSION "0.0.1"
new gMaxPlayers;
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_clcmd("say /allspec", "HookCmdAllSpec"); gMaxPlayers = get_maxplayers(); }
public HookCmdAllSpec(id) { if(!is_user_admin(id) ) { client_print(id, print_chat, "Debes ser ADMIN para poder ejecutar esta accion!"); return PLUGIN_HANDLED; } for(new i = 1; i <= gMaxPlayers; i++) { if(cs_get_user_team(i) != CS_TEAM_SPEC) { if(is_user_alive(i) ) user_kill(i, 1); cs_set_user_team(i, CS_TEAM_SPECTATOR); } } return PLUGIN_HANDLED; } /* * * El maximo de jugadores permitidos por el juego, es de 32 (se obtiene mediante get_maxplayers) * por lo que usando el loop previamente mostrado, el codigo que se encuentra dentro de dicho * loop se ejecuta 32 veces. * * Es practicamente lo mismo a hacer lo siguiente: * */
if(cs_get_user_team(1) != CS_TEAM_SPEC) { if(is_user_alive(1) ) user_kill(1, 1); cs_Set_user_team(1, CS_TEAM_SPECTATOR); }
/* * * Y luego el mismo codigo unas 31 veces mas, cambiando el numero 1 por el 2 y asi sucesivamente * hasta llegar al numero 32. Haciendo esto se lograria un codigo enorme y totalmente absurdo, * cuando se puede hacer uso de los loops. Esa es la funcion y utilidad de los loops. * * El loop FOR tambien es usado usualmente para obtener ciertos datos dentro de las arrays que * contienen las variables. Aca un simple ejemplo: * */
#include <amxmodx>
#define PLUGIN "Vertical Name" #define AUTHOR "Alucard" #define VERSION "0.0.1"
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_clcmd("say /vname", "HookCmdName"); }
public HookCmdName(id) { new szName[32]; get_user_name(id, szName, 31); for(new i = 0; i < strlen(szName); i++) { client_print(id, print_chat, "%c", szName[i]); } return PLUGIN_HANDLED; } /* * * La funcion del plugin (que es mostrar tu nick verticalmente en el chat) probablemente no * funcione del todo bien, pero ese no es el punto. El punto es mostrar el uso del loop FOR, * que como ven, lo que hace es pasar por cada celda del array, de esta forma: szName[0], * szName[1], szName[2] y asi sucesivamente. Y como nosotros usamos strlen(szName), cuando * se complete el nombre, la condicion (segmento 2) del loop FOR no se cumplira, por lo tanto * se cerraria. Si nosotros hubieramos usado sizeof(szName) entonces el loop seguiria por * todas las celdas hasta llegar a szName[32] y esto haria que aparezcan varios espacios en * el chat (claro esta, a menos de que el nombre del player sea de 32 caracteres). * * * Como habia dicho antes, hay ciertas cosas del loop FOR que pueden variar, solo que los * ejemplos mostrados anteriormente son generalmente los mas usados. Pero, yo creo que * cuantos mas ejemplos a mostrar, mejor posibilidad de entender el tema, por lo que aca * dejo un ejemplo, cambiando ciertos parametros: * */
#include <amxmodx>
#define PLUGIN "Conteo Inverso" #define AUTHOR "Alucard" #define VERSION "0.0.1"
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_clcmd("say /conteo", "HookCmdName"); }
public HookCmdName(id) { new iNums[5] = { 1, 2, 3, 4, 5 }; for(new i = 5; i > 1; i--) { client_print(id, print_chat, "%d", iNums[i-1]); } return PLUGIN_HANDLED; }
__________________
Approved Plugins - Steam Profile
Public non-terminated projects:
All Admins Menu, HLTV parameters, Subnick,
Second Password (cool style), InfoZone,
Binary C4 plant/defuse, and more...
Private projects:
NoSpec (+menu), NV Surf Management,
PM Adanved System, KZ longjump2, and more...
|
|