2

我有以下代码为我的 roguelike 游戏渲染显示。它包括渲染地图。

  def render_all(self):
    for y in range(self.height):
      for x in range(self.width):
        wall = self.map.lookup(x,y).blocked
        if wall:
          self.main.addch(y, x, "#")
        else:
          self.main.addch(y, x, ".")
    for thing in self.things:
      draw_thing(thing)

每次都会出错。我认为这是因为它离开了屏幕,但是高度和宽度变量来自 self.main.getmaxyx(),所以它不应该那样做,对吧?我错过了什么?在 Ubuntu 14.04 中运行的 Python 3.4.3 应该很重要。

4

1 回答 1

3

这是预期的行为。Python 使用 ncurses,它这样做是因为其他实现这样做。

手册页addch

addch和 例程将字符放入给定窗口的当前窗口位置,然后waddch前进mvaddch。它们与 stdio(3) 中的类似。如果预付款在右边距:mvwaddchchputchar

  • 光标自动换行到下一行的开头。

  • 在当前滚动区域的底部,如果 scrollok 启用,则滚动区域向上滚动一行。

  • 如果scrollok未启用,则在右下边距写入字符成功。但是,由于无法换行而返回错误

Python 的 curses 绑定有scrollok. 要在不滚动的情况下添加字符,您可以使用“false”参数调用它,例如,

self.main.scrollok(0)

如果您不想滚动,可以使用 try/catch 块,如下所示:

import curses

def main(win):
  for y in range(curses.LINES):
    for x in range(curses.COLS):
      try:
        win.addch(y, x, ord('.'))
      except (curses.error):
        pass
      curses.napms(1)
      win.refresh()
  ch = win.getch()

curses.wrapper(main)
于 2016-06-06T08:54:16.400 回答