gpt4 book ai didi

Python 诅咒 : addstr() from file prints blanks for the remainder of the line

转载 作者:行者123 更新时间:2023-12-01 05:28:26 29 4
gpt4 key购买 nike

我正在Python中使用curses编写一个非常简单的农业游戏。此时,我已经成功地允许玩家(只是一个“@”字符)在窗口内移动。

我有一些带有 ascii-art 的文件,我将它们打印到窗口,作为填充玩家可以在其中移动的世界的东西。例如,我有一个名为“house”的文件,其中包含:

 _ . ^ . _
/____.____\
| |
| ## _ ## |
|_""_H_""_|

我有一个 Thing 类,如下:

class Thing(object):    

def __init__(self, Xstart, Ystart, looksLike, list, window):
self.Xstart = Xstart
self.Ystart = Ystart
self.X = Xstart
self.Y = Ystart

self.looksLike = looksLike

self.boundries = []
self.find_boundries()

list.append(self)

self.draw(window)


def find_boundries(self):

file = open(self.looksLike).readlines()
for line in file:
for char in line:
if char == '\n':
pass
elif char == ' ': # skip all whitespace
self.X += 1
else:
self.boundries.append([self.X, self.Y])
self.X += 1

self.Y += 1
self.X = self.Xstart

self.X = self.Xstart # reset x & y to starting coordinates
self.Y = self.Ystart


def draw(self, window):

#file = open(self.looksLike).readlines()

#for line in file:
# window.addstr(self.Y, self.X, line)
# self.Y += 1

#self.Y = self.Ystart

file = open(self.looksLike).read()

for char in file:
window.addch(self.Y, self.X, char)
if char == '\n':
self.Y += 1
self.X = self.Xstart
else:
self.X += 1

self.X = self.Xstart
self.Y = self.Ystart

因此,我的 Thing 类的构造函数采用文件名作为参数(looksLike),并且绘制方法打开文件,读取它,并将其内容打印到窗口。然后,我可以创建一个 house 对象,将我的“house”文件作为参数传递,然后我的 ascii house 将被打印到窗口。

问题是,一旦将对象打印到窗口,当我将播放器移动到打印对象的右侧时,播放器就会消失。然而,在打印对象的上方、下方和左侧,玩家仍然在视野中。例如,

 _ . ^ . _
/____.____\
| |
| ## _ ## |
|_""_H_""_|
@

在此位置,“@”字符可见,但如果我向上移动一个空格,它就会消失。如果我继续向上移动玩家,“@”将在它超出房子最上面的字符后重新出现。

我认为这个问题是由于 addstr() 和 addch() (我都尝试过)打印空白直到窗口末尾的性质造成的,但我一直找不到任何关于此的文档。

我考虑过为每个打印的对象创建一个新窗口,但是当多个对象打印到窗口时,这似乎会变得相当麻烦。另外,我希望定义打印到屏幕上的对象周围的边框,这些对象的形状不仅仅是正方形或矩形。

是否有办法从文件打印到窗口而无需尾随空格,并且无需为每个打印对象创建新窗口?

最佳答案

I assume this issue is due to the nature of both addstr() and addch() ( I have tried both) printing whitespace until the end of the window,

你为什么这么认为?

首先,您在向我们展示的代码中从未真正调用过 addstr,所以不可能是这样。

至于addch,它绝对不应该这样做——正如您可以通过从右向左绘制等方式看到的那样。或者通过运行这个简单的测试代码:

# usual curses setup
stdscr.addch(10, 10, 'a')
stdscr.addch(10, 9, 'b')

如果您在该测试程序中没有看到 a,则您的终端有问题。但如果你是,那么你的假设是错误的,它与 addch 无关。

<小时/>

几乎可以肯定,问题在于您的内部文件中实际上有空格。在诅咒中,如果您在另一个角色之上绘制一个角色,它会替换旧角色,它不会尝试合并它们或覆盖它们或类似的东西。 (这很好,因为大多数控制台没有任何方法来做这样的事情......)

如果新字符是空格,则仅用空格替换旧字符。正如您所看到的那样。

<小时/>

所以,解决方法是删除每行末尾的所有空格,对吧?嗯,你可以这么做。或者您可以只使用 rstrip() 每行。 (您不需要 \n;您可以通过完成整行的迭代来判断您已到达行尾,对吧?好吧,您可以在您的 file = open(…).readlines() 代码中,或者在不涉及 readlines() 且仅循环文件本身的代码中;你不能在不同的 file = open(…).read() 代码中这样做,但我不知道为什么你首先要这样做。)

或者,由于您的 find_boundries 函数非常小心地跳过空格,也许您想在 draw 中执行相同的操作,但只是忘记了?如果是这样,只需编写您想要跳过空格的代码即可。

但是整个问题有一个更简单的解决方案:只需在房子后面而不是前面绘制@,这从一开始就不是问题。当然,这意味着如果玩家与房子在同一个地方,他会出现在房子的“外面”,而不是隐藏在“里面”——但你似乎已经有代码来防止这种情况发生,所以如果发生的话,它看起来像谁并不重要。

关于Python 诅咒 : addstr() from file prints blanks for the remainder of the line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20864620/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com