オブジェクト指向っぽくオセロを作る2
- オブジェクト指向っぽくオセロを作る
- オブジェクト指向っぽくオセロを作る3
- オブジェクト指向っぽくオセロを作る4
- オブジェクト指向っぽくオセロを作る5
- オブジェクト指向っぽくオセロを作る6
- オブジェクト指向っぽくオセロを作る7
- オブジェクト指向っぽくオセロを作る8
- オブジェクト指向っぽくオセロを作る9
- オブジェクト指向っぽくオセロを作る10
- オブジェクト指向っぽくオセロを作る(まとめ)
前回は駒を表すPieceオブジェクトを作成しました。今回は「オセロの盤」を表すBoardオブジェクトから作成していきます。
盤の役割確認
オセロの盤は8*8の64セルになります。これをBoardオブジェクトでは内部に8*8の二次元配列を持たせることで表現しようと思います。またこの配列には、前回作成したPiece.BLACK、Piece.WHITE、Piece.EMPTYを入れます。前回、PieceとしてEMPTY、つまり駒が置いてない状態というのも駒にしました。そのため、64個のセルには必ず何らかの駒が入っているということになります。セルがnullという状態を作らないようにします。また内部に二次元配列を持っていますが、この二次元配列を外部から直接操作されないよう、getterとsetterを設けます。
//このように外部から配列を直接利用されたくない board.cells[x][y] = Piece.BLACK; //setterを使って操作させる board.setPiece(Piece.BLACK,x,y);
普通オセロをする場合、盤が1つしかありません。しかし今回Boardオブジェクトをクラスとして扱い、インスタンス化することで、いくつでも新しい盤を作れるようにしておきます。例えばこんな感じで新しい盤をいくつも作れるように設計します。
var b1 = new Board(); var b2 = new Board(); var b3 = new Board();
盤がいくつも作れると、何が嬉しいのでしょうか。このように実装を行うと、ゲームの状態を記録しておく場合に便利かもしれません。またプレイヤーがコンピューターの場合、駒を置く場所を考える際、仮想的な盤を使って、数手先を計算するかもしれません。このように、盤はいくつも作れるようにしておいたほうが良いでしょう。
盤を実装
上記の条件から、次のような実装になりました。
var Board = function(){ //8*8の二次元配列を作り、Piece.EMPTYで初期化 var cells = new Array(8); for ( var x = 0; x < cells.length; x++) { cells[x] = new Array(8); for ( var y = 0; y < cells[x].length; y++) { cells[x][y] = Piece.EMPTY; } } //setter this.setPiece = function(piece, x, y) { if (!piece || !(0 <= x) || !(x <= 7) || !(0 <= y) || !(y <= 7)) return false; // 引数チェック cells[x][y] = piece; return true; }; //getter this.getPiece = function(x, y) { if (!(0 <= x) || !(x <= 7) || !(0 <= y) || !(y <= 7)) return; // 引数チェック return cells[x][y]; }; };
このBoardオブジェクトは内部にcellsというローカル変数を持っています。通常varで宣言した変数は関数実行中にのみ有効ですが、クロージャのテクニックを使うことで関数の実行が終わったあとも、変数の値を保持できるようにしています。