Hmm. I'm curious: if the critter object doesn't know its map, then what do you do with something as basic as this: movement. Suppose your "Critter" object has a "move()" method, which, well, makes the critter move. Seems reasonable, no? But then you have to check for walls, etc. (you don't want your critter to move through the walls (unless it's a ghost or something)!) which means you need access to the map. Plus, if the map contains a reference to the critter attached to the tile it's standing on, that needs updating. So what should one do? What should that call to "move()" do?
Also, where should the "critters" be stored, anyway? Currently, in my program I have them "owned" by the map, since they're on the map and most would be associated with a map, anyway (when you save out a map, you have to save out all critters on it). How should it be?
See, this is why I've become so disappointed with OOP over the past several years. This question comes up so often from so many different people that I simply consider it a failing of the paradigm.
The way I reckon it, it's because people try to find real-world analogs to their program architecture, where there really shouldn't be. For instance:
It seems obvious to you that a critter should have a move method. I say it's not obvious at all. If you don't want your critter object to have a reference to your world, then the world should have a move(Entity e) method that moves critters and other objects around.
It may not be intuitive to think that way in real-world terms, but it is much cleaner OO. You ask your world to move everything that needs to be moved, just like you ask your main game loop to update everything that needs updated.
Honestly there is not a language in existence that has a proper scope system, in my opinion. Almost all the problems I have with programming are caused by where to keep data and the juggling required to get those data to the proper functions. It's not a technical limitation; it's a conceptual one. I know I could throw any old system together and force it to work. The trick is whether it is intuitive to think about or not.
Games are about the most state-based programs you can write, which only compounds the problem.