Balanceo de equipos por adr
#1
Buenas noches familia, le dejo esta parte de código de un balanceo por puntos, no es la mejor forma de balancear, pero balancea, si alguien busca uno y le da flojera hacer uno use este, besos y no insulten mi primer aporte, un beso <3
Mario  Mario

Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <tag>

#define PLUGIN "Balanceodemierda bugeado de mierda porque no se porque imerda a veces no sirve si alguien lo averigua quedeselo mamaenmel el guebo"
#define VERSION "1.0"
#define AUTHOR "Samueldmq"

new Float:diffe;
new 
Float:promedios[2] = {0.00.0}; // Inicialización de promedios
new teammayorteammenor// Variables para saber que equipo es mayor / menor

public plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_srvcmd("balance""balanceTeams")
}

public 
balanceTeams() 
{
    new 
players[2][32], counts[2] = {00};
    
get_players(players[1], counts[1], "e""CT");
    if(
counts[1] < 5) {
        
client_print_color(00"^4%s^1 No se puede continuar con menos de^4 5^1 en el equipo ^3CT"TAG)
        
PugNextVote();
        return 
0
    
}

    
get_players(players[0], counts[0], "e""TERRORIST");
    if(
counts[0] < 5) {
        
client_print_color(00"^4%s^1 No se puede continuar con menos de^4 5^1 en el equipo ^3TT"TAG)
        
PugNextVote();
        return 
0
    
}
    
    new 
Float:userteaminfo[2][5][2]; 
    for(new 
team 0team 2team++) {
        for(new 
player 0player 5player++) {
            
userteaminfo[team][player][0] = StatsGetPlayerAdr(players[team][player])
            
userteaminfo[team][player][1] = float(players[team][player])
        }
    }

    new 
Float:tempmayor 0.0;
    new 
postempmayor// tempmayor para guardar el adr mayor, y postempmayor para guardar el usuario con dicho adr
    
new bool:bFinish falsebool:isEncontrado false;
    
    for(new 
team 0team <= 1team++) { // Recorrido de los usuarios de cada equipo para sacar el promedio
        
for(new player 0player <= 4player++) {
            if(
userteaminfo[team][player][0] < 1) {
                continue;
            }
            
promedios[team] += userteaminfo[team][player][0]; // team i, usuario j, adr
        
}
        
promedios[team] /= 5.0// promedio
    
}
    
    
diffe diff(promedios[0], promedios[1]); // obtenemos la diferencia entre ambos equipos
    
    
if(promedios[0] < promedios[1]) { // Obtenemos el equipo mayor y menor
        
teammayor 1teammenor 0
    } else if(
promedios[0] > promedios[1]) {
        
teammayor 0teammenor 1;
    } else {
        return 
0;  // en caso de que sean iguales significa que ya está perfectamente balanceado entonces sale de la funcion
    
}
    
    while(!
bFinish) { // Bucle de balanceo
        
bFinish true// Cambiamos la variable de finish a true
        
for(new playertt 0playertt <= 4playertt++) { // Bucle para comparar cada usuario del equipo tt con los otros 5 ct
            
tempmayor 0.0;
            for(new 
playerct 0playerct <= 4playerct++) { // bucle para comparar con los otros 5 ct
                
if(userteaminfo[teammayor][playertt][0] > userteaminfo[teammenor][playerct][0]) { // Para conseguir un efecto de balanceo buscamos el jugador con más adr del equipo ct que sea menor que el jugador tt a comparar
                    
if(userteaminfo[teammenor][playerct][0] > tempmayor) { // obtenemos temporalmente cual es el que cumple los requisitos
                        
tempmayor userteaminfo[teammenor][playerct][0]; // guardamos el adr del compa
                        
postempmayor playerct// la posicion en el arreglo del compa
                        
isEncontrado true// Marcamos que encontro un posible jugador a balancear
                    
}
                }
            } 
// al salir de aqui tendremos ya la posicion del usuario y el adr que mejor balancea

            // Chequeamos si luego del cambio realmente disminuyó la diferencia de adr entre ambos equipos
            // Si si mejoro la diferencia se intercambian los usuarios y adr en el array
            
if(isEncontrado && isOptimization(promedios[teammenor], promedios[teammayor], userteaminfo[teammenor][postempmayor][0], userteaminfo[teammayor][playertt][0])) {
                new 
Float:aux userteaminfo[teammayor][playertt][0]; // intercambio del adr 
                
userteaminfo[teammayor][playertt][0] = userteaminfo[teammenor][postempmayor][0];
                
userteaminfo[teammenor][postempmayor][0] = aux;
                
                
aux userteaminfo[teammayor][playertt][1]; // intercambio de las id
                
userteaminfo[teammayor][playertt][1] = userteaminfo[teammenor][postempmayor][1];
                
userteaminfo[teammenor][postempmayor][1] = aux;
                
                
bFinish false// Como hubo un cambio cambiamos marcamos que quiza necesitaremos otra vuelta del while
            
}
            
isEncontrado false// volvemos a cambiar la variable que marca si se encontro o no
        
}
        
        if(
promedios[0] < promedios[1]) { // Volvemos a calcular los promedios para saber que equipo es mayor y menor
            
teammayor 1teammenor 0;
        } else if(
promedios[0] > promedios[1]) {
            
teammayor 0teammenor 1;
        } else {
            
bFinish true;  // en caso de que sean iguales entonces marcamos el final del while poq ya no hay nada que balancear
        
}
    }
    
    
counts[0] = 0
    counts
[1] = 0
    
    
for(new 02i++) { // Ahora procedemos a hacer valer el balanceo y seteamos los equipos de cada player segun lo hecho en el while
        
for(new 05j++) {
            if(!
is_user_connected(floatround(userteaminfo[i][j][1]))) {
                
counts[i]++
                continue
            }
            
cs_set_user_team(floatround(userteaminfo[i][j][1]), i+1// userteaminfo[i][j][1] es la id del usuario, y con i+1 marcamos si es TT(1) o CT (2)
        
}
    }
    
    new 
count
    
    
if(counts[0] >= || counts[1] >= 1) {
        
get_players(players[0], count"e""SPECTATOR");
        if(
count && count >= (counts[0]+counts[1])) {
            new 
user 0;
            while(
counts[0] > && counts[1] > 0) {
                
cs_set_user_team(players[0][user], (counts[0] > 0) ? 1:2)
                
counts[(counts[0] > 0) ? 0:1]--
                
user++
            }
            
balanceTeams()
            return -
1
        
} else {
            
client_print_color(0, -1"^4%s^1 No hay jugadores suficientes para jugar balanceado"TAG)

            return 
0
        
}
    }
    
    
client_print_color(0, -1"^4%s^1 Balanceo XD TT = %0.02f, CT = %0.02f"TAGpromedios[0], promedios[1])
    
PugNextVote();
    
    return 
1// Returnamos 1 poq aja todo bien XD
}

Float:diff(Float:promedio1Float:promedio2) { // Funcion pa obtener la diferencia entre dos promedios
    
if(promedio1 promedio2) {
        return 
promedio1 promedio2;
    } else {
        return 
promedio2 promedio1;   
    }
}

bool:isOptimization(Float:promedio1Float:promedio2Float:cambio1Float:cambio2) { // Funcion pa chequear si es optimo o no el cambio
    
new Float:prom[2]; // promedios de ambos equipos
    
new Float:dif// variable para obtener la diferencia obtenida
    
    
prom[teammenor] = promedio1-(cambio1/5)+(cambio2/5); // el promedio1 le restamos el adr del jugador que le cambiaremos y le sumamos el adr del jugador que se unira
    
prom[teammayor] = promedio2-(cambio2/5)+(cambio1/5); // Lo mismo que lo de arriba pero con el promedio2
    
    
dif diff(prom[teammenor], prom[teammayor]); // Calcular la diferencia entre ambos promedios
    
    
    
if(dif diffe) { // Si la diferencia obtenida es menor que la diferencia que habia previamente significa que mejora el balanceo
        
diffe dif// Colocamos que ahora la nueva diferencia sera la obtenida aqui
        
        
promedios[teammenor] = prom[teammenor];
        
promedios[teammayor] = prom[teammayor];
        return 
true// devolvemos que efectivamente es más optimo
    
} else {
        return 
false;   // en caso de que no pos, no es optimo XD
    
}

Estoy cansado de este sufrimiento llamado vivir en Venezuela
Okay
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)