This is a commonly used approach, and when handled properly, it can be very helpful. While some people do not like them and call them “classes of God,” they are not really properly structured. Problems begin to arise if you think of it in the same way as a “class that contains everything,” but if you think of an information structure, you should be fine.
Take an example. Let me name the class that interests you "Game". It is always a good place to start, because it is an object of the real world. The game should know about itself: player1, player2, map, turnNumber. Put game methods to access them. This is a perfectly correct and good design. Then these objects, in turn, will know about themselves. The player will know the name, skill level, left without energy. The map will know the size and terrain on each square. If you need to know about a single square, then you have an implementation of the map class getSquare (x, y). The square knows what its type of terrain is.
The main thing is that you only pass the method (things) that he needs. A method that calculates the path between two units takes a map as an argument. You do not pass the game and do not allow it to remove the card.
Many systems have such objects. Example java.lang.Runtime. However, you should minimize their use using the methods above.
There is one very important temptation to avoid. Once you find that your Master class is passed to almost every method, you might think, “Why don't I just make this class available to every method without using it as an argument?” So these are singletones. Avoid.
source share