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

时间:2014-09-19 12:13:33

标签: python html loops recursion tic-tac-toe

我试图弄清楚井字游戏的所有可能的电路板布局。 然后将它们添加到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"

1 个答案:

答案 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]

常备问题:

  1. 在棋盘完全填满之前,游戏可能会(并且可能)结束
  2. 你不知道这些动作的顺序,所以如果有两个“获胜者”你不知道谁先赢了
  3. 上述方法是暴力破解,您会注意到并非所有主板都有效。 tic-tac-toe的规则说每个玩家轮流。因此,所有“O”的电路板都是不可能的。
  4. 如上所述,你应该坐下来试着想出一个更聪明的方法来做到这一点。暴力破解有许多问题,其中只列出了一些问题。你必须考虑不完整的董事会和行动的顺序。