Вопросы

Здравствуйте, прошу прощения, если я плохо пишу, я не очень хорошо говорю по-русски!

 

Мне нужно отсортировать массив по возрастанию, но у меня возникли проблемы!
 

#define Loop(%0,%1,%2) for(new %0 = %2; %0 < %1; %0++)

stock SortRandomEventRank(ordem_crescente=1)
{
    new total;
    if(ordem_crescente)
    {
        Loop(i, MAX_PLAYERS, 0)
        {
            if(RandomEventRank[i][RER_Total])
            {
                Loop(s, MAX_PLAYERS, 0)
                {
                    if(RandomEventRank[i][RER_Total] < RandomEventRank[s][RER_Total])
                    {
                        total = RandomEventRank[i][RER_Total];
                        RandomEventRank[i][RER_Total] = RandomEventRank[s][RER_Total];
                      
                        RandomEventRank[s][RER_Total] = total;
                    }
                }
            }
        }
    }

}

 

Поделиться сообщением


Ссылка на сообщение

18 ответов на этот вопрос

  • 0

Наконец, проявив огромное терпение, мне удалось объяснить это ChatGPT, и он наконец дал мне решение!

Спасибо всем, кто пытался мне помочь!

 

new array[13][1];

array[0][0] = 600;
array[1][0] = 0;
array[2][0] = 10;
array[3][0] = 5;
array[4][0] = 90;
array[5][0] = 700;
array[6][0] = 550;
array[7][0] = 0;
array[8][0] = 20;
array[9][0] = 90;
array[10][0] = 0;
array[11][0] = 0;
array[12][0] = 0;

new temp;
for(new i = 0; i < sizeof(array); i++)
{
        for(new j = 0; j < sizeof(array) - 1; j++)
        {
            if((array[j][0] == 0) || (array[j + 1][0] != 0 && array[j][0] > array[j + 1][0]))
            {
                temp = array[j][0];
                array[j][0] = array[j + 1][0];
                array[j + 1][0] = temp;
            }
        }
}
for (new i = 0; i < 13; i++)
{
       printf("array[%d][0] = %d", i, array[i][0]);
}

array[0][0] = 5
array[1][0] = 10
array[2][0] = 20
array[3][0] = 90
array[4][0] = 90
array[5][0] = 550
array[6][0] = 600
array[7][0] = 700
array[8][0] = 0
array[9][0] = 0
array[10][0] = 0
array[11][0] = 0
array[12][0] = 0

Поделиться сообщением


Ссылка на сообщение
  • 0
#define Loop(%0,%1,%2for(new %0 = %2; %0 < %1; %0++)

stock SortRandomEventRank(ordem_crescente = 1)
{
    if(ordem_crescente)
    {
        // Используем пузырьковую сортировку для простоты
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
            for(new s = 0; s < MAX_PLAYERS - 1; s++)
            {
                // Проверка на корректность индексов и значений
                if(RandomEventRank[s][RER_Total] > RandomEventRank[s + 1][RER_Total])
                {
                    // Меняем местами
                    new total = RandomEventRank[s][RER_Total];
                    RandomEventRank[s][RER_Total] = RandomEventRank[s + 1][RER_Total];
                    RandomEventRank[s + 1][RER_Total] = total;
                }
            }
        }
    }
}

Для сортировки, проверки на RandomEventRank[RER_Total] не требуются

Отредактировано пользователем DAYREK

Поделиться сообщением


Ссылка на сообщение
  • 0
10 минут назад, DAYREK сказал:

#define Loop(%0,%1,%2) for(new %0 = %2; %0 < %1; %0++)

 

stock SortRandomEventRank(ordem_crescente = 1)

{

    if(ordem_crescente)

    {

        // Use bubble sort for simplicity

        for(new i = 0; i < MAX_PLAYERS; i++)

        {

            for(new s = 0; s < MAX_PLAYERS - 1; s++)

            {

                // Check for correctness of indices and values

                if(RandomEventRank [RER_Total] > RandomEventRank [s + 1] [RER_Total])

                {

                    // Swap places

                    new total = RandomEventRank [RER_Total];

                    RandomEventRank [RER_Total] = RandomEventRank [s + 1] [RER_Total];

                    RandomEventRank [s + 1] [RER_Total] = total;

                }

            }

        }

    }

}

 

Вы использовали chatgpt, и этот скрипт не работает! Я перепробовал несколько скриптов через chatgps, и ни один из них не работает! Организация должна быть организована в порядке возрастания!

Поделиться сообщением


Ссылка на сообщение
  • 0

@JR_Junior Try this code
 

