challenge マルバツゲーム

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

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

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

Posted feedbacks - Python

プレイヤーを単純な関数として実装しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from random import choice

def p(d, x):
  return choice([i for i, j in enumerate(d) if j == 0])

def w(d, i):
  f = lambda l: [i] * 3 == l
  return (f(d[:3]) or f(d[3:6]) or f(d[6:]) or
          f(d[::3]) or f(d[1::3]) or f(d[2::3]) or
          f(d[::4]) or f(d[2:7:2]))

def m(*p):
  d = [0] * 9
  for i in range(9):
    x = i % 2 + 1
    d[p[i%2](d, x)] = x
    if i > 3 and w(d, x):
      return x
  return 0

r = [0] * 3
for i in range(10000):
  r[m(p, p)] += 1
print 'draw: %d\n1st:  %d\n2nd:  %d' % tuple(r)

Index

Feed

Other

Link

Pathtraq

loading...