我正在尝试用Python创建一个ASCII级别的编辑器,但我遇到了一个问题。在我的renderer
函数中有一个for循环,在该级别的行上打印之后,应该打印一个换行符。但是,它似乎不起作用。它是newLine
函数吗?
import os
class LevelEditor:
def __init__(self, level = [], currentLine = 0, line = ""):
self.level = level
self.currentLine = currentLine
self.line = line
def renderer(self):
for i in range(len(self.level)):
for j in range(len(self.level[i])):
print(self.level[i][j], end="")
print()
def clearScreen(self):
if os.name == "posix":
os.system("clear")
elif os.name == "nt":
os.system("cls")
else:
print("OS not recognized")
print()
def newLine(self):
self.line = input("\n")
self.level += [[]]
# add line to level
for i in range(len(self.line)):
self.level[self.currentLine] += self.line[i]
def loop(self):
while(True):
self.clearScreen()
self.renderer()
self.newLine()
Editor = LevelEditor()
Editor.loop()
答案 0 :(得分:3)
尝试打印self.level
中的内容。如果您输入了行123
,456
,789
,那么您想要的就是这样:
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
......但你拥有的是:
[['1', '2', '3', '4', '5', '6', '7', '8', '9'], [], []]
为什么呢?因为你用它添加它们:
self.level[self.currentLine] += self.line[i]
...而且你永远不会在任何地方增加self.currentLine
。您可能希望将此行添加到newLine
的末尾:
self.currentLine += 1
但是,构建新行并添加它可能更简单,甚至不需要使用currentLine
变量。而且,就此而言,您不需要line
属性;那只是一个局部变量。另外,您不需要循环将字符串逐个转换为字符列表。所以,您可以用以下内容替换整个内容:
line = input('\n')
self.level += list(line)
作为旁注,您可能不希望将[]
用作self.level
的默认值。如果您这样做,并使用默认参数创建两个单独的LevelEditor
实例,它们将最终共享相同的列表。要解决这个问题,请执行以下操作:
def __init__(self, level=[]):
self.level = list(level)
...或者,如果您想允许明确共享列表,但不是偶然的:
def __init__(self, level=None):
self.level = [] if level is None else level
......或者,是否真的有理由允许传入一个值?如果不是:
def __init__(self):
self.level = []