Как с помощью ООП смоделировать сложный игровой мир?
А я бы посмотрел на задачу с другой стороны. Вот представьте ваш главный герой еще младенец, не знает что на гитаре можно играть, в костер дрова кидать, бутерброд даже не знает зачем. Он может поднять и съесть камень, гитару, да все что угодно. Вот и реализуйте все желаемые действия для персонажа, а всем объектам дайте только физические характеристики -размер, вес, температура, горючесть, жидкость. Дайте возможность герою сыграть музыку на камнях! И задача ваша будет описать возможную логику взаимодействий, как в жизни, как ребенка учить. Вот пытается герой съесть гитару - она по размерам не лезет в рот, сует камень - пусть подавится и помрет )
Ну и на этой печальной ноте я пожалуй закончу ))
В Java, например, я бы решал это дело с помощью интерфейсов, а не абстрактных классов. Ибо класс может реализовывать много интерфейсов, а расширять только один класс. Так, например, класс Гитара может реализовывать интерфейс Музыкальный инструмент, у которого есть метод Играть, интерфейс Оружие с методом Бить, и так далее.