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

続き。今回はコンピューターのプレイヤーを作っていきます。まず、人間のプレイヤーについてのおさらいです。以下のような実装になっていました。

/**
 * プレイヤーを表すクラス
 */
var Player = function(piece, name) {
	var othello;
	/**
	 * Othelloオブジェクトを登録(外部公開)
	 */
	this.setOthello = function(_othello){
		othello = _othello;
	};
	/**
	 * 名前を返す(外部公開)
	 */
	this.toString = function() {
		return name;
	};
	/**
	 * このプレイヤーの駒を返す(外部公開)
	 */
	this.getPiece = function() {
		return piece;
	};
	/**
	 * セルがクリックされた時の処理(外部公開)
	 */
	this.selectEvent = function(x, y) {
		if(othello)
			othello.doFlip(this, x, y);
	};
	/**
	 * ターンが回ってくると実行(外部公開)
	 */
	this.turn = function() {
	};
};

人間はセルを表すDOM要素がクリックされたとき駒を置いていました。しかし、コンピューターの場合、ターンが回ってきたときに駒を置くようにします。要するにturnメソッド内部に処理を記述します。ここでは新しくComputerクラスを作成します。Computerクラスの持つ基本的な機能はPlayerクラスと変わりません。そこでPlayerクラスを継承することで実装します。

/**
 * プレイヤーを表すクラス
 */
var Player = function(piece, name) {
	var othello;
	
	…
	
	/**
	 * Othelloオブジェクトを登録(外部公開)
	 */
	this.getOthello = function(){
		return othello;
	};
};

/**
 * コンピュータのプレイヤーを表すクラス
 */
var Computer = function(piece, name) {
	Player.call(this, piece, name);
	/**
	 * セルがクリックされた時の処理(外部公開)
	 * スーパークラスのメソッドをオーバライド
	 * 元の機能を削除している
	 */
	this.selectEvent = function(){};
	/**
	 * ターンが回ってくると実行(外部公開)
	 * スーパークラスのturnメソッドをオーバライド
	 */
	this.turn = function(){
		var othello = this.getOthello();
		for ( var y = 0; y < 8; y++) {
			for ( var x = 0; x < 8; x++) {
				if( 0 < othello.doFlip(this, x, y) ){ //片っ端から置いていく
					return; //置けたら終わり
				}
			}
		}
	};
};
Computer.prototype = new Player();
Computer.prototype.constructor = Computer;

継承方法の都合上、Playerクラスに新しくgetOthelloというメソッドを追加しました。今回継承の方法としてプロトタイプを利用しています。この方法で継承を行った場合、Playerの持つ、var othelloという値にアクセスすることができません。そこで、getOthelloというアクセサを設けたわけです。さて肝心のComputerクラスですが、最初にselectEventをオーバライドして、セルがクリックされても特に何もしないようにします。次にturnメソッドもオーバライドしています。Playerクラスではturnメソッドの処理を空にしていましたが、こちらは片っ端から駒を置くという処理を実現しています。めちゃくちゃ弱いですが、一応自動で駒を置いてくれます。このComputerクラスからオブジェクトを生成する方法は以下のようになります。これをOthelloのinitメソッド内部で実行します。

var p1 = new Player(Piece.BLACK,"御坂美琴"); //人間
var p2 = new Computer(Piece.WHITE,"佐天涙子"); //コンピューター

オブジェクトを生成するところだけ少し異なりますが、ComputerはPlayerを継承しているので、基本的な扱い方は同じです。Playerと全く同じメソッドを利用することができます。案外あっさりとコンピューターを実装できてしまいました。

もう少し賢いコンピューター

もう少し賢いコンピューターを作ります。Computerを継承して、新しくComputerExというクラスを作ります。こっちのコンピューターは、全セルに対してチェックを行い、一番たくさん駒を取れる箇所に駒を置きます。

/**
 * コンピュータのプレイヤーを表すクラス
 * Computerを継承
 */
var ComputerEx = function(piece, name) {
	Computer.call(this, piece, name);
	/**
	 * ターンが回ってくると実行(外部公開)
	 * スーパークラスのturnメソッドをオーバライド
	 */
	this.turn = function(){
		var othello = this.getOthello();
		var maxNum = 0; //一番たくさんとれる駒の数
		var maxX = -1;
		var maxY = -1; //そのときの座標
		for ( var y = 0; y < 8; y++) {
			for ( var x = 0; x < 8; x++) {
				var num = othello.checkPiece(piece,x,y);
				if(maxNum < num){
					maxNum = num;
					maxX = x;
					maxY = y;
				}
			}
		}
		if(0 < maxNum)
			if( othello.doFlip(this, maxX, maxY) != maxNum)
				throw new Error("ComputerEx内でエラーが発生しました");
	};
};
ComputerEx.prototype = new Computer();
ComputerEx.prototype.constructor = ComputerEx;

使い方はさっきと同じ。Othelloのinitメソッド内部で次のようにしてプレイヤーのオブジェクトを生成します。

var p2 = new ComputerEx(Piece.WHITE,"初春飾利");

今回はここまで

重要な部分は実装し終わりました。次回はここまでのまとめです。ソースコードを添付しておきます。

oop-othello10.zip 直