如何在python中找到所有可能的tic-tac趾板布局?

如何在python中找到所有可能的tic-tac趾板布局?,python,html,loops,recursion,tic-tac-toe,Python,Html,Loops,Recursion,Tic Tac Toe,我正试图找出所有可能的tic-tac-toe板布局。 然后将它们添加到html模板中。 我的代码在底部。 我使用递归和迭代两种方法制作了大约五个不同的版本。 但它们都因某种原因而失败。 无论是堆栈溢出、跳过布局还是神秘地崩溃,它们都没有按预期运行。 如果有人知道,请告诉我我做错了什么。 大约过了几个小时,我就准备放弃了 如果有人想知道我为什么要做这么奇怪的事情,我需要用html和css来制作tic-tac-toe。这是我唯一能想到的方法。 谢谢,谢谢,谢谢 import itertools im

我正试图找出所有可能的tic-tac-toe板布局。 然后将它们添加到html模板中。 我的代码在底部。 我使用递归和迭代两种方法制作了大约五个不同的版本。 但它们都因某种原因而失败。 无论是堆栈溢出、跳过布局还是神秘地崩溃,它们都没有按预期运行。 如果有人知道,请告诉我我做错了什么。 大约过了几个小时,我就准备放弃了

如果有人想知道我为什么要做这么奇怪的事情,我需要用html和css来制作tic-tac-toe。这是我唯一能想到的方法。 谢谢,谢谢,谢谢

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"

使所有可能的全板,你可以做

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]
常设问题:

  • 有可能(也有可能)在棋盘完全填满之前游戏就结束了
  • 你不知道这些动作的顺序,所以如果有两个“赢家”,你就不知道谁先赢了
  • 上面的方法是蛮力,你会注意到并非所有的板都是有效的。tic tac toe规则规定每个玩家轮流玩。因此,举例来说,带有所有“O”的电路板是不可能的

  • 如上所述,你应该坐下来想一个更聪明的方法来做这件事。暴力强迫有很多问题,只列出了其中的一些。你必须考虑到未完成的棋盘和移动顺序。

    恐怕我不理解你问题的大部分HTML部分。但是,如果您只是想找到一种方法来获取所有可能包含x、o或连字符的长度为9的列表,那么您可以执行
    allPossibleBoards=list(itertools.product(“xo-”,repeat=9))
    您正在尝试这样做吗?我认为这个问题的含义是,除了生成所有板,还需要以这样一种方式来完成,即您可以将每个状态与其所有可能的子状态关联起来,这样您就可以创建一种“选择您自己的冒险”目录结构。因此,仅仅按排序顺序生成所有板状态是不够的。
    [[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O')],
     [('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'X')],
     ... etc]