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



randomにshuffleという関数があったので、これを使うことにします。
配置する場所を確定した後、リストから使用した値を
ループして探して削除していたのですが、リストをshuffleした後、
先頭から順番に使うことで、削除時のループを無くすのが狙いです。

それと、勝敗チェックを列を合計した値で判定するように
してみました。

ソースはこんな感じ。


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

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

#勝敗がついているかチェック
def checker(map):
    
    #横列チェック
    for i in range(0,7,3):
        if ((map[i] + map[i+1] + map[i+2]) == 0):
            return 0
        if ((map[i] + map[i+1] + map[i+2]) == 3):
            return 1
    
    #縦列チェック
    for i in range(0,3):
        if ((map[i] + map[i+3] + map[i+6]) == 0):
            return 0
        if ((map[i] + map[i+3] + map[i+6]) == 3):
            return 1
    
    #斜め列チェック
    if ((map[0] + map[4] + map[8]) == 0):
        return 0
    
    if ((map[2] + map[4] + map[6]) == 0):
        return 0
    
    
    if ((map[0] + map[4] + map[8]) == 3):
        return 1
    
    if ((map[2] + map[4] + map[6]) == 3):
        return 1
        
    return 2

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.687秒

・・・遅くなってるし。


ちなみに

selecter = [x for x in range(9)]
これを
selecter = [0,1,2,3,4,5,6,7,8]
とすると
0.641秒

ループは使うなってことですね。

よく考えると、これでよいですね。
selecter = range(9)
こうすると
0.641秒


いずれにせよ、処理を高速化させるには勝敗の判定部分を
見直したほうがよさそうです。


もどる