Python,383个字符
M=[21,1344,86016,4161,16644,66576,65793,4368]
X=lambda B,k:any(m*k==B&m*3for m in M)
def S(B):
if X(B,2):return 1,
M=[i for i in range(0,18,2)if B>>i&3<2]
return max((-S((B|3<<i)^87381)[0],i)for i in M)if M else(0,)
r='D'
c=ord(raw_input())&1
B=0
for i in range(9):
if i&1==c:m=S(B^c*87381)[1];print m/2;B|=3-c<<m
else:
B|=2+c<<input()*2
if X(B,2+c):r='XO'[c];break
print r
该板B被表示为使用每平方两个位,用一个整数00和01代表空的,10代表O和11表示X. M是一组位掩码的与01在丢失的三元组(的斑点21= 0b010101=顶行等) X,如果任何丢失单位计算k存在于板上的三元组。S会执行minimax搜索X的最佳移动,并返回一对得分(1 =胜利,-1 =失败,0 =平局)和平方指数。 ^87381(= ^0b010101010101010101)翻转X和O,同时保持空白正方形不变。
电脑永远不会丢失,所以我不需要包括这张支票:)。
可能存在一个更容易/更短的基于规则的算法,但这是可行的。