オブジェクト指向っぽくオセロを作る10
- オブジェクト指向っぽくオセロを作る
- オブジェクト指向っぽくオセロを作る2
- オブジェクト指向っぽくオセロを作る3
- オブジェクト指向っぽくオセロを作る4
- オブジェクト指向っぽくオセロを作る5
- オブジェクト指向っぽくオセロを作る6
- オブジェクト指向っぽくオセロを作る7
- オブジェクト指向っぽくオセロを作る8
- オブジェクト指向っぽくオセロを作る9
- オブジェクト指向っぽくオセロを作る(まとめ)
続き。今回はコンピューターのプレイヤーを作っていきます。まず、人間のプレイヤーについてのおさらいです。以下のような実装になっていました。
/** * プレイヤーを表すクラス */ 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,"初春飾利");