#define Loop(%0,%1,%2for(new %0 = %2; %0 < %1; %0++)

stock SortRandomEventRank(ordem_crescente = 1)
{
    new temp[MAX_PLAYERS][RER_FIELDS];

    Loop(i, MAX_PLAYERS, 0)
    {
        Loop(j, MAX_PLAYERS - 10)
        {
            if ((ordem_crescente && RandomEventRank[j][RER_Total] > RandomEventRank[j + 1][RER_Total]) ||
                (!ordem_crescente && RandomEventRank[j][RER_Total] < RandomEventRank[j + 1][RER_Total]))
            {
                Loop(k, RER_FIELDS, 0)
                {
                    temp[0][k] = RandomEventRank[j][k];
                    RandomEventRank[j][k] = RandomEventRank[j + 1][k];
                    RandomEventRank[j + 1][k] = temp[0][k];
                }
            }
        }
    }
}

 

Отредактировано пользователем Andrey Markelov

Поделиться сообщением


Ссылка на сообщение
  • 0

@Andrey Markelov Еще один скрипт ChatGPT! Это не работает, я уже перепробовал все эти скрипты, сгенерированные chatgpt!

Поделиться сообщением


Ссылка на сообщение
  • 0

Уехал с цикла в цикле

Сразу видно настоящих скриптеров

Топик-стартер, объясните пожалуйста, в чем задача? Что вы делаете?

Отредактировано пользователем Web

Поделиться сообщением


Ссылка на сообщение
  • 0

@Web 
Хорошо, я создаю систему событий, и одно из этих событий связано с наименьшим временем, которое потребовалось игроку для завершения события. Поэтому организация массива должна быть возрастающей, где позиция игрока определяется по наименьшему времени (в секундах):

 

RandomEventRank[5][RER_Total] = 600;
RandomEventRank[17][RER_Total] = 300;
RandomEventRank[8][RER_Total] = 400;
RandomEventRank[10][RER_Total] = 100;
RandomEventRank[3][RER_Total] = 599;
RandomEventRank[850][RER_Total] = 50;
RandomEventRank[900][RER_Total] = 1000;
RandomEventRank[999][RER_Total] = 1001;

SortRandomEventRank(1);
    
Loop(i,MAX_PLAYERS,0) printf("%d: %d",i+1,RandomEventRank[i][RER_Total]);

На первый взгляд все работает, но вот в чем проблема:
1: 50
2: 100
3: 300
4: 400
5: 599
6: 600
7: 1000
8: 0
9: 0
10: 1001
11: 0
12: 0
...

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@JR_Junior написал вам и сделал комментарии. Используйте эту систему, внедряя уже к вам. Это самая простая «сортировка»

Поделиться сообщением


Ссылка на сообщение
  • 0

@DAYREK Ваш код:

...
9890
9900
9910
9920
99350
994100
995300
996400
997599
998600
9991000
10001001

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@JR_Junior Вроде Вы получили что хотели, разве нет?

Если нет напишите болле подробно и с примером того как Вы видите ту сортировку, котоаря Вам нужна

Поделиться сообщением


Ссылка на сообщение
  • 0

@gais_st 

Поскольку это рейтинг, позиции должны быть следующими:

1: 50
2: 100
3: 300
4: 400
5: 599
6: 600
7: 1000
8: 1001
9: 0
10: 0
...


Итак, следующий код все еще не является ожидаемым результатом:
...
989: 0
990: 0
991: 0
992: 0
993: 50
994: 100
995: 300
996: 400
997: 599
998: 600
999: 1000
1000: 1001

Поделиться сообщением


Ссылка на сообщение
  • 0
#define Loop(%0,%1,%2for(new %0 = %2; %0 < %1; %0++)
stock SortRandomEventRank(ordem_crescente = 1)
{
    if(ordem_crescente)
    {
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
            for(new s = 0; s < MAX_PLAYERS - 1; s++)
            {
                if(RandomEventRank[s][RER_Total] > RandomEventRank[s + 1][RER_Total])
                {
                    new total = RandomEventRank[s][RER_Total];
                    RandomEventRank[s][RER_Total] = RandomEventRank[s + 1][RER_Total];
                    RandomEventRank[s + 1][RER_Total] = total;
                }
            }
        }
    }
    for(new playerIndex = 0; playerIndex < MAX_PLAYERS; playerIndex++)
    {
        if (RandomEventRank[playerIndex][RER_Total] > 0)
        {
            printf("%d: %d", playerIndex + 1, RandomEventRank[playerIndex][RER_Total]);
        }
    }
}
//Пробуйте так и меняйте нулевые значения вывода

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@DAYREK 

