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



どう書く?org
http://ja.doukaku.org/
をたまに見ているのですが、見るだけで解答したことはありません。

勉強のため、
http://ja.doukaku.org/173/
この○×問題を解いてみたいと思います。

既にPythonでの回答が出ていますが・・・あんなに鋭い
プログラムは書けそうに無いので、ソースの短さ、エレガントさ
ではなく、実行速度を目標に書いてみたいと思います。

まず、あまり深く考えず、10分程度で書いたソースがコレ


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

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

#指定された値をリストから削除する
def deletemap(map, value):
    for i in range(len(map)):
        if (map[i] == value):
            del(map[i])
            break
            
    return map

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

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


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



・・・汚い。
でも、素人が書いたらこんなもんですよねっ。ねっ?



実行速度は、
どう書く?org
0.812秒

上のソース
0.625秒


おっ、汚いソースですが実行速度は上回りました。

さらに実行速度を向上させる方法を考えて見ます。


もどる