Python でマルバツゲーム その1 |
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秒
おっ、汚いソースですが実行速度は上回りました。
さらに実行速度を向上させる方法を考えて見ます。