BeaRLibHS - рейтинг очков

Форум библиотеки BeaRLib

Модератор: Apromix

Аватара пользователя
Феникc
Сообщения: 679
Зарегистрирован: 27 ноя 2010, 15:01
Откуда: Челябинск

Re: BeaRLibHS

Сообщение Феникc » 11 окт 2011, 15:02

Вроде всё готово, есть один вопрос. Наверно, вставку записи лучше сделать не как сейчас, а через передачу параметров? Что-то вроде

Код: Выделить всё

insToList(char heroName, int scores, rec *head);
Всё вышесказанное - ИМХО, если не указано обратное.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BeaRLibHS

Сообщение Cfyz » 13 окт 2011, 22:24

Феникс писал(а):Итак, теперь тестовая программа работает как надо.
Феникс писал(а):rec определён как
А мне не понравилось. Указатели во все поля, списки непонятные. И, чтобы немного отвлечься от FOV, набросал свой вариант: пять функция-процедур, две из которых необязательны. Документация/аргументация следующая:

Код: Выделить всё

#define NAME_LENGTH 255
typedef struct
{
    char name[NAME_LENGTH];
    int score;
}
HS_Entry;

void     HS_UseFile( const char* filename, unsigned int number_of_entries );
void     HS_Clear();
void     HS_Post( const char* name, int score );
int      HS_Count();
HS_Entry HS_Get( int entry_index );
  • HS_Entry
    С точки зрения пользователя библиотеки HS_Entry используется только как удобный способ вернуть из функции две переменных (указатели/ссылки не подойдут).
  • void HS_UseFile( const char* filename, unsigned int number_of_entries )
    Указывает, какой файл будет использоваться для хранения таблицы рекордов.
    filename: имя файла, вместе с расширением (.txt приветствуется, об этом ниже).
    number_of_entries: количество "слотов" с таблице, этот параметр позволяет переложить на библиотеку заботу об откидывании лишних, не влезающих в таблицу записей; число записей в таблице в любом случае является константой для конкретного приложения, но его нельзя хранить в самом файле таблицы, который может быть легко удален или потерян.
    Если файл не существует, его невозможно открыть или он поврежден или модифицирован, будет использоваться пустая таблица размером number_of_entries.
  • void HS_Clear()
    Если ранее была вызвана HS_UseFile, очищает таблицу оставляя number_of_entries слотов. Иначе, не делает ничего. Добавлена для полноты, аналогичного эффекта можно добиться просто удалив файл таблицы.
  • void HS_Post( const char* name, int score )
    Добавляет в таблицу новый рекорд -- или не добавляет, если score меньше наименьшего уже имеющегося в таблице.
    name: имя игрока, используются не более NAME_LENGTH-1 байт из этой строки. Никаких преобразований, кроме отсечения по максимальной длине, не производится, что теоретически позволяет использовать хоть UTF-8.
    score: целое число, количество очков, ноль и отрицательные значения допустимы.
    При добавлении в таблицу новой записи таблица сортируется в порядке убывания score; лишние записи отбрасываются, так что таблица всегда содержит не более number_of_entries слотов. При каждом добавлении в таблицу новой записи файл таблицы обновляется. В отдельной функции записи таблицы в файл необходимости нет.
  • int HS_Count()
    Возвращает количество непустых записей в таблице. Добавлена для полноты, пустыми считаются записи с пустой строкой name, что легко проверить при выводе, а общее количество записей всегда равно указанному при вызове HS_UseFile.
  • HS_Entry HS_Get( int entry_index )
    Возвращает запись из таблицы.
    entry_index: номер записи в таблице, записи отсортированы в порядке убывания score. Если entry_index меньше ноля либо больше размера таблицы, возвращается пустая запись (name пустая строка, score равно нулю).
Таблица в файле хранится в простом текстовом виде name = score, но дополняется хешем. Файл может быть просмотрен любым текстовым редактором, но попытка модифицировать файл таблицы приведет к его очистке при следующем вызове HS_UseFile.

Пример использования библиотеки:

Код: Выделить всё

#include <stdlib.h> // for system() call

#include <iostream>
#include <string>
using namespace std;

#include "bearlibhs.h"

#define SCORE_TABLE_SIZE 10

int main()
{
    HS_UseFile( "scores.txt", SCORE_TABLE_SIZE );

    string name;
    int score;

    cout << "Enter a name: "; cin >> name;
    cout << "Enter a score: "; cin >> score;
    HS_Post( name.c_str(), score );

    cout << endl << "Current score table:" << endl;
    for ( int i=0; i<HS_Count(); i++ )
    {
        HS_Entry entry = HS_Get( i );
        cout << i << ". " << entry.name << ": " << entry.score << endl;
    }

    system( "PAUSE" );
    return 0;
}
Скрытый текст: ПОКАЗАТЬ
P. S. И все же я солидарен с Jesus05. Таблица рекордов, инвентарь -- дурью маемся.
Вложения
bearlibhs-11j13b.zip
(162.8 КБ) 251 скачивание
Пытается раскуклиться

