Цыкл как проверить на одинаковые значения
#1

Есть цыкл который вызывается 6 раз и каждый вызов он записывает рандомное число и
Как проверить все 6 переменных на одинаковые значения
PHP код:
for(new x; x < 6; x ++)
{
    
Rand:
    
AdditionalReset[x] = random(10);
    if(
AdditionalReset[x] == Arena[0] || MapPlayer[AdditionalReset[x]][0] <= PlayerOnline[1] <= MapPlayer[AdditionalReset[x]][1]) goto Rand;
} 
Reply
#2

goto!?
=>
PHP код:
for(new x; x < 6; x ++) 
{ 
    do {
        
AdditionalReset[x] = random(10); 
    } while (
AdditionalReset[x] == Arena[0] || MapPlayer[AdditionalReset[x]][0] <= PlayerOnline[1] <= MapPlayer[AdditionalReset[x]][1]);
} 
Reply
#3

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
goto!?
=>
PHP код:
for(new x; x < 6; x ++) 
{ 
    do {
        
AdditionalReset[x] = random(10); 
    } while (
AdditionalReset[x] == Arena[0] || MapPlayer[AdditionalReset[x]][0] <= PlayerOnline[1] <= MapPlayer[AdditionalReset[x]][1]);
} 
И как же проверить AdditionalReset[x] == AdditionalReset[i] на одинаковые значения.
Я тут накидал получился бред...
Reply
#4

PHP код:
int rand_array[6];for(int i = 0; i < sizeof(rand_array); i++){    tak_blet_isho_raz:    int rand_number = random(10);    for(int x = 0; x < i; x++)    {        if(rand_array[x] == rand_number)        {            goto tak_blet_isho_raz;        }    }} 
с телефона написал, попробуй.
Reply
#5

PHP код:
function bool:haveValue(const sourceArray[], value, limit = sizeof(sourceArray)) {
    for (new 
i = 0; i < limit; i++) {
        if (
sourceArray[i] === value) return true;
    }
    return 
false;
}
for(new 
x; x < 6; x ++)
{
    new 
value;
    do {
        
value = random(10)
    } while(
haveValue(AdditionalReset, value, x));
    
AdditionalReset[x] = value
    
if(AdditionalReset[x] == Arena[0] || MapPlayer[AdditionalReset[x]][0] <= PlayerOnline[1] <= MapPlayer[AdditionalReset[x]][1]) goto Rand;
} 
Reply
#6

Это конечно всё рабочие варианты, но можно словить рекурсию. Чтобы не словить рекурсию есть и такой вариант.
Минус: выделяемая память, точно не для больших диапазонов.
Плюс: отсутствие рекурсии и получение рандомного числа во всех случаях.
PHP код:
#include <a_samp>
#define InitRandomNumberArr(%0,%1) new %1[%0+1]; ReInitRandomNumberArr(%1, %0+1)
stock ReInitRandomNumberArr(rand_arr[], size = sizeof(rand_arr))
{
    for(new 
i = size; i--;)
    {
        
rand_arr[i] = i;
    }
}
stock GetRandomNumberFromArr(rand_arr[], size = sizeof(rand_arr))
{
    if(
rand_arr[--size] == 0)
    {
        return -
1;
    }
    new 
num = random(rand_arr[size]);
    new 
r_num = rand_arr[num];
    
rand_arr[num] = rand_arr[--rand_arr[size]];
    return 
r_num;
}
public 
OnFilterScriptInit()
{
    new 
rand_array[6];
    
InitRandomNumberArr(10, tmp_arr_rand_num);
    for(new 
i = 0; i < sizeof(rand_array); i++)
    {
        
rand_array[i] = GetRandomNumberFromArr(tmp_arr_rand_num);
        
printf("rand_array[%d] = %d", i, rand_array[i]);
    }
    
    
ReInitRandomNumberArr(tmp_arr_rand_num);
    for(new 
i = 0; i < sizeof(rand_array); i++)
    {
        
rand_array[i] = GetRandomNumberFromArr(tmp_arr_rand_num);
        
printf("rand_array2[%d] = %d", i, rand_array[i]);
    }
    return 
1;
} 
P.S. подправил код.
Reply
#7

