python-3.x 这段代码是如何为井字游戏创建棋盘的?

pdtvr36n  于 2022-12-14  发布在  Python
关注(0)|答案(3)|浏览(159)

在我想不出如何自己制作一个井字游戏的棋盘之后,我从另一个程序员那里随机发现了一个已经完成的井字游戏程序。
她的做法是:

board = [' ' for _ in range(9)]

def print_board():
    for row in [board[i*3:(i+1)*3] for i in range(3)]:
        print('| ' + ' | '.join(row) + ' |')

print_board()

输出:

|   |   |   |

|   |   |   |

|   |   |   |

现在,我完全混淆了这里的代码这一部分:

board[i*3:(i+1)*3]

这部分代码的含义是什么?为什么在这种情况下使用它如此重要?
如果您想要了解程序的全部内容或自己尝试:https://github.com/kying18/tic-tac-toe/blob/master/game.py

kpbwa7wx

kpbwa7wx1#

请注意,这段代码比实际需要的要复杂得多。
一个等效但更简单的版本是

def print_board():
    for i in range(3):
        row = board[i*3:(i+1)*3]
        print('| ' + ' | '.join(row) + ' |')
vyswwuz2

vyswwuz22#

好吧,让我试着解释一下:
您有一个电路板要表示为2D对象(3x3)

a b c
d e f
g h i

但是,您将此电路板存储为1D列表

[a b c d e f g h i]
idx  0 1 2 3 4 5 6 7 8

idx表示每个元素的索引,所以如果你想一行一行地打印线路板,你需要先打印:

a b c  (which corresponds to indices 0,1,2)

那么

d e f  (which corresponds to indices 3,4,5)

最后

g h i  (which corresponds to indices 6,7,8)

正如您所看到的,起始索引将是0,3,6,最终索引将是3,6,9(因为Python切片从不包括最后一个索引,因此它必须比您实际希望包括的最后一个索引多1个单位)
因此我们可以创建一个迭代3次的循环(我们有3行),迭代变量的值为(0,1,2)
现在,我们必须将(0,1,2)转换为起始索引(0,3,6),即乘以3,这就是3*i的来源
我们必须将(0,1,2)转换为结束索引,也就是(i+1)*3
因此,给定循环迭代的切片必须是board[i*3:(i+1)*3,这就是代码中的切片
您可以将棋盘表示为列表的列表,并具有两个索引,而不是1D列表:一个用于行,一个用于列

board = [[a, b, c], 
         [d, e, f], 
         [g, h, i]]
nhhxz33t

nhhxz33t3#

Link to flawless code

工作委员会

def printboard(xState, oState):
    # Printing Board By using gameValues 's List
    zero = 'X' if xState[0] else ('O' if oState[0] else 0)
    one = 'X' if xState[1] else ('O' if oState[1] else 1)
    two = 'X' if xState[2] else ('O' if oState[2] else 2)
    three = 'X' if xState[3] else ('O' if oState[3] else 3)
    four = 'X' if xState[4] else ('O' if oState[4] else 4)
    five = 'X' if xState[5] else ('O' if oState[5] else 5)
    six = 'X' if xState[6] else ('O' if oState[6] else 6)
    seven = 'X' if xState[7] else ('O' if oState[7] else 7)
    eight = 'X' if xState[8] else ('O' if oState[8] else 8)
    print(f"{zero} | {one} | {two}")
    print(f"---------")
    print(f"{three} | {four} | {five}")
    print(f"---------")
    print(f"{six} | {seven} | {eight}")

如有任何疑问,请联系。

相关问题