MinesweeperをJavaで作る

0,なぜJavaでMinesweeperを作ろうと思ったのか?

なぜWindows に付属のMinesweeperがあるにも関わらずMinesweeperを作ろうと思ったのか。 それにはかなりくだらない理由がある。 それは九月に行われていた合宿において組み立てられた部の新たなパソコンでMinesweeperをやっていたときにいわれた一言、 「画面全体に(Minesweeper の盤面が)広がらないか」 という趣旨の一言によって(突発的に) 作ろうとおもった、 ただそれだけである。 そしてなぜJavaで作るのかは私の趣味であることをここに付記しておく。

1,Minesweeperをつくる

1.1 つくる理由の再確認

新しく作成するMinesweeperは前段落で述べたようにできるだけ画面全体に盤面がひろがるようにしなくてはいけない。 そのために考えられるのは以下のものがある。

あとは全画面表示にしてしまうのも考えたが開発および実行環境をJava1.3に設定したため、 (補足1) 全画面表示を行えないのとMinesweeperをするために全画面表示にするのもどうだろうかという考えのもとに却下した。
以上の考えから作成するMinesweeperではマスの縦横を最低で2×2から最高100×100までにできるようにし、 かつマスの大きさを変更できるようにしてみることにした。

1.2 Javaでつくる上での問題点

Javaでつくるとなると多くの環境を考えて作らなくてはいけない問題があるそれらは主に以下のようなものがある。

Awt のグラフィックの問題はJava2(Java1.2以降)には“可能な限りすべてのプラットフォームで同じように機能する”といわれるSwingをもちいることである程度は統一できる。 肝心の盤面のマスは画像を用いることで解決した。 また画像を差し替える機能をつけることでカスタマイズできる可能性も出来た(可能性なので出来ない可能性もある)。

マウスのボタン数は実はJava5.0(Java1.5)からJavaだけで知ることができる情報でありJava1.3では知ることができない。 本家Minesweeperにおいてマウスは以下のようになっている。

左クリック
マス目を開ける
右クリック
マス目に旗や?をつける
中クリック(あれば)
左と右同時押しと同じ

しかしJava ではBUTTON_1, BUTTON_2, BUTTON_3といった概念であるのでマウスのボタン数が2ボタンなのか3ボタンなのかもしくは1ボタンしかないのか分からないと右クリックが BUTTON_2, BUTTON_3なのかまた右クリックできないかが判別できない。 そこで解決策としてBUTTON_2, BUTTON_3を共に右クリック扱いにしてしまうことで解決した。 また1ボタンマウス用にCtrl+クリックとShift+クリックに右クリックと同時押しの機能を与えることにした。 これによりマウスがある環境でJava1.3があれば遊べるようにすることができるようにした。

2,今後の予定

現状まだ旗を立てた数カウンタやWindowのサイズが大きすぎる時につけるスクロールバーの実装や盤面の動的なサイズの変更など必要なもの以外に本家にはないものの追加を予定している。 具体的に今考えているものとしては以下のものが挙げられる。

総クリック回数カウンタや時間制限を付けるものはそう難しくないものなので、 また爆弾の配置をファイルから読み込む事に関しては内部で盤面のデータを管理しているクラスを直列化(補足2)し、 それを用いることで必要な情報を得るようにすることで実現できると考えている。 ただし直列化に関しては今現在私が知識を持っていないので今後勉強を進めていく方針である。


(補足1):Java1.3を用いる理由
実行環境をJava1.3にしたのはできるだけ多くの人ができるという条件と必要な機能の兼ね合いのもと決定した。 Java1.4からJavaのみで画面の解像度の変更が行えるようになっている。
(補足2):直列化
JavaのオブジェクトをJavaのバイトストリームにコード化することで、オブジェクトを外部にファイルとして出力するといったことが出来る。

執筆者 11/31
執筆日 2005年10月7日
Web版改訂 2005年10月10日