Quote:
Originally Posted by White_116
Посмотреть сообщение
Это конечно всё рабочие варианты, но можно словить рекурсию.
Ни в одном из кодов выше невозможна рекурсия.
Reply
#8

В моем первом варианте это возможно, при условии, что рандомное максимальное число будет меньше размера массива. Также может получится так, что будет очень много раз выпадать рандомное число которое уже есть в массиве...
Reply
#9

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
PHP код:
function bool:haveValue(const sourceArray[], value, limit = sizeof(sourceArray)) {
    for (new 
i = 0; i < limit; i++) {
        if (
sourceArray[i] === value) return true;
    }
    return 
false;
}
for(new 
x; x < 6; x ++)
{
    new 
value;
    do {
        
value = random(10)
    } while(
haveValue(AdditionalReset, value, x));
    
AdditionalReset[x] = value
    
if(AdditionalReset[x] == Arena[0] || MapPlayer[AdditionalReset[x]][0] <= PlayerOnline[1] <= MapPlayer[AdditionalReset[x]][1]) goto Rand;
} 
PHP код:
C:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23874) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23875) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23876) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23878) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZSs.pwn(23939) : error 017: undefined symbol "haveValue"
Pawn compiler 3.2.3664              Copyright (c) 1997-2006, ITB CompuPhase
5 Errors
. 
Reply
#10

Quote:
Originally Posted by Bren
Посмотреть сообщение
PHP код:
C:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23874) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23875) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23876) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23878) : error 010: invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZSs.pwn(23939) : error 017: undefined symbol "haveValue"
Pawn compiler 3.2.3664              Copyright (c) 1997-2006, ITB CompuPhase
5 Errors
. 
Что за бездари пошли, не могут банальные ошибки поправить =\

PHP код:
bool:haveValue(const sourceArray[], value, limit = sizeof sourceArray) {
    for (new 
i = 0; i < limit; i++) {
        if (
sourceArray[i] == value) return true;
    }
    return 
false;
}
for(new 
x; x < 6; x ++)
{
    new 
value;
    do {
        
value = random(10);
    } while (
haveValue(AdditionalReset, value, x));
    
AdditionalReset[x] = value;
} 
Reply
#11

Проверка карты на вместимость игроков
При выставление значения PlayerOnline[1] до 23 игроков должны показываться карты от 21 до 31 игрока и они показываются но вместе с ними показываются карты от 1 и до 20 игроков.
В чем ошибка вроде проверка на Online правильная

PHP Code:
new MapPlayer[49][2] =
{
//  {От и До игроков.}
    
{1,  20},
    {
21, 31},
    {
21, 31},
    {
21, 31},
    {
1,  20},
    {
1,  20},
    {
21, 31},//6
    
{1,  20},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21,  31},
    {
1,  20},//12
    
{32, 42},//Остров ИЛИ от 43 до 52
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
32, 42},//17
    
{21, 31},
    {
32, 42},//19
    
{21, 31},//20
    
{32, 42},//21
    
{32, 42},
    {
21, 31},
    {
1,  20},
    {
1,  20},
    {
21, 31},//26
    
{32, 42},//27
    
{21, 31},//28
    
{21, 31},//29
    
{32, 42},//30
    
{32, 42},//31
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21, 31},
    {
21, 31},//37
    
{32, 42},
    {
1,  20},
    {
21, 31},//20
    
{21, 31},//41
    
{21, 31},//42
    
{32, 42},//43
    
{32, 42},//44
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
1,  20}//48
};
for(new 
x; x < 6; x ++)
{
    
Rand:
    new 
value;
    do
    {
        
value = random(sizeof(MapPlayer));
    }
    while(
haveValue(AdditionalReset, value, x));
    
printf("%d %d", value, x);
    if(
value == Arena[0] || 
//сама проверка
    
MapPlayer[value][1] >= PlayerOnline[1] <= MapPlayer[value][0]) goto Rand;
    
AdditionalReset[x] = value;
} 
мне кажется я не умею объяснять
Reply
#12

Bren, начни с простого, самого простого!
Потом глядишь и сам начнешь понимать.
Reply
#13

Quote:
Originally Posted by SoNikMells
View Post
Bren, начни с простого, самого простого!
Потом глядишь и сам начнешь понимать.
Спасибо за совет.
PHP Code:
if(value == Arena[0] || MapPlayer[value][0] > PlayerOnline[1] || PlayerOnline[1] > MapPlayer[value][1]) 
Reply
#14

