マルバツゲーム:賢いプレイヤー
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;
}
|

syat
#6207()
Rating0/2=0.00
マルバツゲームで、賢いプレイヤーの思考ルーチンを実装してください。
賢いといってもいろいろありますが、
1.負けない
2.できるだけ勝つ
という条件でいってみたいと思います。
ランダムプレイヤーと1万回バトルした結果(勝ち・負け・分け)を表示してください。
先攻になっても後攻になっても無敗!となれば言うことなしです。
[ reply ]