Python でマルバツゲーム その2 |
配置する場所を確定した後、リストから使用した値を
ループして探して削除していたのですが、リストを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秒
いずれにせよ、処理を高速化させるには勝敗の判定部分を
見直したほうがよさそうです。