Give me your best code, baby
Интересное в программировании
вторник, 22 декабря 2015 г.
вторник, 15 декабря 2015 г.
Сингл vs Мульти
Уже почти 4 месяца прошло с момента начала разработки игры. Сервер пишется на go, клиент на C#(unity3d). С самого начала я не осознавал до конца, какой же это геморрой - пилить мультиплеерную игру :)
Лично для меня основные сложности на данный момент - разная кодовая база и слишком правильная разработка на сервере. Клиент прощает многое, можно кодить много и говнисто. На сервере это проблематично ввиду того, что клиентов уже несколько. Руки выпрямляются сами, но какой ценой...
До сих пор когда пишу код на сервере, отвечающий за спавн ботов, думаю: а на клиенте достаточно было б написать
Лично для меня основные сложности на данный момент - разная кодовая база и слишком правильная разработка на сервере. Клиент прощает многое, можно кодить много и говнисто. На сервере это проблематично ввиду того, что клиентов уже несколько. Руки выпрямляются сами, но какой ценой...
До сих пор когда пишу код на сервере, отвечающий за спавн ботов, думаю: а на клиенте достаточно было б написать
GameObject.Instantiate(botPrefab, botPos, botRotation);
среда, 3 сентября 2014 г.
Обратный порядок слов в строке
Ходил недавно по собеседованиям, наткнулся на интересную задачу. Поменять порядок слов в строке, разделенной пробелами. Например из "one two three four" сделать "four three two one" за линейное время, не используя дополнительную память. В лучших традициях, на собеседовании до решения я не догадался. Хорошая мысль пришла мне уже дома:
#include <iostream>
#include <string>
void main()
{
std::string str = "one two three four";
for (size_t i = 0; i < str.length() / 2; ++i)
{
std::swap(str[i], str[str.length() - i - 1]);
}
auto inversePartOfString = [](std::string& str, size_t low, size_t high)
{
for (size_t j = low, k = 0; j < (low + high) / 2; ++j, ++k)
{
std::swap(str[j], str[high - k - 1]);
}
};
int lastFound = 0;
size_t i = 0;
for (; i < str.length(); ++i)
{
if (str[i] != ' ')
{
continue;
}
inversePartOfString(str, lastFound, i);
lastFound = i + 1;
}
inversePartOfString(str, lastFound, i);
std::cout << str << std::endl;
}
воскресенье, 25 марта 2012 г.
Простая задачка о произведении всех элементов в массиве
Не так давно столкнулся с простой задачей: посчитать произведение элементов в массиве. Первое решение, приходящее в голову:
namespace
{
template<class T>
class Multiply
{
public:
Multiply(T& result) : TotalResult(result)
{
}
void operator()(const T& v)
{
TotalResult *= v;
}
private:
T& TotalResult;
};
}
void main(void)
{
int result = 1;
Multiply<int> functor(result);
int buffer[] = {1, 2, 3, 4};
std::for_each(buffer, buffer + 4, functor);
std::cout << "Result = " << result;
}
Поскольку for_each принимает последний параметр по значению, то функтору нужно передавать ссылку извне. Также, чтобы где-то сохранять ссылку на результат нам пришлось написать класс. Однако можно решить задачу и по-другому, используя std::bind1st.
понедельник, 19 марта 2012 г.
Мелочи жизни
В рабочем коде периодически натыкаюсь на код подобного вида:
class SomeClass
{
//....
};
typedef std::auto_ptr<SomeClass> SomeClassAutoPtr;
typedef std::tr1::shared_ptr<SomeClass> SomeClassSharedPtr;
//....
SomeClassAutoPtr ptr = getSomePointer();
Читать подобные километровые названия не очень приятно. Решение получше:
class SomeClass
{
//....
typedef std::auto_ptr<SomeClass> AutoPtr;
typedef std::tr1::shared_ptr<SomeClass> Ptr;
};
//...
SomeClass::AutoPtr ptr = getSomePointer();
ИМХО второй вариант выглядит куда приятнее первого, к тому же не засоряет "глобальное пространство имен".
вторник, 22 ноября 2011 г.
SyntaxHighlighter для блога
Настроил syntaxhighlighter теперь при переключении вкладок "Создать" и "HTML" данные о подсветке не теряются + можно более менее легко править исходники
#include <iostream>
void main()
{
//hey, look at this
std::cout << "Hello World!";
}
пятница, 18 ноября 2011 г.
Особенности использования shared_ptr и RefCounter
Бредисловие
Думаю каждый программист слышал или использовал shared pointers и встречался с идиомой ref counter для разделяемых ресурсов. По отдельности их использование не представляет сложности и опасности, но что может быть если совместить их вместе?
А как все начиналось...
Предположим мы расширяем существующий функционал программы. Архитектура программы содержит в себе некий "промежуточный" слой service, который состоит из классов-менеджеров. Т.е. для записи файла на CD есть класс CdWriterManager, для записи файлов на расшаренные папки ShareWriterManager и прочие. И вот нам дают задание написать класс для записи файлов на FTP.
Думаю каждый программист слышал или использовал shared pointers и встречался с идиомой ref counter для разделяемых ресурсов. По отдельности их использование не представляет сложности и опасности, но что может быть если совместить их вместе?
А как все начиналось...
Предположим мы расширяем существующий функционал программы. Архитектура программы содержит в себе некий "промежуточный" слой service, который состоит из классов-менеджеров. Т.е. для записи файла на CD есть класс CdWriterManager, для записи файлов на расшаренные папки ShareWriterManager и прочие. И вот нам дают задание написать класс для записи файлов на FTP.
Подписаться на:
Комментарии (Atom)
