打印井字游戏板?

Printing Tic Tac Toe game board?

我正在 python 中制作一个井字游戏,我的所有实际游戏功能都可以正常工作,但我无法正确打印游戏板。

game = [[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]
for row in game:
  print('   |'*(len(game)-1)+'   ')
  for space in row:
    print(' '+space+' |',end='')
  print('\n'+'   |'*(len(game)-1)+'   ')
  if game.index(row) < len(game)-1:
    print('----'+('----'*(len(game)-2))+'---')

出于某种原因,除非每一行都有一个移动,否则行索引不会增加。当游戏开始为空时,输出为:

   |   |   
   |   |   |
   |   |   
-----------
   |   |   
   |   |   |
   |   |   
-----------
   |   |   
   |   |   |
   |   |   
----------- 

底部不应该有一条线,但当每一行都有一个移动时它就会消失。我还试图去掉右侧每个 space 中间的“|”。任何提示或建议将不胜感激!

问题似乎是您使用的是索引方法而不是枚举之类的方法。 index returns 给定元素在列表中的位置,而 enumerate 可用于执行更多您想要的操作(参见 Accessing the index in 'for' loops?)。当您使用 index(row) 时,您要求的是出现给定行的最低索引值。在空白板上,它总是返回 0。

解决此问题的另一种方法是为行设置一个计数器(如下例所示)。

至于字符行上的额外行,您可以通过不同方式打印行内容来解决这个问题,如下例所示。

cur = [[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]

# initialize a row counter
rownumb = 0

for row in cur:
    print(cur.index(row))

    # increment the row counter
    rownumb += 1
    print('   |'*(len(cur)-1)+'   ')

    # a different approach to printing the contents of each row
    print(' ' + row[0] + ' | ' + row[1] + ' | ' + row[2])

    print('   |'*(len(cur)-1)+'   ')

    # check the counter and don't print the line after the final row
    if rownumb < 3:
        print('----'+('----'*(len(cur)-2))+'---')

我认为你应该按照我之前的建议进行字符串格式化。

虽然我的解决方案与您的代码有很大不同,但这里有一个函数可以打印(创建字符串,然后打印该字符串)一个通用板,其中的方块由 | 分隔,每行由 -myboard 中的每个元素将被放置在 tile_width space.

的中间
def print_board(myboard, tile_width=3):
    msg = ""
    for i, row in enumerate(myboard):
        # Print row
        element = row[0]  # first element does not need leading |
        element_str = '{:^{width}}'.format(element, width=tile_width)
        msg = msg + element_str

        for element in row[1:]:
            element_str = '|{:^{width}}'.format(element, width=tile_width)  # elements with leading |
            msg = msg + element_str

        msg = msg + '\n'

        # Print row divider if its not the last row
        if i is not len(myboard) - 1:
            element_str = '{:-^{width}}'.format("", width=((tile_width + 1) * len(row) - 1))  # '*' as fill char
            msg = msg + element_str
            msg = msg + '\n'
    print(msg)


cur = [['x', ' ', 'x'], [' ', 'o', ' '], ['o', '', ' ']]
print_board(cur)

这输出这个。

 x |   | x 
-----------
   | o |   
-----------
 o |   |   

尽管我的解决方案与您的不同。但我有一个建议。为什么不简单地使用字符串格式打印电路板,而不是使用如下嵌套循环:

values=[' ' for x in range(9)]
print("\n")
print("\t     |     |")
print("\t  {}  |  {}  |  {}".format(values[0], values[1], values[2]))
print('\t_____|_____|_____')

print("\t     |     |")
print("\t  {}  |  {}  |  {}".format(values[3], values[4], values[5]))
print('\t_____|_____|_____')

print("\t     |     |")

print("\t  {}  |  {}  |  {}".format(values[6], values[7], values[8]))
print("\t     |     |")
print("\n")

输出结果如下:

     |     |   
_____|_____|_____
     |     |
     |     |   
_____|_____|_____
     |     |
     |     |   
     |     |