オブジェクト指向っぽくオセロを作る2

前回は駒を表す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で宣言した変数は関数実行中にのみ有効ですが、クロージャのテクニックを使うことで関数の実行が終わったあとも、変数の値を保持できるようにしています。