目标:将空的ASCII网格转换为井字棋盘。 空的时候应该看这个:
| |
| |
____|________|____
| |
| |
____|________|____
| |
| |
| |
错误:
def myformat(moves, line):
# there's got to be a better way to do this
if line in [1, 4, 7]:
if moves[line] == 'x':
return "\ /"
elif moves[line] == 'o':
return " oo "
elif moves[line] == 'none':
return " "
elif line in [2, 5, 8]:
if moves[line] == x:
return " xx "
elif moves[line] == o:
return "o o"
elif moves[line] == "none":
return " "
elif line in [3, 6]:
if moves[line] == x:
return "/__\b"
elif moves[line] == o:
return "o__o"
elif moves[line] == "none":
return "____"
elif line == 9:
if moves[line] == x:
return "/__\b"
elif moves[line] == o:
return "o__o"
elif moves[line] == "none":
return " "
else:
print("Fatal error.")
>>> moves = ['none']*9
>>> moves
['none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none']
>>> for line in range(1, 10):
print("{}|{}|{}".format((myformat(moves, line))))
Traceback (most recent call last):
File "<pyshell#24>", line 2, in <module>
print("{}|{}|{}".format((myformat(moves, line))))
IndexError: tuple index out of range
full code因为人们上次生气我只发布了部分
我不明白它为什么提到元组。我看到的唯一一个是范围(1,10)函数,因为它是for循环,所以不应该是索引错误。所有评论和批评都表示赞赏。提前谢谢。
答案 0 :(得分:0)
在你的例子中,line = 1 myformat()会返回一个包含5个空格的字符串..
让我们试试
>>> ret_val = ' '
>>> '{} | {} | {}'.format(ret_val)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
@ Jean-FrançoisFabre,已经解释过格式需要3个值 由于只有1个值字符串格式无法找到缺失值 你需要通过providong指数告诉格式它应该放在哪里。
>>> ret_val = ' '
>>> '{0} | {0} | {0}'.format(ret_val)
' | | '
答案 1 :(得分:0)
您的代码存在三个问题。
首先,您的调用代码需要获得三个值,但您只需从函数中返回一个值。
第二个问题是,在函数中,您使用来自调用代码中的moves
的值索引range(1, 10)
。由于排除了stop
range
参数,因此最大值为9
。这是moves
(有九个值)的界限。 Python从零开始索引,因此您可能需要range(0, 9)
或仅range(9)
(或者您需要在获取每个索引之前从值中减去一个)。
第三个问题是,您似乎在函数中将line
用于两个不同的目的。您正在使用它来索引电路板上的方块阵列(通过moves
列表)。而且您还使用它来对输出中的水平文本行进行编号。那些不是一回事,所以如果你继续交替使用它们,你会得到奇怪的结果。
我不确定计算所需值的最佳方法是什么。如果您坚持迭代输出的行并希望函数返回三个值(对于行交叉的三个方格),则需要从line
传入range(9)
值并且然后使用line // 3
加上来自range(3)
的值(将指向三个不同的方格)进行索引。