【问题标题】:How to Replace Connect Four Code with a For Loop如何用 For 循环替换 Connect Four 代码
【发布时间】:2021-01-23 18:37:14
【问题描述】:

我有一个 Connect Four 游戏,我用一堆打印功能制作了一块棋盘,效率极低。这里是:

    print("   0   1   2   3   4   5   6")
    print("   " + board[0][0] + " | " + board[0][1] + " | " + board[0][2] + " | " + board[0][3] + " | " + board[0][
        4] + " | " + board[0][5] + " | " + board[0][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[1][0] + " | " + board[1][1] + " | " + board[1][2] + " | " + board[1][3] + " | " + board[1][
        4] + " | " + board[1][5] + " | " + board[1][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[2][0] + " | " + board[2][1] + " | " + board[2][2] + " | " + board[2][3] + " | " + board[2][
        4] + " | " + board[2][5] + " | " + board[2][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[3][0] + " | " + board[3][1] + " | " + board[3][2] + " | " + board[3][3] + " | " + board[3][
        4] + " | " + board[3][5] + " | " + board[3][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[4][0] + " | " + board[4][1] + " | " + board[4][2] + " | " + board[4][3] + " | " + board[4][
        4] + " | " + board[4][5] + " | " + board[4][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[5][0] + " | " + board[5][1] + " | " + board[5][2] + " | " + board[5][3] + " | " + board[5][
        4] + " | " + board[5][5] + " | " + board[5][6])
    print("  ---+---+---+---+---+---+---")
    print("   " + board[6][0] + " | " + board[6][1] + " | " + board[6][2] + " | " + board[6][3] + " | " + board[6][
        4] + " | " + board[6][5] + " | " + board[6][6])
    print()

我想知道如何使用 for 循环替换我的电路板,以使代码看起来更整洁,更容易更改。如果您需要任何参考,这是我的其余代码。

https://paste.pythondiscord.com/buriritebe.md

谢谢!

【问题讨论】:

  • 既然您已经了解for 循环,您至少应该试一试,并用结果更新您的问题。
  • 如果您的代码正在运行并且您正在寻求改进它的建议,那么它可能更适合codereview.stackexchange.com

标签: python


【解决方案1】:

当您尝试将代码滚动到循环中时,请寻找您在哪里重复自己。例如,看起来每行打印都是相同的,但 x 坐标不同。那是你的外循环。在每一行中,每个单元格都是相同的,具有不同的 y 坐标。那是你的内循环。循环也可以是推导的形式。此外, string.join() 方法是您的朋友,因为单元格之间和行之间的分隔符总是相同的。 Python 程序员喜欢单行解决方案。我确信有一种更严格的方法来编写它,但是你要小心不要把事情卷得太紧,因为这会让你以后更改代码变得更加困难。这是您可以收紧它的一种方法:

def generate_line(x, board):
    return "   " + " | ".join(board[x][y] for y in range(7)) + "\n"
board = [['x','o','x','o','x','o','x'] for x in range(7)]
border = "  ---+---+---+---+---+---+---\n"
lines = [generate_line(x, board) for x in range(7)]
print(border.join(lines))

【讨论】:

  • 简洁明了的很好的平衡,并使用清晰的函数/变量名称使意图更易于阅读。一个小建议:lines = (generate_line(x, board) for x in range(7))(用括号代替括号)使它成为generator expression 而不是列表理解。这在这里不太重要,但在可能的情况下养成一个好习惯,因为它在处理更长的数据时会更有效率。
  • 可能是这样,但是当您想使用join 时,使用列表推导式比生成器表达式更快。参见例如stackoverflow.com/a/32462254/550094
  • 哇!我的印象恰恰相反。这是一个很棒的发现。 This question 的回答也很丰富。
【解决方案2】:

这应该可以解决问题:

print("   0   1   2   3   4   5   6")
for row in range(7):
    print("   " + board[row][0] + " | " + board[row][1] + " | " + board[row][2] + " | " + board[row][3] + " | " + board[row][4] + " | " + board[row][5] + " | " + board[row][6])
    if row != 6:
        print("  ---+---+---+---+---+---+---")
print()

如果你想删除长字

print("   0   1   2   3   4   5   6")
for row in range(7):
    line = "  "
    for col in range(7):
        line += (" " + board[row][col] + " |")
    print(line[:-1])
    if row != 6:
        print("  ---+---+---+---+---+---+---")
print()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2019-04-04
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多