Minesweeper!

Finally! My Minesweeper game is ready for the web! It’s the classic game in a web 2.0 costume. Why did I do that? when surely it’s been done before. Because I like minesweeper.

Developing this game has taught me one something about the time it can take from prototype to somewhat finished product: Developing the completely playable “offline” prototype version was quick and easy – after all, I developed minesweeper already in high school on my programmable Casio calculator. So I thought it would take about trice the time to finish it, but in the end it took about ten times that time.

One reason for this is the online highscore functionality. But T-rex, online highscores just means keeping a list of the best times on the server and sending it to the client. Yes, but then it wouldn’t take much to figure that all you need to do is type “register_highscore.php?time=0&name=script%20kiddie” into your browser’s address field to get an instant all-time high. So how did I solve that?

The game is played simultaneously on the client (i.e. in the web browser) and on the server (in php). Sweeps are sent at regular intervals to the server, which then plays the same moves and checks the results. So in the end it’s the server that decides that a game is over, how long it took, and whether that’s a new highscore or not. That, ideally, is not so complicated either, but well there are lots of opportunities to make stupid mistakes. (Especially when you’re having a shochu on the rocks while coding (I did it during my vacation).)

The other reason is that it’s hard to make a web app behave like a nifty game. You need graphics, animations, and that kind of stuff that often causes you to run into problems with layout positioning and, most of all, browser inconsistencies. Web browsers just aren’t ideal for making applications yet. (Well, tell me a platform that is, anyway…) The game runs best, as always, in Firefox. Although I admit I haven’t tried IE 6 yet. I’ll tackle that beast tomorrow. :) IE 7 works good, though.

I still have a number of features planned that I’ll implement during the coming weeks, but at least now it’s good enough to play. Try and beat my times! Here’s the url again:

http://henrikfalck.com/minesweeper/


Caching in Php

Php by default tries as hard as it can to make the web browser not cache pages. While I can understand the rationale behind this a bit, sometimes you want caching. Caching is actually a good thing! you know. It means faster load times and lower bandwidth and processing requirements.

So I was surprised by how hard it is to turn off this aggressive non-caching policy. I googled for a few minutes and browsed the php documentation without finding an easy way of doing it. Ok, so you can use the following code snippet to enable caching in php (the argument to the function is number of seconds the page is valid):

function send_cache_headers($expire) {
  header("Cache-Control: max-age=$expire");
  header("Pragma: cache");
  header("Expires: " . gmdate('D, d M Y H:i:s \G\M\T', time() + $expire));
}


A JavaScript messaging library

I’m working on a library for sending messages between browsers using JavaScript, XMLHttpRequest, and PHP/sqlite on a server. The idea is that even though it’s not possible to open a connection of sorts directly between the clients (i.e. web browsers viewing a page, or even different pages, or running a widget), you can pull for updates in a way that will make it seem like you have a connection open. Not only that, but all client listening on the same channel, so to speak, will receive the messages, so it’s like broadcasting. Technically this is nothing fancy, it’s just that you don’t see it much, and if implemented and packaged nicely I think it’ll be useful and fun to use.

How do I know this works? Because it’s based on a much cleaned up version of the code used on paintmyblog.com – which has proven itself already. I look forward to writing some cool apps using this library, and I hope other people will use it as well. Expect the first release next week.