マルバツゲーム
Posted feedbacks - JavaScript
MARU: 5765 BATU: 2707 DRAW: 1528 となりました。
RandPlayer.prototype.think の部分を修正することで Player を差し替えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | var Board = function(){ this.init(); };
Board.prototype = {
cell : [],
size : 3,
init : function(){
for( var i = 0; i < this.size; i++ ){
this.cell[i] = [];
}
},
isVacant : function( x, y ){ return this.cell[x][y] == undefined; },
put : function( x, y, id ){ this.cell[x][y] = id; },
judge : function( x, y ){
var i;
var size = this.size;
var cell = this.cell;
for( i = 1; i < size; i++ ){
if( cell[i-1][y] == undefined || cell[i-1][y] != cell[i][y] )
break;
}
if( i == size ) return true;
for( i = 1; i < size; i++ ){
if( cell[x][i-1] == undefined || cell[x][i-1] != cell[x][i] )
break;
}
if( i == size ) return true;
if( x == y ){
for( i = 1; i < size; i++ ){
if( cell[i-1][i-1] == undefined || cell[i-1][i-1] != cell[i][i] )
break;
}
if( i == size ) return true;
}
if( x + y == size - 1 ){
for( i = 1; i < size; i++ ){
if( cell[i-1][size-1] == undefined || cell[i-1][size-i] != cell[i][size-i-1] )
break;
}
if( i == size ) return true;
}
return false;
}
};
var Player = function(){};
Player.prototype = {
put : function( b, x, y ){ b.put( x, y ); },
think: undefined,
win : 0
};
var RandPlayer = function(){};
RandPlayer.prototype = new Player();
RandPlayer.prototype.think = function( b ){
var x,y,tmp;
var size = b.size
var max = size * size;
while(1){
tmp = Math.floor(Math.random() * max );
x = Math.floor( tmp / size );
y = tmp % size;
if( b.isVacant( x, y ) ) break;
}
return {x:x, y:y};
};
var b = new Board();
var max = b.size * b.size;
var target;
var p = [ new RandPlayer(), new RandPlayer() ];
for( var i = 0; i < 10000; i++ ){
b.init();
for( j = 0; j < max; j++ ){
target = p[j%2].think( b );
b.put(target.x, target.y, j%2 );
if( b.judge( target.x, target.y ) )
break;
}
if( j != max ){
p[j%2].win++;
}
}
document.write("MARU: " + p[0].win + "<br/>" );
document.write("BATU: " + p[1].win + "<br/>" );
document.write("DRAW: " + (10000 - p[0].win - p[1].win) + "<br/>" );
|


syat
#6190()
Rating4/4=1.00
マルバツゲームは3×3の格子に交互に○と×を書き込み、先に縦・横・斜めに記号をそろえたほうが勝ちというおなじみのゲームです。
「毎ターン乱数を使って手を決めるランダムプレイヤー同士を対戦させる」というのが今回のお題です。 1万回対戦させ、勝ち・負け・引き分けの数を表示してください。 そして先手が有利であることを確かめてください。
良い手を思考するプレイヤーについては別のお題にしようと思っています。 プレイヤーを簡単に差し換えることができる設計を目指してください。
[ reply ]