マルバツゲーム
Posted feedbacks - Perl
ランダムプレーヤーではなくて、最初に手順を決定してしまうので、条件を満たして無いかも…。
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 | #!c:\perl\bin\perl.exe
use strict;
my $player1 = 0;
my $player2 = 0;
my $draw = 0;
my $result;
for(1..10000){
$result = &doMarubatsu();
if($result == 1){
$player1++;
}elsif($result == 2){
$player2++;
}elsif($result == 0){
$draw++;
}
}
print "player1: $player1 \n";
print "player2: $player2 \n";
print "draw: $draw \n";
sub doMarubatsu{
my @masu = (0,0,0,0,0,0,0,0,0);
my @turn = &shuffle(0..8);
my $result;
for(0..8){
@masu[$turn[$_]] = $_ % 2 + 2;
$result = &marubatsuJudge(@masu);
if($result != 0){last;}
}
return $result;
}
sub marubatsuJudge{
my @winCase = ([0,1,2],[0,3,6],[0,4,8],[1,4,7],[2,5,8],[2,4,6],[3,4,5],[6,7,8]);
my @masu = @_;
my $checkNum;
for(@winCase){
$checkNum = 1;
for(@$_){
$checkNum *= $masu[$_];
}
if($checkNum == 8 or $checkNum == 27){last;}
}
if($checkNum == 8){
return 1;
}elsif($checkNum == 27){
return 2;
}else{
return 0;
}
}
sub shuffle{
my @array = @_;
my @newArray;
while(@array){
push(@newArray,splice(@array,rand(@array),1));
}
return @newArray;
}
|

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