Python 2:399 401 349 333 317 370バイト
2xバグ修正:l4m2のクレジット
-52文字:地下モノレールのクレジット
-16文字:Jonathan Frechの功績
-26文字:user202729のクレジット
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
オンラインでお試しください!
前学期の線形代数コースの初日に、私の鋭敏な大学院生のインストラクターは、三目並べボードをマトリックスとして表すと提案しました。
4 | 9 | 2
--+---+--
3 | 5 | 7
--+---+--
8 | 1 | 6
次に、3を連続して取得することは、範囲[1,9]で合計15までの3つの数値を選択することと同じです。この答えはこの考えを利用しています。この関数は、ボードを表す9つの数字を含むリストを取ります。0は空きスペースを示し、1は相手によって占有され、2はプログラムによって行われた以前のプレイを表します。最初の3行は、プログラムが選択した番号(p)、反対側が選択した番号(o)、およびまだ利用可能な番号(a)を示しています。次に、使用可能な番号を調べて、すでに選択した2つの番号と組み合わせて、それらのいずれかが15に追加されるかどうかを確認します。もしそうなら、その広場を選んで勝ちます。即座に勝つ動きがない場合、同じ方法を使用して相手が勝つことができるかどうかを確認します。可能であれば、彼らの勝利の広場が必要になります。勝つ動きもブロックする動きもない場合、隅に移動します。これは愚かな仲間を防ぎます:
- - -
- X -
- - -
- O - # Bad Move
- X -
- - -
- O X
- X -
- - -
- O X
- X -
O - -
- O X
- X -
O - X
これらの状況のいずれも発生しない場合、任意に正方形を選択します。この関数は、アルゴリズムによって選択された0のインデックス付き正方形を表す数値[0,8]を出力します。
編集:アルゴリズムは、対角線よりも中心を優先するようになりました。これにより、l4m2および関連する戦略によって指摘された別の愚か者の交配の可能性が防止されます。
編集:明確にするために、関数は配列の形でボードを取り、[0,8]の整数としてムーブを出力します。このI / O戦略は非常に不格好なので、ここではよりインタラクティブにするラッパースクリプトを示します。単一のコマンドライン引数を取ります。プレーヤーが最初に移動する場合は1、プログラムが最初に移動する場合は0です。
import sys
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
board = [0,0,0,0,0,0,0,0,0]
rep = {0:"-",1:"X",2:"O"}
turn = int(sys.argv[1])
while True:
for i in range(3):
print rep[board[i*3]]+" "+rep[board[i*3+1]]+" "+rep[board[i*3+2]]
print
if turn:
move = int(raw_input("Enter Move [0-8]: "))
else:
move = f(board)
board[move] = turn+1
turn = (turn+1)%2
we can assume that all previous moves of the 2nd player were also played by our engine