Извините, но это не решает проблему, просто не отображаются индексы с нулевым значением.

Цель состоит в том, чтобы организовать его, начиная с индекса 0, где индекс 0 (первое место), индекс 1 (второе место), индекс 2 (третье место) и т. д.

 

Ваш последний код выводит:

993: 50
994: 100
995: 300
996: 400
997: 599
998: 600
999: 1000
1000: 1001

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@JR_Junior Хорошо, понял, давайте тогда так, изменив макрос с %2 на 0, вывод должен начинаться с 0 теперь

#define Loop(%0,%1for(new %0 = 0; %0 < %1; %0++)
stock SortRandomEventRank(ordem_crescente = 1)
{
    if (ordem_crescente)
    {
        for (new i = 0; i < MAX_PLAYERS; i++)
        {
            for (new s = 0; s < MAX_PLAYERS - 1; s++)
            {
                if (RandomEventRank[s][RER_Total] > RandomEventRank[s + 1][RER_Total])
                {
                    new total = RandomEventRank[s][RER_Total];
                    RandomEventRank[s][RER_Total] = RandomEventRank[s + 1][RER_Total];
                    RandomEventRank[s + 1][RER_Total] = total;
                }
            }
        }
    }
    for (new playerIndex = 0; playerIndex < MAX_PLAYERS; playerIndex++)
    {
        if (RandomEventRank[playerIndex][RER_Total] > 0)
        {
            printf("%d: %d", playerIndex, RandomEventRank[playerIndex][RER_Total]);
        }
    }
}

Макрос должен принимает аргументы верха %1 и начинать цикл с 0.

Если у вас есть несколько игроков, и вы сортируете их по рейтингу, индексация будет зависеть от логики  и того, как вы обрабатываете данные.
Если ваши игроки начинаются с индекса 0 (что вы и хотите сделать), то индекс первого игрока будет 0, второго – 1 и так далее.
Однако, если вы хотите вывести данные так, чтобы они начинались с 1 (что может быть более удобным для пользователя), вы можете просто добавлять 1 к индексу при выводе.
Пример вывода, если у вас есть 5 игроков и их рейтинги после сортировки выглядят следующим образом:

15
210
315
420
525

Таким образом, у вас будет вывод без нклевого игрока, и номера будет начинаться с 1. Если же игрок с индексом 0 имеет рейтинг больше 0, то вы можете также включить его в вывод, просто изменив логику проверки и вывода.

А именно для вашего вывода, используйте этот код, теперь по вашему запросу я понял, как должно выводится loop
 

#define Loop(%0,%1for(new %0 = 0; %0 < %1; %0++)

stock SortRandomEventRank(ordem_crescente = 1)
{
    if (ordem_crescente)
    {
        for (new i = 0; i < MAX_PLAYERS; i++)
        {
            for (new s = 0; s < MAX_PLAYERS - 1; s++)
            {
                if (RandomEventRank[s][RER_Total] > RandomEventRank[s + 1][RER_Total])
                {
                    new total = RandomEventRank[s][RER_Total];
                    RandomEventRank[s][RER_Total] = RandomEventRank[s + 1][RER_Total];
                    RandomEventRank[s + 1][RER_Total] = total;
                }
            }
        }
    }
    for (new playerIndex = 1; playerIndex <= MAX_PLAYERS; playerIndex++) // Измените начало на 1 и конец на MAX_PLAYERS
    {
        printf("%d: %d", playerIndex, RandomEventRank[playerIndex - 1][RER_Total]); // Индексируем с 0, поэтому используем playerIndex - 1
    }
}

 

Отредактировано пользователем DAYREK

Поделиться сообщением


Ссылка на сообщение
  • 0

@DAYREK 
Я считаю, что это все еще не ясно:
Индекс (MAX_PLAYERS) массива не представляет реальные идентификаторы игроков, а скорее индекс RER_PlayerID. Чтобы представить позицию игроков, начиная с первого, мне нужна организация массива, чтобы начать с индекса 0:

printf("Position: %d | Name: %s | Total: %d",i+1,PlayerName(RandomEventRank[i][RER_PlayerID]),RandomEventRank[i][RER_Total]);

