Python でマルバツゲーム その3



勝敗の判定をビット演算で行うように見直してみました。

ソースはコチラ

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from random import shuffle
import time

bit_ary = [1,2,4,8,16,32,64,128,256]
#横列
#1+2+4=7
#8+16+32=56
#64+128+256=448
#縦列
#1+8+64=73
#2+16+128=146
#4+32+256=292
#斜め
#1+16+256=273
#4+16+64=84
check_ary = [7,56,448,73,146,292,273,84]

def fight():
    
    #盤面を定義
    map = [0, 0]
    #配置できる場所を定義
    selecter = range(9)
    #0:先手 1:後手
    user = 0
    shuffle(selecter)
    
    #勝負がつくまでループ
    while(True):
        place = selecter[0]
        #配置場所を選択肢から削除
        del(selecter[0])
        #選択した配置場所をユーザIDで埋める
        map[user] += bit_ary[place]
        
        #勝敗チェック
        #勝負がついていればリターン
        if checker(map[user]):
            return user
        
        #先手、後手切り替え
        if user == 0:
            user = 1
        else:
            user = 0
        
        #配置場所が無くなる(ドロー)であれば、
        #ループを抜ける
        if len(selecter) == 0:
            break
    
    return 2

#勝敗がついているかチェック
def checker(map):
    
    #ビットで勝敗判定
    for check in check_ary:
        if ((check & map) == check):
            return True
    return False


if __name__ == '__main__':
    print 'start'
    
    t1 = time.time()
    
    #win,lose,tie
    result = [0] * 3
    
    for i in xrange(10000):
        winer = fight()
        result[winer] += 1


    print result
    
    t2 = time.time()
    print t2 - t1
    print 'end'


処理時間
0.297秒

おお。
初回のプログラムから処理速度は半分以下に短縮されています。

一撃で勝敗を判定できるロジックを思いつけば、さらに
処理速度が向上すると思うのですが・・・

今のところ、ネタがないです。


もどる