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

2024-10-03 23:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找出所有可能的电路板布局。 然后将它们添加到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"

另外,如果我需要发布更多的数据,就说,我会把它们都放在github上。在

编辑: 我得到了使用itertools的提示。 是的,这是密码。 但是,虽然这段代码可以工作并生成字符串“oooxxx--”,但它并不能使它成为“ooxoxxx--”。 我一辈子都不明白为什么会这样。 这是一个分条的版本,应该可以产生所有的电路板。 有人能看出什么地方不对劲吗?在

^{pr2}$

Tags: truereturnifhtmlpagetemplatereplacerow
1条回答
网友
1楼 · 发布于 2024-10-03 23:29:16

让所有可能的全板你可以做

import itertools
player = ['O', 'X']
itertools.product(player, repeat = 9)

然后用列表理解法把每个都做成3x3的板

^{pr2}$

结果

[[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O')],
 [('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'X')],
 ... etc]

长期问题:

  1. 有可能(也很可能)游戏在棋盘完全填满之前就结束了
  2. 你不知道移动的顺序,所以如果有两个“赢家”,你就不知道谁先赢了
  3. 上面的方法是蛮力的,你会注意到不是所有的板都是有效的。井字游戏规则是每个玩家轮流。例如,所有“O”的电路板是不可能的。在

如上所述,你应该坐下来想一个更聪明的方法来做这件事。暴力强迫有很多问题,其中只有一部分被列出。你得考虑不完整的棋盘和移动的顺序。在

相关问题 更多 >