Аватара пользователя
Феникc
Сообщения: 679
Зарегистрирован: 27 ноя 2010, 15:01
Откуда: Челябинск

Re: BeaRLibHS

Сообщение Феникc » 14 окт 2011, 02:06

По моему, таблица рекордов должна быть динамической.
И, кстати
void HS_Post( const char* name, int score )
Добавляет в таблицу новый рекорд -- или не добавляет, если score меньше наименьшего уже имеющегося в таблице.
Что это значит?

А так, да, думаю у меня немного неоптимально сделано со списками, и функцию записи в файл можно перенести в функцию добавления рекорда.
P. S. И все же я солидарен с Jesus05. Таблица рекордов, инвентарь -- дурью маемся.
В конце концов, никто не заставляет маяться этой дурью :) Ну а разработчику это жизнь облегчит. Я сильно сомневаюсь что кто-нибудь не сможет сделать обработку простейшего текстового файла, но, потенциально, это ещё один модуль в программе, который её загромождает и требует отладки.
Всё вышесказанное - ИМХО, если не указано обратное.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BeaRLibHS

Сообщение Cfyz » 14 окт 2011, 04:14

Феникс писал(а):По моему, таблица рекордов должна быть динамической.
По-моему вы как-то странно трактуете динамичность таблицы рекордов. Переменная длина? Где хоть раз была таблица рекордов именно переменной длины -- сейчас пять элементов, завтра пятьсот, потом десять? Так или иначе будет отдельный экран, на котором будут выводиться списком рекорды, на этот экран влезет N записей. Так или иначе таблица через некоторое время заполняется и попасть в нее становится сложнее -- где это видано удалять записи из таблицы рекордов поодиночке? И, кстати, если уж очень хочется, можно указать number_of_entries скажем в тысячу -- неизвестно куда это выводить, но храниться будут тысяча записей, причем пустые все равно даже в файл не записываются.
Феникс писал(а):Что это значит?
Ну как есть -- если в таблицу размером три записи, в которой уже значится (A, 500), (B, 200) и (C, 100) попытаться HS_Post( "D", 50 ) то ничего занесено не будет, 50 же меньше, чем 100, в эту таблицу такая запись не влезает. И, повторюсь, даже если бы технически в таблице она сохранялась, число три наверное не просто так было выбрано -- на экране/окошке со списком рекордов, куда помещается только три строчки, этой новой записи все равно не было бы видно.
Феникс писал(а):В конце концов, никто не заставляет маяться этой дурью
Ога ]:->
Пытается раскуклиться

Аватара пользователя
alexbard
Сообщения: 670
Зарегистрирован: 22 апр 2011, 17:15
Откуда: Украина
Контактная информация:

Re: BeaRLibHS

Сообщение alexbard » 14 окт 2011, 06:54

И все же я солидарен с Jesus05. Таблица рекордов, инвентарь -- дурью маемся.
С радостью бы посмотрел на работу с графикой (хотя бы тот же сдл/опенгл). На организацию графического интерфейса, создание окон и прочих элементов, работу со звуком, интересные решения по связке опрос клавиатуры/многооконный интерфейс, систему событий, таймеры, а системы очков/инвентарь - .. ну просто даже скучно вникать...

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLibHS

Сообщение Apromix » 17 окт 2011, 13:25

Cfyz писал(а):Переменная длина? Где хоть раз была таблица рекордов именно переменной длины -- сейчас пять элементов, завтра пятьсот, потом десять? Так или иначе будет отдельный экран, на котором будут выводиться списком рекорды, на этот экран влезет N записей. Так или иначе таблица через некоторое время заполняется и попасть в нее становится сложнее -- где это видано удалять записи из таблицы рекордов поодиночке? И, кстати, если уж очень хочется, можно указать number_of_entries скажем в тысячу -- неизвестно куда это выводить, но храниться будут тысяча записей, причем пустые все равно даже в файл не записываются.
Как успехи с либой :D ?

Ну да, все верно. Но оптимальная реализация в либе нужна. Кто хочет - пишет сам, кому влом - берет готовую :D Все просто. О чем спор нужна - не нужна?

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLibHS - рейтинг очков

Сообщение Apromix » 22 фев 2017, 09:11

С этой либой тоже не понятно. Вроде видел и юзал 2 готовых варианта. Если есть финальная версия, которая будет устраивать всех, то на гитхаб ее :)

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей