• Как пишется псевдо ИИ в играх?

    begemot_sun
    @begemot_sun
    Программист в душе.
    В общем случае читайте про принцип минимакса.
    Вы должны:
    1. описать игровое пространство, что можно делать и чего нельзя.
    2. описать возможные действия бота (ход вправо, влево, стрелять и т.п.)
    3. описать функцию оценивающую текущую обстановку на поле (с учетом положения и состояния всех игроков на поле, или только той части что известный боту)
    4. Руководствуясь принципом минимакса выбрать лучший ход для бота в текущий момент.
    5. Оптимизировать процесс с учетом того, что у вас будет комбинаторный взрыв возможностей.
    Ответ написан
    2 комментария
  • Как пишется псевдо ИИ в играх?

    @aleks_raiden
    Ну для начала нет никакого "псевдо" - есть обычный ИИ, просто заточенный на разные задачи и их решающий с разным успехом.
    Об игровом ИИ есть отличная книга - www.williamspublishing.com/Books/978-5-8459-1170-4.html
    И сборник разных книг - rutracker.org/forum/viewtopic.php?t=299132
    Ответ написан
    1 комментарий
  • ООП в высоконагруженных проектах считается устаревшим?

    Adamos
    @Adamos
    Баланс.
    Если проект реально высоконагруженный, но простой, как табуретка - то человек прав, чем меньше в коде будет абстракций, тем меньше оверхеда.
    Но если проект не только высоконагруженный, но и сложный - вы мозг сломаете, делая его функционально. Функции хороши там, где нужны простые решения. Если вы можете разобрать всю архитектуру на простые решения - вам не нужно ООП. Если не можете - то без него проект захлебнется в собственной сложности.
    Ответ написан
    3 комментария
  • Как загрузить страницу в WebView с куками?

    kozinakoff
    @kozinakoff Автор вопроса
    iOS-developer
    Проблема решается перекрытием в WebViewClient метода shouldInterceptRequest(). WebView подставляет куки не во все запросы (в частности при обращении к ресурсам типа картинок, js, css, ... не подставляет), из-за чего имеем описанную выше проблему.

    OkHttpClient client = new OkHttpClient();
    
        Request req = new Request.Builder()
                                .url(url)
                                .addHeader(HttpHeaders.USER_AGENT, Constants.USER_AGENT_VALUE)
                                .addHeader(HttpHeaders.COOKIE, cookies)
                                .build();
    
        Response response = client.newCall(req).execute();
    
        InputStream responseInputStream = response.body().byteStream();
    
        return new WebResourceResponse(null, null, responseInputStream);


    У конструктора WebResourceResponse первые два параметра mimeType и encoding, которые мы можем получить из заголовка response. Но в моем случае, чёрт знает по какой причине, если передавать их в конструктор - получаю 400 Bad Request.
    Ответ написан
    Комментировать
  • Rust или Go(golang)?

    Lerg
    @Lerg
    Defold, Corona, Lua, GameDev
    Оба перспективны и оба будут успешны в будущем, Go уже сейчас, а Rust чуть попозже, так как ещё в активной разработке. Их применение отличается и у каждого есть значительные отличия. Каждый может выбрать язык для своих целей и своих предпочтений.
    Ответ написан
    Комментировать
  • В чем же сила Node.js ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Сила в том что все знают JS. Кто может писать на PHP/Ruby/Python? Те кто пишут на PHP/Ruby/Python соответственно (и скажем по 10%-15% от количества каждых кто может писать хотя бы на двух из трех языков. Кто может писать на JS? Все фронтэндеры + добрых каких 60%-70% от всех этих php/ruby/python/java/c# разработчиков...

    Что это дает? ОГРОМНЕЙШЕЕ комьюнити... большая часть быдло конечно но засчет огромнейшего количества разработчиков инструментарий начал просто очень быстро развиваться. Кому нужен инструмент написанный на Ruby если его можно написать на JS и его сможет поддерживать на порядок больше людей?

    Вопрос производительности по началу стоял как основная фишка языка. Все кричали наконец-то, V8 на сервере, асинхронность! Самый быстрый интерпритируемый язык на планете и все такое. Но на деле все чуть сложнее. JS реально быстрый. По сравнению с тем же Ruby он в разы быстрее! Но по большому счету на это адекватным людям плевать с высокой колокольни, так как js нифига не асиинхронный. JS работает в один поток. Причем в этом же потоке работает и сборщик мусора. Если он начнет все чистить - все замрет. Обычно это не сильно большая проблема но как-то забавно. Асинхронное в JS только работа с IO которая на плюсах/си реализована...

    Революционности так же нету. JS на сервере не новая идея и практиковался еще лет за 5 до. Просто это была очень удачная реализация да ктому же если бы не V8 то так же все было бы не так круто.

    Что до сравнения с PHP и т.д. - это инструменты для разных сфер. PHP - разработка web-сайтов. node.js - демоны, инструменты разработки, шины данных, доставка данных и т.д. Для всего остального PHP подходит больше. Есть правда пара интересных проектов главная цель которой устранить дублирование кода на сервере и на клиенте.... но подходят эти наработки пока только для очень простых проектов (хотя все относительно).

    Если вас прям плющит от нового, быстрого, современного, с клевым дизайном и тоже где повлиял гугл - golang.
    Ответ написан
    11 комментариев
  • Где syntax error у меня в запросе mysql?

    samoilenkoevgeniy
    @samoilenkoevgeniy
    Lead Full-Stack Web Developer
    Поставьте все переменные в ' ' (Одинарные кавычки).
    И все переменные прогоняйте через mysql_real_escape_string (Если без PDO работаете).

    А проблема в том, что запрос нужно передавать как строку, т.е. вот так:
    mysql_query("INSERT INTO `listings` (`body`,`date_added`, `date_expired`, `status`) 
    VALUES($data, $date_added, $date_expired, $status)");
    Ответ написан
    Комментировать
  • Как реализовать систему эффектов (модификаторов) накладываемых на игрока?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Вообще, последующая реализация сильно зависит от текущей архитектуры. Лично я бы сделал что-то вроде такого (python рулит):

    class Modifiable:
    	base = {"strength": 10}
    	mod = {"strength*": 2, "strength+", -3}
    
    	def __init__(self, **kwargs):
    		pass
    
    
    class Hero(Modifiable):
    	def __init__(self, **kwargs):
    		pass
    		
    	@property
    	def strength(self):
    		return self.base["strength"] * self.mod["strength*"] + self.mod["strength+"]


    Суть примерно ясна, к тому же можно пойти дальше и запилить класс - ObjectProperty и ObjectModificator со всеми необходимыми методами, а потом аккурат умножать, вызывая перегруженный __mul__.
    Ответ написан
    Комментировать
  • Как реализовать систему эффектов (модификаторов) накладываемых на игрока?

    @bromzh
    Drugs-driven development
    Так как ты не сказал, на каком языке пишешь, скину код на питоне:
    class Effect:
    
        def __init__(self, name, mods):
            self.name = name
            self.mods = mods
            # mods - это словарь с модификаторами
            # ключ - имя поля в классе User
            # значение - функция, которая принимает экземпляр класса User и промежуточное значение поля
            # а возвращает изменённое значение поля
    
    
    class User:
    
        def __init__(self, name, strength, agility):
            # Инициируем начальные значения
            self.name = name
            self.strength = strength
            self.health = strength * 100
            self.agility = agility
            self.effects = list()
    
        # в самом классе храним только независимые значения
        # но любой доступ к параметрам должен идти через геттер
        # для каждого необходимого параметра создаём функцию-геттер
        # которая будет учитывать применение эффектов
        # можно вместо этого использовать @property
        def get_strength(self):
            strength = self.strength
            for effect in self.effects:
                if effect.mods.get('strength'):
                    strength = effect.mods['strength'](strength, self)  # вызываем функцию - модификатор
            return strength
    
        def get_agility(self):
            agility = self.agility
            for effect in self.effects:
                if effect.mods.get('agility'):
                    agility = effect.mods['agility'](agility, self)  # вызываем функцию - модификатор
            return agility
    
        def get_health(self):
            health = self.health
            for effect in self.effects:
                if effect.mods.get('health'):
                    health = effect.mods['health'](health, self)  # вызываем функцию - модификатор
            return health
    
        # Это зависимый параметр
        def get_max_health(self):
            max_health = self.get_strength() * 100  # первоначальное значение вычисляется на основе силы
            for effect in self.effects:
                if effect.mods.get('max_health'):
                    max_health = effect.mods['max_health'](max_health, self)  # вызываем функцию - модификатор
            return max_health
    
    
    if __name__ == '__main__':
        foo = User('Foo', 10, 10)
        god_strength = Effect('God strength', {
            'strength': lambda s, u: s + 10
        })
    
        def _life_power_func(value, user):
            return value + 100
    
        life_power = Effect('Life Power', {
            'max_health': _life_power_func
        })
    
        def _extra_agility_func(value, user):
            return value + 10
    
        # этот эффект влияет сразу на 2 параметра
        extra_agility = Effect('Extra agility', {
            'agility': _extra_agility_func,
            'max_health': lambda h, u: h - 400
        })
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
        foo.effects.append(god_strength)
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
        foo.effects.append(life_power)
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
        foo.effects.append(extra_agility)
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])

    Результат:
    10 1000 1000 10 []
    20 2000 1000 10 ['God strength']
    20 2100 1000 10 ['God strength', 'Life Power']
    20 1700 1000 20 ['God strength', 'Life Power', 'Extra agility']
    Ответ написан
    3 комментария
  • Как реализовать систему эффектов (модификаторов) накладываемых на игрока?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Делать ТОЛЬКО транзакцией (как в банках) для исключения читов!
    1. проверить пустой ли промежуточный буфер (активна ли транзакция)
    2. запомнить показатель, положив в буфер
    3. уменьшить число объекта (свойство) - опустошить бутылку
    4. увеличить показатель героя на кол-во из буфера.
    5. очистить буфер

    Это отдельный класс-манипулятор перемещения энергий в игровом мире.
    Ответ написан
    2 комментария
  • Как писать оптимальный PHP код?

    golotyuk
    @golotyuk
    99% оптимизации PHP это
    - обязательно использовать APC (или opCache в новых версиях)
    - использовать ООП только там, где это реально нужно
    - использовать кэширование
    - здравый смысл (не загружать списки из 100 элементов, если нужно только 10 и т.п.)

    Поддерживаю Fesor - микрооптимизация - это скорее привычки, но никак не методы решения каких-то реальных проблем со скоростью работы.

    Что почитать:
    - Общие правила оптимальной работы PHP на практике
    - Howto по производительности PHP с внутренностями
    - 50 micro tips для оптимизации PHP (англ.)
    Ответ написан
    5 комментариев
  • Как должна взаимодействовать база данных с клиентскими приложениями?

    metamorph
    @metamorph
    Не совсем корректный вопрос.
    База данных самостоятельно с клиентами взаимодействовать не должна (за редкими исключениями, полагаю), это в любом случае задача прослойки.

    А дальше варианты: можно сделать отдельные прослойки под API и под веб, в простых случаях можно и одной обойтись (что-то типа if (хочет json) { вернуть json; } else {вернуть html} )
    Ответ написан
    Комментировать
  • Решение задачи асболютно упругого соударения двух шаров?

    Prosolver
    @Prosolver
    Я использую такое решение для эмуляции движения и соударения пятнадцати шаров (Object Pascal):

    for i:=1 to 15 do   // просчитываем соударения шаров
    for j:=i+1 to 16 do begin
     dist:=sqrt(sqr(balls[i].x-balls[j].x)+sqr(balls[i].y-balls[j].y)); //расстояние между центрами шаров
     if dist<diametr then begin //если расстояние меньше диаметра, значит есть факт соударения
      a:=balls[i].x-balls[j].x; //вспомогательные переменные типа extended
      b:=balls[i].y-balls[j].y;
      p1:=a*b/sqr(dist);
      p2:=sqr(a/dist);
      p3:=sqr(b/dist);
      d1:=balls[i].dy*p1+balls[i].dx*p2-balls[j].dy*p1-balls[j].dx*p2;
      d2:=balls[i].dx*p1+balls[i].dy*p3-balls[j].dx*p1-balls[j].dy*p3;
      balls[i].dx:=balls[i].dx-d1; //меняем значение приращения координаты шаров при движении
      balls[i].dy:=balls[i].dy-d2;
      balls[j].dx:=balls[j].dx+d1;
      balls[j].dy:=balls[j].dy+d2;
    
      p3:=(diametr-dist)/2; //при соударении шары всегда "проникают" друг в друга, поэтому раздвигаем их
      p1:=p3*(a/dist);
      p2:=p3*(b/dist);
      balls[i].x:=balls[i].x+p1;
      balls[i].y:=balls[i].y+p2;
      balls[j].x:=balls[j].x-p1;
      balls[j].y:=balls[j].y-p2;
     end;
    end;
    
    for i:=1 to 15 do
     balls[i].x:=balls[i].x+balls[i].dx;  //эмулируем движение
     balls[i].y:=balls[i].y+balls[i].dy;
    end;
    
    Ответ написан
    3 комментария
  • Какой стек технологий лучше всего для быстрой, но серьёзной коммерческой веб-разработки в наше время?

    @egorinsk
    Я бы на PHP. А что за требования по масштабируемости? Серверов приложений на PHP можно хоть сотню в ряд выстроить.
    Ответ написан
    1 комментарий