Python中的魔术方块

时间:2018-11-18 22:36:39

标签: python while-loop magic-square

我是编码新手。我正在尝试编写一个魔术方块。魔术正方形是一个正方形(对于我的情况为3×3,可能会有所不同),其中所有行,列和对角线的总和必须为一定的数字(对我而言,为15×,因为3×3)。这是我的代码:

s = []
while len(s) < 9:
    n = 0
    a = random.randrange(1, 10)
    while a not in s:
        s.append(a)


while s[0] + s[1] + s[2] != 15 and s[3] + s[4] + s[5] != 15 and \
        s[6] + s[7] + s[8] != 15 and s[0] + s[4] + s[8] != 15 \
        and s[2] + s[4] + s[6] != 15 and s[0] + s[3] + s[6] != 15 and \
        s[1] + s[4] + s[7] != 15 and s[2] + s[5] + s[8] != 15:
    shuffle(s)
print(s)

我不明白为什么在while循环中满足所有条件之前,程序不会改组。我知道这不是编写此程序的方法,即使它可以工作,也将是随机性和强制执行解决方案,我只是想了解while循环内发生了什么。

2 个答案:

答案 0 :(得分:3)

我认为您写错了循环条件。当前,它要求行,列或对角线的总和等于正确的值。如果它们中的任何一个都执行,则退出,因为链接的and的值是False

相反,我认为您想使用or运算符而不是and运算符。这样,只要条件任何为真(表示任何行未正确加总),您就将继续循环。

或者,您可以保留and运算符,但将!=运算符更改为==并在最后取整(因为not X or not Y在逻辑上是等效的到not (X and Y)):

while not (s[0] + s[1] + s[2] == 15 and s[3] + s[4] + s[5] == 15 and 
           s[6] + s[7] + s[8] == 15 and s[0] + s[4] + s[8] == 15 and
           s[2] + s[4] + s[6] == 15 and s[0] + s[3] + s[6] == 15 and
           s[1] + s[4] + s[7] == 15 and s[2] + s[5] + s[8] == 15):

答案 1 :(得分:0)

我认为您的意思是将“ and”替换为“ or”。该程序将在满足第一个条件后立即终止,因为从逻辑上讲,必须满足所有这些条件才能继续执行。另外,虽然不是绝对必要的,但我通常发现围绕单个逻辑条件的括号会有所帮助。

s = []
while len(s) < 9:
    n = 0
    a = random.randrange(1, 10)
    while a not in s:
        s.append(a)


while (s[0] + s[1] + s[2] != 15) or (s[3] + s[4] + s[5] != 15) or \
    (s[6] + s[7] + s[8] != 15) or (s[0] + s[4] + s[8] != 15) \
    or (s[2] + s[4] + s[6] != 15) or (s[0] + s[3] + s[6] != 15) or \
    (s[1] + s[4] + s[7] != 15) or (s[2] + s[5] + s[8] != 15):
    shuffle(s)
print(s)