Ответы пользователя по тегу Программирование
  • Как назвать переменную?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    MonetizationType - потому что это не дистрибуция, и уж точно не price (даже не priceType)
    Ответ написан
  • Чем реально полезным можно заняться школьнику знающему программирование?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    >Хорошо знаю Си-Шарп и Юнити.
    Ну так в чём дело? Сделайте отличную игру (или не отличную, но свою). Все школьники (и не только школьники) мечтают об этом. Я не шучу, это может стать полезным, (частично) приятным и (есть шанс) прибыльным. А раз вы школьник, то у вас полно свободного времени (не нужно зарабатывать на хлеб).
    Но главное - решить дойти до конца, до релиза, до победы. Например, возьмите любую любимую игру (небольшую) и сделаете клон (возможно, доработать под себя).
    Либо найдите команду разработчиков, которые ищут программиста (вагон таких предложений). Но нужно выбрать хорошую команду (чтобы была похожа на серьёзную).

    Или другой вариант предложил Александр Тер - сделать что-нибудь полезное для общества. Как пример, был подобный случай несколько лет назад.
    Ответ написан
    1 комментарий
  • Разработка сервера под игру, с чего начать?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Есть к примеру игра GTA SA я так понимаю сторонние разработчики сделали клиент

    Не совсем так. Любая многопользовательская игра состоит из двух частей - клиентской и серверной, и они не работают друг без друга (бывают бессерверные игры, но и в таких случаях обычно один из клиентов становится сервером, так работает и в Doom/Quake/UT). В GTA и клиент, и сервер сделали Rockstar Games, а не отдельные разработчики. И даже - больше, Rockstar Games постарались сделать так, чтобы спрятать протокол взаимодействия - чтобы хакеры и крякеры не взламывали игру, получая игровые преимущества неигровыми способами. "Сделать сервер GTA", с которым заработает клиент GTA, не получится, по крайней мере, цена такой разработки будет сопоставима с ценой работы над GTA (которая стоила десятки миллионов долларов).

    То, что может сторонний разработчик, это сделать моды для готового сервера, используя те инструменты, которые разработчик предложил, либо пытаясь "грабить" протокол взаимодействия. Моды бывают серверными и клиентскими, и возможны только в том случае, если у вас есть доступ к компьютеру, на котором запущен сервер и клиент (клиент у вас всегда есть, так и делают большинство модов).

    К примеру сделать сервер майнкрафт не состовляет проблем.

    Майнкрафт заметно проще, чем GTA. Хотя бы потому, что майнкрафт сделал один человек, а GTA сделали десятки программистов. И вот для майнкрафта можно сделать свой сервер,а не мод (хотя и моды к нему тоже есть). Как пример, отличная статья.

    Скачал, настроил, запустил

    "Скачал, настроил, запустил" - это не "разработка сервера", это взял то, что уже разработал кто-то.

    P.S. Всё написанное - имхо. Я не любитель GTA и не знаю рынка неофициальных серверов GTA, только знаю, что такие есть (вроде как). Но лично я считаю, что вряд ли кто-то сможет написать сервер, если не будет либо его исходников (украсть), либо разработчики сделают инструменты для разработки модов.
    Ответ написан
    2 комментария
  • Разработка игр с умом?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Рекомендую начать с чего-нибудь попроще, пусть даже клон. Сделайте клон какого-нибудь платформера или Galaxy (или что больше нравится). Это важно, потому что дальше будет слишком много времени будет уходить на сложные задачи по программированию, с которым у вас пока слабо. Когда вы сделаете вашу первую программу, дальше вам будет гораздо проще. Если вы будете хорошо развиваться, то можно попробовать сделать за 2-4 недели, и только потом идти к вашей игре, которую вы хотите делать. Получив какой-то опыт, вам будет легче понять хорошим советам по архитектуре игры.
    Лично у меня есть несколько человек, с которыми я общаюсь и помогаю с программированием. Напишите в скайп, можно начать общение.
    Ответ написан
    7 комментариев
  • Что делают делегаты в C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вашу задачу можно сделать тремя способами:
    1) создать метод, который будет суммировать каждый элемент списка в переменную, точнее, в поле класса.
    long Result;
    long Sum(List<int> intList)
    {
        Result = 0;
        intList.ForEach(AddElement);
        return Result;
    }
    
    void AddElement(int i)
    {
        Result += i;
    }

    2) Чтобы не создавать "лишнюю" функцию, необходимую только для конкретной задачи, то можно взять анонимную функцию. Анонимные функции в C# используются с помощью делегатов. Дополнительно, анонимные функции могут использовать замыкания, и нет необходимости создавать внешнее поле.
    long Sum(List<int> intList)
    {
        long result = 0;
        intList.ForEach(delegate(int i) { result += i; });
        return result;
    }

    3) Можно взять лямбду - в данном случае, это "синтаксический сахар" - упрощение создания делегата.
    long Sum(List<int> intList)
    {
        long result = 0;
        intList.ForEach(i => result += i);
        return result;
    }
    Ответ написан
    2 комментария
  • C# Троелсен и Шилд, поворот не туда?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Троелсен пишет профессионалам, тем, кто уже профессиональный разработчик в каком-либо языке, а теперь хочет разобраться с C#. Раз книга направлена на профессионала, то в ней не указываются общие основы программирования - например, нет ничего про паттерны, нет инфы, для чего нужен ООП, какие типы данных выбрать для конкретной задачи, какие типы массивов/списков взять, и т.п. Например, в книге описаны три разных способа работы с потоками. Каждый из типов хорошо описаны, но не указаны, какой из способов лучше использоваться. (хотя, конечно же, автор пытался показать, для чего нужны эти типы и в чем они отличаются, но выбор конкретного типа работы с потоками нужно выбирать разработчику.)
    Например, если разработчик хорошо знает Java. Тогда для него книга Троелсена идеальна. Можно понять, что в языке есть и как этим пользоваться.
    В итоге, эта очень сильная книга, которую легко можно использовать как справочник.
    Поэтому, эту книгу я не рекомендую как учебник программирования. Но когда вы пару-тройку лет поработаете с шарпом, то эта книга даст полное развёрнутое описание языка.

    P.S. Шилдта я не читал, не могу рассказать, на что она направлена.
    Ответ написан
    4 комментария
  • Какова практическая ценность магистратуры в IT?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Немного оппонирую коллег из соседних ответов. Ответы правильные и хорошие, но добавлю свои мысли. Для программиста нужны, по большей части, две вещи - опыт (лучше в сложных и разных проектах) и знания (как классические знания алгоритмов, так и знания редких, но интересных задачах - ИИ, компьютерное зрение, пр.).
    1) Опыт получается самим программистом, в идеале - до вуза. Но! Опыт опыту рознь. 100 сайтов-визиток в год в течение 5 лет - не тот опыт, который развивает. А вот хороший наставник даст интересные задачки, которые очень быстро разовьют и опыт, и знания, и "чуйку". Хороший наставник может быть и на работе, и в вузе. А может и наоборот - хороший наставник может и не обнаружиться ни на работе, ни в вузе.
    2) Знания получать нужно самостоятельно, конечно же. Но опять-таки - в вузе для этого есть время и место, а на работе нужно заниматься текущими вещами, зачастую - рутиной.

    Дополнительно к опыту и знаниям, есть ещё навыки коммуникации, есть опыт житейский, не-профессиональный, есть связи и контакты со многими людьми. Это сложно получить на работе.

    Мой ответ будет таким. Если вы сможете найти хорошего наставника в вузе (в магистратуре, в аспирантуре), то идите. Инвестиции в своё образование окупятся с лихвой. Но если в вузе (в магистратуре, в аспирантуре) будут давать всякую фигню - то большого смысла в этом будет немного (смысл будет, но немного).
    Ответ написан
    Комментировать
  • Какой тип данных для работы с двоичной системой счисления существует в C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    public struct MyBool
    {
        private byte _val;
    
        public byte Value
        {
            get { return _val; }
            set { _val = (byte)(value == 0 ? 0 : 1); }
        }
    
        public MyBool(int a)
        {
            _val = (byte)(a == 0 ? 0 : 1);
        }
    
        public override string ToString()
        {
            return _val == 0 ? "0" : "1";
        }
    
        public override int GetHashCode()
        {
            return _val;
        }
    
        public override bool Equals(object obj)
        {
            return _val == ((MyBool)obj).Value;
        }
    
        public static implicit operator MyBool(int a)
        {
            return new MyBool(a);
        }
    
        public static implicit operator int(MyBool a)
        {
            return a._val;
        }
    }


    MyBool[] arr1 = {1, 0, 1, 1, 0, 0, 0, 1};
    MyBool[] arr2 = {1, 0, 2, 3, 0, 0, 0, -5}; 
    // автоматически преобразуется в {1, 0, 1, 1, 0, 0, 0, 1}
    // во всех си-подобных языках не-ноль - это истина
    Ответ написан
    Комментировать
  • Как хранить данную структуру данных?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Игроки в списке. У каждого игрока список наложенных эффектов - List<Effect>. Эффект не должен обрабатывать изменения на игрока, он только хранит информацию об эффекте (это будут очень простые классы с парой-тройкой свойств).

    Игрок не должен сам обрабатывать эффекты, для обработки сделать отдельный класс, что-то типа EffectDealer. И в классе обработки хода для каждого игрока запускать этот класс - что-то типа new EffectDealer(gamer).Deal();

    И для каждого эффекта у вас будет отдельный класс, который будет изменять свойства игрока в зависимости от эффекта.

    Умеете пользоваться интерфейсами? С ними будет гораздо удобнее, если сделать такую архитектуру, как я предлагаю. Если нужна помощь по моей архитектуре, то скажите, я напишу образцы классов для пары эффектов.
    Ответ написан
  • Как реализовать обработчик консольных комманд в приложении?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Разделяйте строку по пробелу - так вы получите имя команды и параметры, в первом элементе массива - имя команды, в остальных - параметры. Каждый параметр нужно разделить по символу "="- и вы получите имя параметра и значение.
    Дальше, хорошо создать интерфейс (и/или абстрактный класс) хендлера команды и реализовать интерфейс для каждой команды. Так у вас получится несколько классов, по одному для каждой команды. Останется выбрать нужный хендлер, и запустить его, указав ему параметры. Если команд много, то можно подумать о дальнейшем разделении классов хендлеров на подгруппы.

    Если нужно, могу показать примерный код для моего способа. А по хорошему, используйте готовый код (правда, смотрите, умеет ли тот чужой код парсить из строки, а не из входных аргументов программы).
    Ответ написан
    Комментировать
  • Какие есть развивающие игры для будущих программистов?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    ColobotCeebot) - обучающая игра, обучает чему-то типа языка си. Отличный полигон для проверки алгоритмов.
    Настольная игра для самых маленьких программистов (от 7 лет)
    Ответ написан
    Комментировать
  • Куда разместить методы?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Хорошим решением будет создать отдельный класс Loader, который будет использовать класс DB (его универсальные методы) для извлечения данных. Что-то типа паттерна Фабрика.
    В сам класс DB такие методы лучше не писать, потому как очень скоро в этом классе будет 100500 методов, по два для каждого класса приложения.
    Также не стоит помещать подобные методы в тот класс, данные которого хранятся в базе. Сам объект должен уметь работать с полученными данными, и не важно, из какого источника данные получены - может быть, вы захотите хранить эти данные не в БД, а в файле, или в мемкеше.
    Ответ написан
    4 комментария
  • В двух словах, что такое БЭМ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    БЭМ - это такая методология вёрстки от Яндекса. Она подразумевает разбиение страниц на отдельные смысловые блоки (комментарий, пост, заголовок, футер, форма, инпут и т.п.). Каждый блок может состоять из других блоков. Основная идея - как можно больше повысить возможность повторного использования уже написанных блоков, для чего используются модификаторы. Плюс, БЭМ подразумевает отказ от каскадных стилей, потому что они препятствуют повторному использованию.
    Например, на странице есть два разных заголовка (например, отдельно в статье, и отдельно во врезке). Как все привыкли делать это? есть код заголовка:
    <h1 class="header">Заголовок</h1>
    И мы ставим эти заголовки в текст статьи и во врезки:
    <article class="article">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="incut">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>

    Тогда обычно мы используем каскад, чтобы стилизовать заголовок во врезке:
    .header {font-size: 2em; padding-bottom: 1.5em;}
    .incut .header {text-decoration: italic;}

    Всё хорошо, но теперь мы не можем просто перенести эти стили заголовка во врезке в другое место, потому что эти стили привязаны именно ко врезке (классу incut). Плюс, что ещё хуже, если к элементу привязано несколько различных стилей, образующихся подобными каскадными правилами, то перенести такой внешний вид в другое место становится очень трудоёмко. А также, из-за большей специфичности каскадных стилей, их сложнее "перебить" новым стилем.
    БЭМ предлагает отказаться от каскадных стилей и создавать отдельные стили-модификаторы:
    <article class="b-article">
        <h1 class="b-article__header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="b-article b-article__incut">
        <h1 class="b-article__header b-article__header_incut">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>


    .b-article__header {font-size: 2em; padding-bottom: 1.5em;}
    .b-article__header_incut {text-decoration: italic;}


    Чем больше проект, тем выгоднее использование подобной методологии. На маленьких и средних проектах БЭМ может быть избыточен. Хотя вот была статья habrahabr.ru/company/yandex/blog/234905 про использование в маленьких проектах.

    БЭМ может использоваться самостоятельно, вручную создавая все элементы и блоки. Но существует обширный инструментарий для БЭМа, который помогает создавать библиотеку элементов и блоков.

    Ну вот. Получилось не в двух словах, но менее подробно качественно описать БЭМ не получится, имхо.
    Ответ написан
    Комментировать
  • На чем лучше написать, или где взять движок для 2D (2.5D) MMORPG?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Unity3d будет отличным началом для вас. Юнити - мощнейшая платформа, на которой можно сделать всё, что угодно. В том числе и 2d MMO.
    Но это будет не просто, сразу предупреждаю. Сделать платформер или 2д-бродилку на юнити можно очень быстро, но вот именно сделать ММО - это задача гораздо сложнее.
    (В Unity3d 5 сейчас разрабатывают новую платформу для работы с сетью, и там они обещают сильно упростить работу с сетью, в том числе в MMO-проектах).
    Есть некоторые сложности с бесшовностью, но они решаются. Юнити уже сейчас обладает огромным функционалом, покрывающим все базовые требования к любой игре, плюс есть обширный магазин аддонов (ассетов).
    Платформа любая - и клиент, и браузер, и мобилки, и даже консоли.
    Язык программирования - основной C#, можно писать на Javascript (точнее, язык, очень похожий на javascipt) и Boo (что-то типа Python).
    Ответ написан
    4 комментария
  • Где хранить данные сайта?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Посмотрите на Wordpress - это такая система управления сайтом, она вам поможет управлять разными страницами.
    Купите домен и хостинг, на хостинг установите вордпресс (хотя есть хостинги с уже предустановленным вордпрессом - посмотрите вот тут, например: https://wpmag.ru/wordpress-hosting/. От меня - DigitalOcean будет отличным вариантом).
    В самом вордпрессе настройте несколько категорий, и создавайте страницы на каждый день с праздниками.
    Вот когда появится необходимость выводить на главную страницу именно сегодняшнюю страницу - тогда пишите вопрос, как это сделать. А сейчас поищите подробные статьи по созданию сайтов и конкретно по вордпрессу. Начните читать с этой страницы.
    Ответ написан
    Комментировать
  • Объясните что такое полиморфизм простыми словами ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Полиморфизм указывает, какую версию метода текущего объекта запустить.
    Например, у вас есть несколько наследуемых классов, с разной реализацией одного и того же метода. То есть, у вас есть несколько разных методов с одинаковым именем (и сигнатурой), реализованных в разных классах. Какую версию метода вызвать? Это зависит от типа переменной, в которой находится объект.
    Также с помощью полиморфизма можно поместить объекты разных классов в один массив с типом базового класса.

    Создадим три класса с двумя методами - один виртуальный, а другой нет. Виртуальный метод переопределён (override) в классах-наследниках. Невиртуальный метод просто скрыт в наследниках новой реализацией (невиртуальные нельзя переопределять).
    class Animal {
        public void Info() { Console.WriteLine("Animal"); }
        public virtual void Say() { Console.WriteLine("Nothing to say"); }
    }
        
    class Cat : Animal {
        public void Info() { Console.WriteLine("Cat"); }
        public override void Say() { Console.WriteLine("Meow"); }
    }
        
    class Dog : Animal {
        public void Info() { Console.WriteLine("Dog"); }
        public override void Say() { Console.WriteLine("Woof"); }
    }

    При создании объекта важно, в переменную какого типа объект будет записан:
    Dog dog1 = new Dog();
    Animal dog2 = new Dog();
    // Не виртуальный метод - вызовется метод класса, указанного у переменной 
    dog1.Info(); // напишет Dog
    dog2.Info(); // напишет Animal
    // Виртуальный метод - вызовется метод класса, которого переменная реально имеет
    dog1.Say(); // напишет Woof
    dog2.Say(); // напишет Woof


    А теперь частая ситуация, когда полиморфизм нужен - при итерации массива:
    Animal[] animals = new Animal[10];
    FillAnimals(animals); // заполним массив вперемешку собаками и кошками
    
    foreach (var animal in animals) animal.Say(); // вызовется правильный метод
    // У невиртуальных методов так сделать нельзя! Полиморфизм в действии

    Наследование без виртуальных методов полезен только фиксацией интерфейса.

    Вот весь код примера: code.re/5ZC
    Вставьте его вот сюда и проверьте.

    P.S. Написал код на C#, чтобы подчеркнуть разницу между виртуальными и невиртуальными методами. В Javascript все методы виртуальные (как и в php, например).

    UPD. (спасибо @Petroveg)
    В языке C# (и других статически типизированных) обычно делают так - если метод в базовом классе записывается для всех потомков и оттуда будут использоваться напрямую, то он помечается обычным, невиртуальным. А если метод предназначен для того, чтобы в наследниках его переопределить, то необходимо его сделать виртуальным, чтобы при вызове метода компилятор выбрал нужную версию метода. То есть некоторые методы лучше делать виртуальными, а некоторые нет.
    И ещё раз - виртуальность важна только в одном случае - если объект-наследник записан в переменную базового класса:
    Animal animal = new Dog();
    В javascript невиртуальных методов не бывает - динамическая основа этого языка ВСЕГДА автоматически вызывает именно последнюю версию метода, определяя конкретную по цепочке прототипов. Поэтому в Javascipt, по большому счёту, сильно думать о полиморфизме смысла нет - это только абстрактная концепция, не влияющая на сам код, а только на архитектуру.
    Ответ написан
    6 комментариев
  • Есть ли нормальная он-лайн система для команды разработчиков?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Пользовался одно время Ассемблой. Хорошая штука.
    Сейчас пользуюсь BitBucket - тоже мощная штука, неограниченно бесплатных частных репозиториев (гит, меркуриал), но до 5 участников (можно до 8 увеличить).
    Есть вики, файлы, задачи.
    Плюс у них куча смежных проектов, которые отлично интегрируются с репозиторием.
    Но в Ассембле богаче возможности самой платформы.
    Но в Ассембле бесплатен только один проект :)
    Ответ написан
    Комментировать
  • Какой есть аналог gametutorials.com?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Необходимые ресурсы для геймдизайнеров - в самой статье больше англоязычных, но внизу и в комментах накидали много разных вариантов.
    gamedev.ru
    Ну и самый главный: habrahabr.ru/hub/gdev
    Ответ написан
    Комментировать
  • Как распланировать классы для приложения а-ля pastebin.org?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Можно попробовать отдельный класс ресолвер с единственным (?) методом - определить тип текста. Он же может быть и Фабрикой для создания нужного класса. (я использую псевдокод в стиле c#, думаю, также любому программисту будет понятно)
    class Paste {
      string Brief() {}
      // other methods
    }
    
    class PythonCode : Paste {
      string Brief() {}
    }
    class MayakovskyPoetry : Paste {
      string Brief() {}
    }
    
    class Resolver {
      Paste Guess(string text) {}
    }

    И использование:
    Paste text = Resolver.Guess(userText);
    string brief = text.Brief();
    Ответ написан
    4 комментария
  • Веб-разработчик, программист или нет?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Программист - тот, кто использует языки программирования для решения своих задач. А какова задача - программа или сайт - уже другой вопрос.
    Использование php/python/ruby/node.js/etc на сервере, скорее всего, даёт разработчику возможность назвать себя программистом.
    Использование javascript на клиентской стороне для программирования бизнес-логики (например, один из js-фреймворков) - тоже программист.
    Использование одной из популярных CMS (Wordpress, Drupal, Joomla, etc.) и дописывание кастомных модулей для них - программист.
    А если разработчик использует в качестве основных инструментов для своей работы не-языки программирования (HTML, CSS), то он не программист, даже если он пару раз вставлял jQuery-скрипты для создания анимации на страницу, и даже если он поменял некоторые вещи в этих скриптах.
    Ответ написан
    Комментировать