challenge マルバツゲーム

マルバツゲームは3×3の格子に交互に○と×を書き込み、先に縦・横・斜めに記号をそろえたほうが勝ちというおなじみのゲームです。

「毎ターン乱数を使って手を決めるランダムプレイヤー同士を対戦させる」というのが今回のお題です。 1万回対戦させ、勝ち・負け・引き分けの数を表示してください。 そして先手が有利であることを確かめてください。

良い手を思考するプレイヤーについては別のお題にしようと思っています。 プレイヤーを簡単に差し換えることができる設計を目指してください。

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;
}

Index

Feed

Other

Link

Pathtraq

loading...