- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在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/
所以我有一个用 ncurses 制作的基本“贪吃蛇”游戏。 添加时 start_color(); init_color(COLOR_BLUE, 0, 0, 0); init_pair(
我想处理来自 stdin 的管道/终端,但同时,我希望我的其他操作继续处理,例如 上/下菜单 . fgets完成处理管道和屏幕渲染,但是,wgetch变得没有反应,所以我不能在开关内做任何事情。要关闭
我想在不清除屏幕的情况下在 Python 下使用 Curses。原因是我希望我的应用程序在现有屏幕上弹出一个简单的小菜单并很快退出。在退出时将弹出菜单的丑陋部分留在屏幕上是可以接受的,尽管不是首选。这
我已经开始用Python语言编写控制台了。太神奇了。但是,我尝试使用 curses 创建输入框,如下所示。我一直坚持如何放置输入行并在控制台的输入位置上写入输入。这部分你能帮我吗?我忘了问_是否可以使
我正在尝试创建这个程序,我在 stdscr 上并排打印两个窗口。我创建了“菜单”类来在一个地方声明整个屏幕的所有内容,我在 main 中创建了一个“菜单”对象(“menu_principal”),但没
大家好,我正在 Unix 中用 C 语言做作业,任务是制作一个简单的乒乓球游戏。我现在已经开始玩游戏了,除了有一个烦人的部分, Racket 正后方不断有一个闪烁的光标。我该如何关闭它? 这是截图。
我正在尝试创建一个交互式命令行程序,似乎 Mono-Curses是我需要的。但我对如何使用它感到非常困惑。我有一些问题。我真正需要什么来创建我的项目?我需要单声道还是可以使用 .net 框架?为什么那
我正在尝试学习 Windows XP 上的 Python 诅咒。我可以让 window.getkey 命令正常工作,但命令 window.getstr 不仅失败而且程序退出。以下是示例代码行: x =
#include #include #include #include #include "color.h" #include using namespace std; using name
我正在编写一个关于 pythoncurses 的程序,我想知道是否有一种方法可以阻止终端大小调整,以防止curses 在 Linux 和 Windows 上崩溃。这就是发生的事情..我可以阻止这种情况
我正在编写一个 python curses 游戏 ( https://github.com/pankshok/xoinvader )。我发现了一个问题:在终端模拟器中它工作正常,但在 tty 屏幕闪烁
当我将某些表情符号(特别是标志)输出到 Curses 的子窗口中时,它会使输出变形,即使是在该子窗口之外的输出也是如此。 运行: import curses def draw_screen(stdsc
快速退出带有使用curses模块的无限循环的Python程序的最佳方法是什么? 我尝试在循环末尾添加 nodelay() 方法: if screen.getch() == ord('q'):
我在 ncurses 中有一个菜单系统。选择其中一个选项会将您带到另一个菜单。但我该如何返回? import curses def Main(): x = 0 while x!= ord(
这段代码运行了 100 万次迭代(在我的机器上大约几秒钟),但是当我按住一个按钮时,我按住的 # 迭代并没有显着增加。 import curses stdscr = curses.initscr()
我在 Python 中编写了一个比一次性使用多一点的监控脚本,它使用 ncurses 和颜色来显示一些经常更新但几乎没有人感兴趣的值。为了提醒我注意重大变化,我进行了一些设置,以便当这些值进入有趣的领
我正在使用 ncurses 并使用 getstr() 获取输入字符串。我想通过 Tab 击键进行类似自动完成的操作。但是,我看不到使用 getstr() 捕获 Tab 的方法。我试过这个: char
Windows 是否有等同于 PHP 的 ncurses? 我已经创建了一个 CLI 脚本,并希望以一种很好的方式显示各种统计信息(当前处理的记录、完成百分比等),而不是将负载和文本堆输出到 cmd.
我很难尝试获得带有 ruby 和诅咒的纯白色(背景)和黑色(前景)文本。 用这段代码 Curses.init_pair(1,COLOR_BLACK,COLOR_WHITE) Curses.attron
我正在尝试 Curses.getchr,但是没有捕获像 Ctrl+s 这样的键,是否有任何库可以让我捕获它们,最重要的是直观/可读性好 FooBar.bind('Ctrl+s'){ raise "do
我是一名优秀的程序员,十分优秀!