递归地用Python生成每个井字游戏

时间:2018-11-22 20:23:21

标签: python arrays recursion

我正在一个项目中,我会生成所有可能的井字游戏数组。作为概念证明,我正在研究用9个子数组填充数组的代码。每个子数组都有两个值,第一个为0或1(分别用于x和o),第二个为1到9(表示放置时间)。 我想了解的数组示例如下:

[[0, 0], [1, 1], [0, 2], [1, 3], [0, 4], [1, 5], [0, 6], [1, 7], [0, 8]]

我已经使用9个for循环编写了代码,每个循环嵌套在上面的循环中,这给了我想要的结果(每个可能的数组,每个循环都是唯一的)。但是我试图使用递归编写代码,并避免编写大量嵌套循环。

当我运行下面的代码时,它只能生成上面的数组,而不能创建其他组合。我的代码如下:

print("running...")

allGames = []
checkCurrentGame = [5, 5, 5, 5, 5, 5, 5, 5, 5]
stepsDown = 0

def cleanGame(move, currentGame):
    for j in range(9):
        if (currentGame[j][1] >= move):
            currentGame[j] = [5, 0]

def completeMove(moveNumber, currentGame):
    global stepsDown
    stepsDown = stepsDown + 1
    for i in range(9):
        cleanGame(moveNumber, currentGame)
        if (currentGame[i][0] == 5):
            currentGame[i][0] = i % 2
            currentGame[i][1] = moveNumber
            allGames.append(currentGame)
            break
    if (stepsDown < 9):
        generateGame(currentGame)

def generateGame(currentGame):
    for i in range(9):
        completeMove(i, currentGame)

generateGame([[5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0], [5, 0]])

for x in range(len(allGames)):
    print(allGames[x])

3 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,则应该这样做,但这不是递归-

import itertools
[zip(p, range(0, 9)) for p in itertools.product([0, 1], repeat=9)]

代码首先生成一个木板(9个0或1个)-

itertools.product([0, 1], repeat=9)

,然后向其中添加索引数据。

我建议您看看itertools

答案 1 :(得分:0)

我建议您在YouTube上观看this video。教授对递归非常好教。我认为它将为您带来更多好处,然后获得有效的代码。他以数独为例,但两个游戏都是2D阵列。

如果您观看了视频,您将知道如何修改此示例以更好地满足您的需求。 伪代码:

def place(who, when, where, table):
    if (None, None) not in table: # the table is full
        print(table)
        return

    if table[where] not (None, None): # this cell is already marked
        return

    table[where] (who, when) # can place our mark on the cell
    # make the recursive calls
    for i in range(9):
        place(who.opponent, when+1, i, table)

for cell in range(9):
    empty = [(None, None) for _ in range(9)]
    place(firstplayer, 0, cell, empty)

答案 2 :(得分:0)

这很有趣。这是一种玩游戏的方法,它会分出每一个可能的动作(或无论如何,这都是本意)。

尽管我通常倾向于合并并返回纯结果,以允许及早退出和检查,但此递归累积在全局变量中。

"""
rs[2002]

=> ([[0, 0], [1, 1], [-1, -1],
   [-1, -1], [1, 5], [0, 2],
     [0, 4], [1, 3], [-1, -1]], 97, 146)

x--
---
---

xo-
---
---

xo-
--x
---

xo-
--x
-o-

xo-
--x
xo-

xo-
-ox
xo-
"""

输出:

table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median)

def fage(x):
    return table.loc[x['Self_Employed'],x['Education']]

#Replacing missing values

df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage,axis=1),inplace =True)