С тебя печенье.
PHP Code:
#include <a_samp>
#define InitRandomNumberArr(%0,%1) new %1[%0+1]; ReInitRandomNumberArr(%1, %0+1)
stock ReInitRandomNumberArr(rand_arr[], size = sizeof(rand_arr))
{
    for(new 
i = size; i--;)
    {
        
rand_arr[i] = i;
    }
}
stock GetRandomNumberFromArr(rand_arr[], size = sizeof(rand_arr))
{
    if(
rand_arr[--size] == 0)
    {
        return -
1;
    }
    new 
num = random(rand_arr[size]);
    new 
r_num = rand_arr[num];
    
rand_arr[num] = rand_arr[--rand_arr[size]];
    return 
r_num;
}
stock SetRandomMaxNumberArr(number, rand_arr[], size = sizeof(rand_arr))
{
    --
size;
    if(
number > size) number = size;
    if(
number < 1) number = 1;
    
rand_arr[size] = number;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define MAX_MAPS (49)
new MapPlayer[MAX_MAPS][2] =
{
//  {?? ? ?? ???????.}
    
{1,  20},
    {
21, 31},
    {
21, 31},
    {
21, 31},
    {
1,  20},
    {
1,  20},
    {
21, 31},//6
    
{1,  20},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21,  31},
    {
1,  20},//12
    
{32, 42},//?????? ??? ?? 43 ?? 52
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
32, 42},//17
    
{21, 31},
    {
32, 42},//19
    
{21, 31},//20
    
{32, 42},//21
    
{32, 42},
    {
21, 31},
    {
1,  20},
    {
1,  20},
    {
21, 31},//26
    
{32, 42},//27
    
{21, 31},//28
    
{21, 31},//29
    
{32, 42},//30
    
{32, 42},//31
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21, 31},
    {
21, 31},//37
    
{32, 42},
    {
1,  20},
    {
21, 31},//20
    
{21, 31},//41
    
{21, 31},//42
    
{32, 42},//43
    
{32, 42},//44
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
1,  20}//48
};
public 
OnFilterScriptInit()
{
    new 
random_Maps[6] = {-1, ...};
    new 
tmp_MapPlayer[MAX_MAPS] = {-1, ...};
    new 
tmp_MapCount = 0;
    
    for(new 
m = 0; m < MAX_MAPS; m++)//Для начала найдём подxодящие арены
    
{
        if(
MapPlayer[m][0] <= 32 <= MapPlayer[m][1]) // проверка по онлайну, сейчас 32 игрока
        
{
            
tmp_MapPlayer[tmp_MapCount] = m;
            
tmp_MapCount++;
        }
    }
    
    
InitRandomNumberArr(MAX_MAPS, tmp_arr_rand_num);//Инициализируем массив под рандом (язык статичный, выделяем максимальный размер MAX_MAPS)
    
SetRandomMaxNumberArr(tmp_MapCount, tmp_arr_rand_num);//Установим максимальное рандомное число (tmp_MapCount), сколько у нас карт подошло под условие
    
    
for(new m = 0; m < 6; m++)//Получим рандомные 6 карт
    
{
        new 
value = GetRandomNumberFromArr(tmp_arr_rand_num);
        if(
value > -1)
        {
            
random_Maps[m] = tmp_MapPlayer[value];
        }
    }
    for(new 
m = 0; m < 6; m++)//Приведём массив в порядок
    
{
        if(
random_Maps[m] == -1)
        {
            new 
bool:bOK = false;
            for(new 
k = m; k < 6; k++)
            {
                if(
random_Maps[k] > -1)
                {
                    
random_Maps[m] = random_Maps[k];
                    
random_Maps[k] = -1;
                    
bOK = true;
                }
            }
            if(
bOK == false)
            {
                break;
            }
        }
    }
    
printf("tmp_MapCount = %d", tmp_MapCount);
    for(new 
i = 0; i < sizeof(random_Maps); i++)
    {
        
printf("random_Maps[%d] = %d", i, random_Maps[i]);
    }
    
    return 
1;
} 
Reply
#15

