打印井字游戏板?
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")
输出结果如下:
| |
_____|_____|_____
| |
| |
_____|_____|_____
| |
| |
| |
我正在 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")
输出结果如下:
| |
_____|_____|_____
| |
| |
_____|_____|_____
| |
| |
| |