Сортировка сундука
Предлагаю реализацию наслышанной сортировки сундуков, так и не получившей должной идеи реализации...
Кнопка сортировки располагается справа от кнопок "выброса и сброса" в сундук/инвентарь.
картинка
При клике по этой кнопкой левой кнопкой мышки происходит сортировка этого сундука.
При клике по этой кнопкой правой кнопкой мышки, показывается окошко(подобно окну привата) настройки правил сортировки.
Пункты настройки
- Сортировка по убыванию/возрастанию(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 изучать