我试图弄清楚井字游戏的所有可能的电路板布局。 然后将它们添加到html模板中。 我的代码位于底部。 我使用递归,迭代两种方式制作了大约五个不同的版本。 但他们都因某种原因失败了。 无论是堆栈溢出,跳过布局,还是神秘地崩溃都没有按预期运行。 如果有人知道,请告诉我我做错了什么。 大约几个小时后,我准备放弃了。
如果有人想知道为什么我做这么奇怪的事情,我需要用html和css来制作井字游戏。这是我能想到的唯一方式。 谢谢,谢谢,谢谢。
import itertools
import sys
sys.setrecursionlimit(10000)
templateFile = open('template.html','r')
template = templateFile.read()
templateFile.close()
def hasWon(row):
for player in ['x','o']:
if (row[0] == player) & (row[1] == player) & (row[2] == player):
return [True,player]
if (row[3] == player) & (row[4] == player) & (row[5] == player):
return [True,player]
if (row[6] == player) & (row[7] == player) & (row[8] == player):
return [True,player]
if (row[0] == player) & (row[3] == player) & (row[6] == player):
return [True,player]
if (row[1] == player) & (row[4] == player) & (row[7] == player):
return [True,player]
if (row[2] == player) & (row[5] == player) & (row[8] == player):
return [True,player]
return [False,player]
def getTurn(turnN):
if turnN % 2 == 0:
return 'o'
else:
return 'x'
def doPages(row, turnN):
global template
curpage = template
print "row:" + ''.join(row)
for i in range(1,10):
tempRow = row
if row[i-1] == '-': #Cell is empty
tempRow[i-1] = getTurn(turnN)
print "tr: %s, turnN %d, i: %d" % (''.join(tempRow),turnN,i)
curpage = curpage.replace('(page'+str(i)+')', ''.join(tempRow)+'.html')
#doPages(tempRow, turnN+1)
if row[i-1] == 'x': #Cell is full. Invalid
curpage = curpage.replace('(page'+str(i)+')', '')
curpage = curpage.replace('(style'+str(i)+')', 'background-color:red;')
if row[i-1] == 'o': #Cell is full. Invalid
curpage = curpage.replace('(page'+str(i)+')', '')
curpage = curpage.replace('(style'+str(i)+')', 'background-color:blue;')
doPages(tempRow, turnN+1)
curpage = curpage.replace('(turn)', 'Turn: %d (%s)' % (turnN, getTurn(turnN)))
if hasWon(row)[0]:
curpage = curpage.replace('<!--won-->', '<h1>%s has won</h1>' % hasWon(row)[1])
page = open('game/'+''.join(row)+'.html','w+')
page.write(curpage)
page.close()
return
doPages(list(['-'] * 9),0)
print "Done"
P.S。如果我需要发布更多数据,我会把它全部放在github上。
编辑: 我得到了使用itertools的提示。 我做了,这是代码。 但是这段代码工作并生成字符串为&#34; oo-oxxx - &#34;它没有制作这个&#34; ooxoxxx - &#34;。 我不能为我的生活找出它为什么这样做。 这是一个应该生产所有电路板的条纹版本。 任何人都可以看到有什么问题吗?
import itertools
def getTurn(turnN):
if turnN % 2 == 0:
return 'o'
else:
return 'x'
def hasValidAmount(row, turnNum):
#aantal moet samen turn - 1 zijn
#als turn even x is 1/2 turn en is o x -1
#als turn oneven x en o is 1/2 turn -1 en
x = row.count('x')
o = row.count('o')
if (turnNum % 2) == 0:
if ((x / 2) == turnNum) & (o == (x - 1)):
return True
else:
return False
else:
if (x == (turnNum-1) / 2) & (o == x):
return True
else:
return False
def hasWon(row):
for player in ['x','o']:
if (row[0] == player) & (row[1] == player) & (row[2] == player):
return [True,player]
if (row[3] == player) & (row[4] == player) & (row[5] == player):
return [True,player]
if (row[6] == player) & (row[7] == player) & (row[8] == player):
return [True,player]
if (row[0] == player) & (row[3] == player) & (row[6] == player):
return [True,player]
if (row[1] == player) & (row[4] == player) & (row[7] == player):
return [True,player]
if (row[2] == player) & (row[5] == player) & (row[8] == player):
return [True,player]
return [False,player]
def work():
for i in itertools.product('-xo',repeat=9):
row = list(i)
turnNum = 10 - row.count('-')
turn = getTurn(turnNum)
if hasValidAmount(row, turnNum) == False:
continue
print ''.join(row)
winner = '-'
if hasWon(row)[0]:
print '%s has won.' % hasWon(row)[1]
for pageI in range(1,10):
if row[pageI-1] == '-':
tempRowList = list(i)
tempRowList[pageI-1] = turn
print ''.join(tempRowList)
work()
print "Done"
答案 0 :(得分:1)
制作所有可能的完整电路板
import itertools
player = ['O', 'X']
itertools.product(player, repeat = 9)
然后使用列表推导将每个形状整形为3x3板
[[i[0:3],i[3:6],i[6:10]] for i in itertools.product(player, repeat = 9)]
结果
[[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O')],
[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'X')],
... etc]
常备问题:
如上所述,你应该坐下来试着想出一个更聪明的方法来做到这一点。暴力破解有许多问题,其中只列出了一些问题。你必须考虑不完整的董事会和行动的顺序。