三目並べの目視テスト


アニメ『BEATLESS』
見た目も振る舞いも普通の人間と区別がつかない、超高度なAIが組み込まれた人型ロボットが、モノ扱いされる世界で、主人公の少年アラトは女性型ロボットレイシアに感情移入してしまいます。
レイシアは何か行動をするとき、所有者であるアラトに許可を求め、アラトがOKしないと実行しません。生命の危機というときに、アラトの判断の遅さにイライラしてしまいます。そもそも超高度なAIを組み込んでいるのだから、アラトの了解がなくても、一番いい判断ができるんじゃないでしょうか。自分で判断するのが人間、許可が必要なのがロボットってことなんでしょう。

さて、今回は前回からの続きで、三目並べのテストプログラムを作ってみたいと思います。ただし、結果の確認は人間です。

takk@deb9:~$ cat -n tictactoe.py
     1  import itertools,time
     2
     3  pm = list(itertools.permutations([1,2,3,4,5,6,7,8,9]))
     4
     5  OWinlis=[]
     6  XWinlis=[]
     7
     8  def judge(lis):
     9    pattern=[
    10    (1,2,3), (4,5,6), (7,8,9),
    11    (1,4,7), (2,5,8), (3,6,9),
    12    (1,5,9), (3,5,7),
    13    ]
    14    turn=0
    15    Olis=[]
    16    Xlis=[]
    17    for m in lis:
    18      if turn==0:
    19        Olis.append(m)
    20        if len(Olis) >= 3:
    21          for p in pattern:
    22            if 0 == len(set(p) - set(Olis)):
    23              OWinlis.append((lis, len(Olis)))
    24              return
    25      else:
    26        Xlis.append(m)
    27        if len(Xlis) >= 3:
    28          for p in pattern:
    29            if 0 == len(set(p) - set(Xlis)):
    30              XWinlis.append((lis,len(Xlis)))
    31              return
    32      turn=1-turn
    33

disp関数はインターフェースを変更しています。
パターン番号をi、全パターン数をomax、○が勝つパターンリストをlis、勝利手数をnumとしています。

    34  def disp(i,omax,(lis,num)):
    35    arr = [' ' for x in range(10)]
    36    turn=0
    37    onum = 0
    38    print lis
    39    for m in lis:
    40      print("\033[2J")
    41      print("\033[1;1H")

ターミナルウィンドウなので、エスケープシーケンスを使いました。
40行目が画面のクリア。41行目で、列1行1にカーソルを移動しています。

    42      if turn==0:
    43        arr[int(m)] = 'O'
    44        onum = onum + 1
    45      else:
    46        arr[int(m)] = 'X'
    47      print"%s|%s|%s" % (arr[1],arr[2],arr[3])
    48      print"-+-+-"
    49      print"%s|%s|%s" % (arr[4],arr[5],arr[6])
    50      print"-+-+-"
    51      print"%s|%s|%s" % (arr[7],arr[8],arr[9])
    52      print"#",i,"/",omax
    53      if num <= onum:
    54        time.sleep(2)
    55        return

勝利手数になったら2秒待って関数を終了します。

    56      turn=1-turn
    57      time.sleep(1)
    58

○や×を表示した後、1秒待ちます。

    59  for lis in pm:
    60    judge(lis)
    61
    62  omax=len(OWinlis)
    63  for i,lis in enumerate(OWinlis):
    64    disp(i+1,omax,lis)
    65
takk@deb9:~$

1マス表示したら1秒待ち、最後だけは2秒待ちます。9マスあるので最大10秒かかることになります。
本当にテストするとなると、○が勝つパターンだけでなく、引き分けと負けのパターンを確認しなければなりませんので、

$$\LARGE{\prod_{x=0}^9 x \times 10 \div 3600 = 1008}$$

となり、最大1008時間かかりますので、このテスト方法は現実的じゃありません。
AIに任せずに人が確認する方法なので、時間がかかってしまうのは仕方がないですね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA