I've had a lot of fun with agent-based and discrete event simulations. Hook it up to a visual and it's basically a game. Writing a basic simulation engine is also a lot of fun. Simulation is also the only application where I've felt comfortable with classical object-oriented modeling. I always find that object oriented programming forces me to deal with a lot of emergent complexity, but when you're doing simulation modeling, emergent complexity is the whole point.
NetLogo is fun for toy agent-based simulation models. It includes visuals. For discrete event simulation, I recommend SimPy. If you like animations and you're willing to trade some personal info for free stuff, Simio has a free version that supports mixing discrete event and agent based simulation.
Edit: I realize I only answered about half of your question. I was in grad school when I did simulation modeling, this was about 5 years ago. I was working on modeling industrial processes. Simulation is great in that context because at a certain point queueing theory breaks down. I can't tell you how many talks I sat through that derived exciting conclusions from the assumption that all arrival processes are Markovian.