Есть области, где без наследования не обойтись, например, в разработке GUI, когда у классов есть очень много общего - события от мыши, размеры, координаты и т.д. В программировании игр, тоже самое, у игровых персонажей есть куча общего, поэтому такие вещи лучше делать через наследование.
Но это нужно уметь совмещать с композицией, т.е. не пихать в родительский класс всё подряд, а выносить в отдельные классы. Тем самым код родительского класса будет проще и наследование будет проще пониматься. Например, если у монстров есть поведение - AI, то нет нужды пихать методы AI в класс монстра, лучше создать для этого отдельный класс AI и сделать его отдельным полем в классе монстра.
А еще лучше AI сделать как внешний сервис, который ожидает на входе игровые объекты. Тем самым класс монстра даже и знать не будет о существовании AI, и тем самым код будет проще в понимании.