2004年度JAVAゼミコンテスト作品 「Othello」 2ADM3110 田中 貴之
この作品をつくった動機 ・ 菊池研HPにあるサーブレットのテキストページの課題の所にある並木さんがつくったオセロに刺激を受けてしまったため。 →挑戦したくなった!! ・ アプレットで何かしらゲームを作ってみたかったため。
<Othelloの簡単な説明> ネット内においてあるオセロゲームとほとんど変わりありません。(ただ単に挑戦したかっただけなんで、ネタ要素やひねりとかほとんど存在しません) コンピュータがお相手しますが、乱数で石を置くところを決定しているのではっきりいってかなり弱いです。
<主な変数> int turn; 順番を表す(1=黒、2=白) boolean place; 順番を表す(1=黒、2=白) boolean place; 石が置ける場所の判定(true=置ける,false=置けない) int stone[64] 石の状態を表す(0=なし、1=黒、2=白) boolean flag; ゲームの終了判定(盤面が石で埋まってるかどうか) nw=白石、nb=黒石 で石の数を数えて勝負を判定する。 ※booleanとは、「true」と「false」のみの結果を返す変数です。要するに、「OK」なのか「だめ」なのかの判定に使用。
<オセロの表示> 石は、drawOvalメソッドを使用して描きました。 オセロ盤は、あらかじめマス目の幅squareと盤面外の余白marginを設定しておき、8*8のマス目になるよう、for文で幅を足していきながら、drawLine()で線を引きました。 PASSボタンとRESETボタンはmousePressedメソッドを使用して、ある座標の範囲に押されたら実行するようになっています。 PASS・・・順番を管理するturnの値を変更して、相手に順番を回す(turn = 3 - turn と設定することで相手に回る) RESET・・・初期設定のinit()メソッドを呼び、石の配置を初期値に戻す。
<勝負の判定> 黒石と白石の数は、それぞれblack()メソッドとwhite()メソッドで数を数えて、先ほどでたnw(白石),nb(黒石)に入れていく。 ゲームの終了の判定は、boolean変数のisNotEndメソッドで調べて、flagに結果を入れる。(flagが「false」なら終了で、このときnw,nbの値を比較して判定結果を表示します)
オセロ盤の座標の設定 →→→ col ↓ ↓ row 座標位置はnx か ny(反転のとき使用)という形で表す。 ↓ ↓ row 座標位置はnx か ny(反転のとき使用)という形で表す。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 56 60 61 62 63
<どのマスに押されたか> 石が置かれた場所のマスの番号nxの計算 ixとiyはマウスが押されたマス座標(ix,iy)を表している。 rx = (ix-margin) / square; //colの値 ry = (iy-margin) / square; //rowの値 nx = ry * n + rx; 盤面上に押されれば、押された座標(ix,iy)からマス目の幅で割って,colとrowとマス目の数nを使って位置を計算します。
<石が置けるかどうか?> Checkメソッドで行います。 まず、石を置いて、そこから8方向を調べて、石が置いてあるか&隣が同じ石でないかを判定する(周りに石がない&すべて同じ石だと置けない) 違う色の石があった場合、その石がある方向に自分の色の石を見つけるまで1個ずつ進める。(なければ戻って他の方向を判定し直す) 同じ色の石が見つかった場合、その石と置いた石に挟まれた全ての違う色の石をひっくり返しながら、置いた石の位置まで戻っていく。 そして、8方向すべて判定するまで続けます。
<その他> huntenスレッド 一気にひっくり返るのではなく、1個ずつ戻っていくような感じでひっくり返るように設定。 updateメソッド 一気にひっくり返るのではなく、1個ずつ戻っていくような感じでひっくり返るように設定。 updateメソッド 石が置かれるごとに表示を更新していくメソッド どっちの石がユーザーかコンピュータかが分かるように、表示するように設定。
<感想> <参考文献> マス目やら現在の石の個数など、うまく表示されなかったのがかなり辛かった。直すだけでもかなりの時間がかかった。 コンピュータがかなり弱いと感じるので、暇があればもう少し強いコンピュータの設定をつくってみたい。 <参考文献> ・JAVA言語(入門ソフトウェアシリーズ) ナツメ社 河西朝雄 ・JAVAゲーム・アプレット I/OBooks社 村山要司 他2冊とWEBページあちらこちら参照