Quote:
Originally Posted by White_116
View Post
С тебя печенье.
PHP Code:
#include <a_samp>
#define InitRandomNumberArr(%0,%1) new %1[%0+1]; ReInitRandomNumberArr(%1, %0+1)
stock ReInitRandomNumberArr(rand_arr[], size = sizeof(rand_arr))
{
    for(new 
i = size; i--;)
    {
        
rand_arr[i] = i;
    }
}
stock GetRandomNumberFromArr(rand_arr[], size = sizeof(rand_arr))
{
    if(
rand_arr[--size] == 0)
    {
        return -
1;
    }
    new 
num = random(rand_arr[size]);
    new 
r_num = rand_arr[num];
    
rand_arr[num] = rand_arr[--rand_arr[size]];
    return 
r_num;
}
stock SetRandomMaxNumberArr(number, rand_arr[], size = sizeof(rand_arr))
{
    --
size;
    if(
number > size) number = size;
    if(
number < 1) number = 1;
    
rand_arr[size] = number;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define MAX_MAPS (49)
new MapPlayer[MAX_MAPS][2] =
{
//  {?? ? ?? ???????.}
    
{1,  20},
    {
21, 31},
    {
21, 31},
    {
21, 31},
    {
1,  20},
    {
1,  20},
    {
21, 31},//6
    
{1,  20},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21,  31},
    {
1,  20},//12
    
{32, 42},//?????? ??? ?? 43 ?? 52
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
32, 42},//17
    
{21, 31},
    {
32, 42},//19
    
{21, 31},//20
    
{32, 42},//21
    
{32, 42},
    {
21, 31},
    {
1,  20},
    {
1,  20},
    {
21, 31},//26
    
{32, 42},//27
    
{21, 31},//28
    
{21, 31},//29
    
{32, 42},//30
    
{32, 42},//31
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21, 31},
    {
21, 31},//37
    
{32, 42},
    {
1,  20},
    {
21, 31},//20
    
{21, 31},//41
    
{21, 31},//42
    
{32, 42},//43
    
{32, 42},//44
    
{21, 31},
    {
1,  20},
    {
1,  20},
    {
1,  20}//48
};
public 
OnFilterScriptInit()
{
    new 
random_Maps[6] = {-1, ...};
    new 
tmp_MapPlayer[MAX_MAPS] = {-1, ...};
    new 
tmp_MapCount = 0;
    
    for(new 
m = 0; m < MAX_MAPS; m++)//Для начала найдём подxодящие арены
    
{
        if(
MapPlayer[m][0] <= 32 <= MapPlayer[m][1]) // проверка по онлайну, сейчас 32 игрока
        
{
            
tmp_MapPlayer[tmp_MapCount] = m;
            
tmp_MapCount++;
        }
    }
    
    
InitRandomNumberArr(MAX_MAPS, tmp_arr_rand_num);//Инициализируем массив под рандом (язык статичный, выделяем максимальный размер MAX_MAPS)
    
SetRandomMaxNumberArr(tmp_MapCount, tmp_arr_rand_num);//Установим максимальное рандомное число (tmp_MapCount), сколько у нас карт подошло под условие
    
    
for(new m = 0; m < 6; m++)//Получим рандомные 6 карт
    
{
        new 
value = GetRandomNumberFromArr(tmp_arr_rand_num);
        if(
value > -1)
        {
            
random_Maps[m] = tmp_MapPlayer[value];
        }
    }
    for(new 
m = 0; m < 6; m++)//Приведём массив в порядок
    
{
        if(
random_Maps[m] == -1)
        {
            new 
bool:bOK = false;
            for(new 
k = m; k < 6; k++)
            {
                if(
random_Maps[k] > -1)
                {
                    
random_Maps[m] = random_Maps[k];
                    
random_Maps[k] = -1;
                    
bOK = true;
                }
            }
            if(
bOK == false)
            {
                break;
            }
        }
    }
    
printf("tmp_MapCount = %d", tmp_MapCount);
    for(new 
i = 0; i < sizeof(random_Maps); i++)
    {
        
printf("random_Maps[%d] = %d", i, random_Maps[i]);
    }
    
    return 
1;
} 
Расплачусь за него

С тебя пончик.
Reply
#16

Так кому что отправлять? Почта России нормально?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)