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

Есть цыкл который вызывается 6 раз и каждый вызов он записывает рандомное число и
Как проверить все 6 переменных на одинаковые значения
PHP код:
for(new x6++)
{
    
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 x6++) 

    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 x6++) 

    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 0sizeof(rand_array); i++){    tak_blet_isho_raz:    int rand_number random(10);    for(int x 0ix++)    {        if(rand_array[x] == rand_number)        {            goto tak_blet_isho_raz;        }    }} 
с телефона написал, попробуй.
Reply
#5

PHP код:
function bool:haveValue(const sourceArray[], valuelimit sizeof(sourceArray)) {
    for (new 
0limiti++) {
        if (
sourceArray[i] === value) return true;
    }
    return 
false;
}
for(new 
x6++)
{
    new 
value;
    do {
        
value random(10)
    } while(
haveValue(AdditionalResetvaluex));
    
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 
sizei--;)
    {
        
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(10tmp_arr_rand_num);
    for(new 
0sizeof(rand_array); i++)
    {
        
rand_array[i] = GetRandomNumberFromArr(tmp_arr_rand_num);
        
printf("rand_array[%d] = %d"irand_array[i]);
    }
    
    
ReInitRandomNumberArr(tmp_arr_rand_num);
    for(new 
0sizeof(rand_array); i++)
    {
        
rand_array[i] = GetRandomNumberFromArr(tmp_arr_rand_num);
        
printf("rand_array2[%d] = %d"irand_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[], valuelimit sizeof(sourceArray)) {
    for (new 
0limiti++) {
        if (
sourceArray[i] === value) return true;
    }
    return 
false;
}
for(new 
x6++)
{
    new 
value;
    do {
        
value random(10)
    } while(
haveValue(AdditionalResetvaluex));
    
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 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23875) : error 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23876) : error 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23878) : error 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZSs.pwn(23939) : error 017undefined symbol "haveValue"
Pawn compiler 3.2.3664              Copyright (c1997-2006ITB CompuPhase
5 Errors

Reply
#10

Quote:
Originally Posted by Bren
Посмотреть сообщение
PHP код:
C:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23874) : error 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23875) : error 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23876) : error 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZS.pwn(23878) : error 010invalid function or declaration
C
:\Users\admin\Desktop\ZS\gamemodes\ZSs.pwn(23939) : error 017undefined symbol "haveValue"
Pawn compiler 3.2.3664              Copyright (c1997-2006ITB CompuPhase
5 Errors

Что за бездари пошли, не могут банальные ошибки поправить =\

PHP код:
bool:haveValue(const sourceArray[], valuelimit sizeof sourceArray) {
    for (new 
0limiti++) {
        if (
sourceArray[i] == value) return true;
    }
    return 
false;
}
for(new 
x6++)
{
    new 
value;
    do {
        
value random(10);
    } while (
haveValue(AdditionalResetvaluex));
    
AdditionalReset[x] = value;

Reply
#11

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

PHP Code:
new MapPlayer[49][2] =
{
//  {От и До игроков.}
    
{1,  20},
    {
2131},
    {
2131},
    {
2131},
    {
1,  20},
    {
1,  20},
    {
2131},//6
    
{1,  20},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21,  31},
    {
1,  20},//12
    
{3242},//Остров ИЛИ от 43 до 52
    
{2131},
    {
1,  20},
    {
1,  20},
    {
3242},//17
    
{2131},
    {
3242},//19
    
{2131},//20
    
{3242},//21
    
{3242},
    {
2131},
    {
1,  20},
    {
1,  20},
    {
2131},//26
    
{3242},//27
    
{2131},//28
    
{2131},//29
    
{3242},//30
    
{3242},//31
    
{2131},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
2131},
    {
2131},//37
    
{3242},
    {
1,  20},
    {
2131},//20
    
{2131},//41
    
{2131},//42
    
{3242},//43
    
{3242},//44
    
{2131},
    {
1,  20},
    {
1,  20},
    {
1,  20}//48
};
for(new 
x6++)
{
    
Rand:
    new 
value;
    do
    {
        
value random(sizeof(MapPlayer));
    }
    while(
haveValue(AdditionalResetvaluex));
    
printf("%d %d"valuex);
    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 
sizei--;)
    {
        
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(numberrand_arr[], size sizeof(rand_arr))
{
    --
size;
    if(
number sizenumber size;
    if(
number 1number 1;
    
rand_arr[size] = number;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define MAX_MAPS (49)
new MapPlayer[MAX_MAPS][2] =
{
//  {?? ? ?? ???????.}
    
{1,  20},
    {
2131},
    {
2131},
    {
2131},
    {
1,  20},
    {
1,  20},
    {
2131},//6
    
{1,  20},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21,  31},
    {
1,  20},//12
    
{3242},//?????? ??? ?? 43 ?? 52
    
{2131},
    {
1,  20},
    {
1,  20},
    {
3242},//17
    
{2131},
    {
3242},//19
    
{2131},//20
    
{3242},//21
    
{3242},
    {
2131},
    {
1,  20},
    {
1,  20},
    {
2131},//26
    
{3242},//27
    
{2131},//28
    
{2131},//29
    
{3242},//30
    
{3242},//31
    
{2131},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
2131},
    {
2131},//37
    
{3242},
    {
1,  20},
    {
2131},//20
    
{2131},//41
    
{2131},//42
    
{3242},//43
    
{3242},//44
    
{2131},
    {
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 
0MAX_MAPSm++)//Для начала найдём подxодящие арены
    
{
        if(
MapPlayer[m][0] <= 32 <= MapPlayer[m][1]) // проверка по онлайну, сейчас 32 игрока
        
{
            
tmp_MapPlayer[tmp_MapCount] = m;
            
tmp_MapCount++;
        }
    }
    
    
InitRandomNumberArr(MAX_MAPStmp_arr_rand_num);//Инициализируем массив под рандом (язык статичный, выделяем максимальный размер MAX_MAPS)
    
SetRandomMaxNumberArr(tmp_MapCounttmp_arr_rand_num);//Установим максимальное рандомное число (tmp_MapCount), сколько у нас карт подошло под условие
    
    
for(new 06m++)//Получим рандомные 6 карт
    
{
        new 
value GetRandomNumberFromArr(tmp_arr_rand_num);
        if(
value > -1)
        {
            
random_Maps[m] = tmp_MapPlayer[value];
        }
    }
    for(new 
06m++)//Приведём массив в порядок
    
{
        if(
random_Maps[m] == -1)
        {
            new 
bool:bOK false;
            for(new 
m6k++)
            {
                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 
0sizeof(random_Maps); i++)
    {
        
printf("random_Maps[%d] = %d"irandom_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 
sizei--;)
    {
        
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(numberrand_arr[], size sizeof(rand_arr))
{
    --
size;
    if(
number sizenumber size;
    if(
number 1number 1;
    
rand_arr[size] = number;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define MAX_MAPS (49)
new MapPlayer[MAX_MAPS][2] =
{
//  {?? ? ?? ???????.}
    
{1,  20},
    {
2131},
    {
2131},
    {
2131},
    {
1,  20},
    {
1,  20},
    {
2131},//6
    
{1,  20},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
21,  31},
    {
1,  20},//12
    
{3242},//?????? ??? ?? 43 ?? 52
    
{2131},
    {
1,  20},
    {
1,  20},
    {
3242},//17
    
{2131},
    {
3242},//19
    
{2131},//20
    
{3242},//21
    
{3242},
    {
2131},
    {
1,  20},
    {
1,  20},
    {
2131},//26
    
{3242},//27
    
{2131},//28
    
{2131},//29
    
{3242},//30
    
{3242},//31
    
{2131},
    {
1,  20},
    {
1,  20},
    {
1,  20},
    {
2131},
    {
2131},//37
    
{3242},
    {
1,  20},
    {
2131},//20
    
{2131},//41
    
{2131},//42
    
{3242},//43
    
{3242},//44
    
{2131},
    {
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 
0MAX_MAPSm++)//Для начала найдём подxодящие арены
    
{
        if(
MapPlayer[m][0] <= 32 <= MapPlayer[m][1]) // проверка по онлайну, сейчас 32 игрока
        
{
            
tmp_MapPlayer[tmp_MapCount] = m;
            
tmp_MapCount++;
        }
    }
    
    
InitRandomNumberArr(MAX_MAPStmp_arr_rand_num);//Инициализируем массив под рандом (язык статичный, выделяем максимальный размер MAX_MAPS)
    
SetRandomMaxNumberArr(tmp_MapCounttmp_arr_rand_num);//Установим максимальное рандомное число (tmp_MapCount), сколько у нас карт подошло под условие
    
    
for(new 06m++)//Получим рандомные 6 карт
    
{
        new 
value GetRandomNumberFromArr(tmp_arr_rand_num);
        if(
value > -1)
        {
            
random_Maps[m] = tmp_MapPlayer[value];
        }
    }
    for(new 
06m++)//Приведём массив в порядок
    
{
        if(
random_Maps[m] == -1)
        {
            new 
bool:bOK false;
            for(new 
m6k++)
            {
                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 
0sizeof(random_Maps); i++)
    {
        
printf("random_Maps[%d] = %d"irandom_Maps[i]);
    }
    
    return 
1;

Расплачусь за него

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

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


Forum Jump:


Users browsing this thread: 1 Guest(s)