Вверх ↑
Ответов: 527
#1: 2013-08-21 23:42:19 ЛС | профиль | цитата
Всем добрый вечер!

Сортировка сундука

Предлагаю реализацию наслышанной сортировки сундуков, так и не получившей должной идеи реализации...
Кнопка сортировки располагается справа от кнопок "выброса и сброса" в сундук/инвентарь.
картинка

При клике по этой кнопкой левой кнопкой мышки происходит сортировка этого сундука.
При клике по этой кнопкой правой кнопкой мышки, показывается окошко(подобно окну привата) настройки правил сортировки.
Пункты настройки

    Сортировка по убыванию/возрастанию(bool)
    Стыковать блоки(bool)
    Тип сортировки вертикальный/горизонтальный(bool)
    ПРОЛИСТЫВАЮЩИЙСЯ СПИСОК ГОТОВЫХ ПРИОРИТЕТОВ(стандартные приоритеты)(list)
    ПОЛЬЗОВАТЕЛЬСКИЕ ПРИОРИТЕТЫ(приоритеты загруженные игроком)(list)
    Загрузка пользовательского приоритета из файла txt(обзор файла)

Варианты вида настроек сортировок *.txt

Экономичный вариант

Вид: (ID;\nID;\n...)(\n - начало новой строки, все что после ";" считается комментарием)
30; допустим, что алмаз самый приоритетный
210; песок
90; награда
Плюсы:
    Минимализм и простота
    Возможность вставки комментариев
Минусы:
    Невозможность создания двух одинаковых приоритетов(величина приоритета)
    Величина приоритета на глаз
    Получается большой список
Второй вариант

Вид: (ID=PRIORA;\n)(\n - начало новой строки, все что после ";" считается комментарием)
30=100; допустим, что алмаз самый приоритетный
210=99; песок
90=90; награда
Плюсы:
    Достаточно простой
    Возможность вставки комментариев
    Возможность указания одинаковых приоритетов
Минусы:
    Читабельность страдает
    Абстрактное число приоритета(Минимума и максимума как такового нет)
    Получается большой список
Гибридный вариант

Вид: (ID=PRIORA;)("//" считается комментарием)
30=100;210=78;90=85; //Обычные ресурсы
Плюсы:
    Возможность вставки комментариев
    Возможность указания одинаковых приоритетов
    Возможность умещения на одной строке например предметов одной категории
    Длина списка может быть не очень длинной
Минусы:
    Некоторые правила предется соблюдать(простота и интуитивность)
    Читабельность на совесть составляющего
    Абстрактное число приоритета(Минимума и максимума как такового нет)



вот примерная техническая реализация:(чтобы вы не сильно отвлекались от своих работ, просто переведя на язык java)
Реализация на c++

const int MAX_ID=400;

bool itIsNumeric(char ch)
{
if(ch=='0' || ch=='1' || ch=='2' || ch=='3' || ch=='4' || ch=='5' || ch=='6' || ch=='7' || ch=='8' || ch=='9')
{return true;}
return false;
}

int getPlayerSortSett(игрок pl, int *predmet) //*predmet это указатель на оригинал
{
int tempId=0; //ид предмета
int tempRaz=0; //его приоритет
int newid=0; //0-ничего, 1-открываю ид предмета, 2-открываю его приоритет
string str=""; //string это класс строки состоящий из массивов char
Экземпляр класса открытия файла file="sortsetUSER.txt";
if(!file)
{
file.open="sortset.txt";
if(!file){return 1; }//Неудалось прогрузить настройки
}

while(file!=eof)
{
switch(file.str) //str это текущий символ
{
case '[':
newid=1;
break;
case ']':
newid=0;
tempId=str.int; //str.int это придуманое приведение из *char в int
str=""; //обнуляем строку
break;
case '=':
newid=3;
break;
case ';':
newid=0;
tempRaz=str.int; //str.int это придуманое приведение из *char в int
str=""; //обнуляем строку
predmet[tempId]=tempRaz;
tempId=0; tempRaz=0;
break;
case '0' || '1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9':
str+='это число';
break;
case ' ': //пробел
break;
default:
return 2; //неудача при загрузке, посторонний символ
break;
}
}

return 0; //0- все отлично
}

int sortBoard(экземпляр сундука board, игрок pl)
{
int predmet[MAX_ID];
bool kaksort=false; //Как сортировать, загрузку данной настройки сами делайте
if(getPlayerSortSett(pl, predmet, )!=0){return 1;}

int max_slots=board.maxslots; //получаю максимальное колво слотов в сундуке
for(int i=0;i‹max_slots;i++)
{
for(int b=0;b‹max_slots;b++)
{
if(board.predmet.id[i]==0 )//нулевой ид это пустое место// где i это номер слота
{
if(i‹b && board.predmet.id[b]!=0)
{
swap(board.predmet.id[i], board.predmet.id[b]); //no comment
}
}
else
{
if(kaksort)
{
if(predmet[board.predmet.id[i]]‹predmet[board.predmet.id[b]])
{
swap(board.predmet.id[i], board.predmet.id[b]); //no comment
}
}
else
{
if(predmet[board.predmet.id[i]]›predmet[board.predmet.id[b]])
{
swap(board.predmet.id[i], board.predmet.id[b]); //no comment
}
}
}
}
}

return 0;//Возвращает 0 в случае успешной сортировки
}


Данная вариация примитивна по следующим пунктам:
    Использует пузырьковую сортировку

    Имеет примитивную защиту от дурака.(при ручной настройке приоритетов)

    Вызовет нерешимую ошибку если игрок во время сортировки уберет/добавит предмет(???????)




Будет интересно рассмотреть ваши претензии как и в идее, так и в реализации.
P.S. Язык Java изучать(как основной язык программирования) не собираюсь. Но реализационно могу помогать серверу
карма: 2
16
Голосовали:backdafackup, GeeXT, 23ToSHA, Lehan225, Panya-Old, avradimon, OTBETCTBEHHblN, antibagr, JzFish, player$181817, ValeraKeK, Drame22, ImDod, royalka, Rikys_Smou, Hunter333