challenge マルバツゲーム:賢いプレイヤー

#6190 の続編です。
マルバツゲームで、賢いプレイヤーの思考ルーチンを実装してください。

賢いといってもいろいろありますが、
1.負けない
2.できるだけ勝つ
という条件でいってみたいと思います。

ランダムプレイヤーと1万回バトルした結果(勝ち・負け・分け)を表示してください。
先攻になっても後攻になっても無敗!となれば言うことなしです。

Posted feedbacks - C

再挑戦^^;
nelさんのアルゴリズムを使用しました。

後手 X
O:0, X:8549, T:1451
O:0, X:8637, T:1363
O:0, X:8611, T:1389

なるほどー
無敗ですね
 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
86
87
88
89
struct 
{
    int pat;
    int out;
} reach[] = {
 {NO_0|NO_8, NO_4}, {NO_2|NO_6, NO_4}, {NO_3|NO_5, NO_4}, {NO_1|NO_7, NO_4},

 {NO_1|NO_2, NO_0}, {NO_3|NO_6, NO_0}, {NO_4|NO_8, NO_0},
 {NO_5|NO_8, NO_2}, {NO_4|NO_6, NO_2}, {NO_0|NO_1, NO_2},
 {NO_7|NO_8, NO_6}, {NO_0|NO_3, NO_6}, {NO_2|NO_4, NO_6},
 {NO_6|NO_7, NO_8}, {NO_2|NO_5, NO_8}, {NO_0|NO_4, NO_8},

 {NO_0|NO_2, NO_1}, {NO_4|NO_7, NO_1},
 {NO_0|NO_6, NO_3}, {NO_4|NO_5, NO_3},
 {NO_2|NO_8, NO_5}, {NO_3|NO_4, NO_5},
 {NO_1|NO_4, NO_7}, {NO_6|NO_8, NO_7},
 { 0 , 0 }, 
};

struct 
{
    int pat;
    int out;
} pattern[] = {
 {0, NO_4 }, 
 {NO_4, NO_0}, { NO_4, NO_2}, {NO_4, NO_6}, {NO_4, NO_8}, 
 {NO_0|NO_8, NO_1}, {NO_0|NO_8, NO_3}, 
 {NO_0|NO_8, NO_5}, {NO_0|NO_8, NO_7}, 
 {NO_6|NO_2, NO_1}, {NO_6|NO_2, NO_3}, 
 {NO_6|NO_2, NO_5}, {NO_6|NO_2, NO_7}, 
 {NO_1|NO_6, NO_0}, {NO_1|NO_8, NO_2}, 
 {NO_3|NO_2, NO_0}, {NO_3|NO_8, NO_6}, 
 {NO_5|NO_0, NO_2}, {NO_5|NO_6, NO_8}, 
 {NO_7|NO_0, NO_6}, {NO_7|NO_2, NO_8}, 
 {NO_0, NO_2}, {NO_0, NO_6}, {NO_0, NO_1}, {NO_0, NO_3}, 
 {NO_2, NO_0}, {NO_2, NO_8}, {NO_2, NO_1}, {NO_2, NO_5}, 
 {NO_4, NO_0}, {NO_4, NO_8}, {NO_4, NO_3}, {NO_4, NO_7}, 
 {NO_8, NO_2}, {NO_8, NO_6}, {NO_8, NO_5}, {NO_8, NO_7}, 
 {NO_1, NO_2}, {NO_1, NO_0}, 
 {NO_3, NO_0}, {NO_3, NO_6}, 
 {NO_5, NO_2}, {NO_5, NO_8}, 
 {NO_7, NO_6}, {NO_7, NO_8}, 
 {0, NO_0}, {0, NO_2}, {0, NO_6}, {0, NO_8}, 
 {0, NO_1}, {0, NO_5}, {0, NO_3}, {0, NO_7}, 
 { 0 , 0 }, 
};


/* ox_play_tuyoi */
int ox_is_reach( LPOXGAME g, int x )
{
    int m, i;
    m = g->map_o | g->map_x;

   for(i = 0; reach[i].out != 0; i++ )
    if( Match( x , reach[i].pat )
       && (!Match( m , reach[i].out)) ) return reach[i].out;
    return 0;
}
int ox_play_tuyoi(LPOXGAME g, const char player)
{
    int xa, xb, m, xr, i;

    if(player == 'O') {
        xa = g->map_o; /* O プレイヤ優先*/
        xb = g->map_x;
    }

    if(player == 'X') {
        xa = g->map_x; /* X プレイヤ優先 */
        xb = g->map_o;
    }
    m = g->map_o | g->map_x;
    if(Match(m, (NO_0|NO_1|NO_2|
                 NO_3|NO_4|NO_5|
                 NO_6|NO_7|NO_8))) return 0; /* map full */

    /* リーチなら埋めて勝つ */
    if(xr = ox_is_reach(g, xa)) return xr;

    /* 敵リーチ 阻止 */
    if(xr = ox_is_reach(g, xb)) return xr;

   for(i = 0; pattern[i].out != 0; i++ )
    if( Match( xb , pattern[i].pat )
       && (!Match( m , pattern[i].out)) ) return pattern[i].out;

    return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...