Вот весь код, чтобы вы могли понять цель:
stock SortRandomEventRank(ordem_crescente=1)
{
    new playerid,total,detalhes[25];
    if(ordem_crescente)
    {
        Loop(i, MAX_PLAYERS, 0)
        {
            Loop(s, MAX_PLAYERS-1, 0)
            {
                if(RandomEventRank[s][RER_Total] > RandomEventRank[s+1][RER_Total])
                {
                    playerid = RandomEventRank[s][RER_PlayerID];
                    total = RandomEventRank[s][RER_Total];
                    strmid(detalhes, RandomEventRank[s][RER_Detalhes], 0, 25);

                    RandomEventRank[s][RER_PlayerID] = RandomEventRank[s+1][RER_PlayerID];
                    RandomEventRank[s][RER_Total] = RandomEventRank[s+1][RER_Total];
                    strmid(RandomEventRank[s][RER_Detalhes], RandomEventRank[s+1][RER_Detalhes], 0, 25);

                    RandomEventRank[s+1][RER_PlayerID] = playerid;
                    RandomEventRank[s+1][RER_Total] = total;
                    strmid(RandomEventRank[s+1][RER_Detalhes], detalhes, 0, 25);
                }
            }
        }
    }
    else
    {
        Loop(i, MAX_PLAYERS, 0)
        {
            if(RandomEventRank[i][RER_Total])
            {
                Loop(s, MAX_PLAYERS, 0)
                {
                    if(RandomEventRank[i][RER_Total] > RandomEventRank[s][RER_Total])
                    {
                        playerid = RandomEventRank[i][RER_PlayerID];
                        total = RandomEventRank[i][RER_Total];
                        strmid(detalhes, RandomEventRank[i][RER_Detalhes], 0, 25);

                        RandomEventRank[i][RER_PlayerID] = RandomEventRank[s][RER_PlayerID];
                        RandomEventRank[i][RER_Total] = RandomEventRank[s][RER_Total];
                        strmid(RandomEventRank[i][RER_Detalhes], RandomEventRank[s][RER_Detalhes], 0, 25);

                        RandomEventRank[s][RER_PlayerID] = playerid;
                        RandomEventRank[s][RER_Total] = total;
                        strmid(RandomEventRank[s][RER_Detalhes], detalhes, 0, 25);
                    }
                }
            }
        }
    }
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@JR_Junior Я понял, вы осуществляете рейтинг и сортируете игроков по "рейтингу". Как игра игроков в футбол и после турнира, лучшие выводятся. Но... Я вам написал код для сортировки, от 1 до ... Далее вывод идет от 0, как требуется и даже протестировал, но, теперь я не могу понять еще более, проблема в чем? Вы можете показать пример, что происходит при выполнении?

Смотрите...

#define Loop(%0,%1for(new %0 = 0; %0 < %1; %0++)

stock SortRandomEventRank(ordem_crescente = 1)
{
    if (ordem_crescente)
    {
        for (new i = 0; i < MAX_PLAYERS; i++)
        {
            for (new s = 0; s < MAX_PLAYERS - 1; s++)
            {
                if (RandomEventRank[s][RER_Total] > RandomEventRank[s + 1][RER_Total])
                {
                    new total = RandomEventRank[s][RER_Total];
                    RandomEventRank[s][RER_Total] = RandomEventRank[s + 1][RER_Total];
                    RandomEventRank[s + 1][RER_Total] = total;
                }
            }
        }
    }
    for (new playerIndex = 1; playerIndex <= MAX_PLAYERS; playerIndex++) // Измените начало на 1 и конец на MAX_PLAYERS
    {
        printf("%d: %d", playerIndex, RandomEventRank[playerIndex - 1][RER_Total]); // Индексируем с 0, поэтому используем playerIndex - 1
    }
}

Вызываем функцию SortRandomEventRank(1), чтобы отсортировать по возрастанию. Функция пройдет через массив и отсортирует по очкам.
Далее идет следующий вывод:

150    // Игрок 1: 50 очков
275    // Игрок 3: 75 очков
3100   // Игрок 2: 100 очков

Так же, я надеюсь что ваш массив хранит в себе очки

Поделиться сообщением


Ссылка на сообщение
  • 0

Давайте поступим иначе, напишите пожалуйста в телеграм и попробуем решить вашу проблему Мой тг
Если перекидывает на главную, то юз @devnule

Поделиться сообщением


Ссылка на сообщение
  • 0

@DAYREK 

Ваш код приводит к:

...
989: 0
990: 0
991: 0
992: 0
993: 50
994: 100
995: 300
996: 400
997: 599
998: 600
999: 1000
1000: 1001

Но цель такова:

0: 50
1: 100
2: 300
3: 400
4: 599
5: 600
6: 1000
7: 1001
8: 0
9: 0
...

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Kutuzov
      От Kutuzov
      Всем привет, хотелось бы спросить у тех, кто разбирается в PluginSDK.
      Какие есть источники, руководства, документации о PluginSDK?
      Я пока что ничего нормального не нахожу.
      Заранее спасибо