I have the following code rendering the display for my roguelike game. It includes rendering the map.
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)
It errors out every time. I think it's because it's going off the screen, but the height and width variables are coming from self.main.getmaxyx(), so it shouldn't do that, right? What am I missing? Python 3.4.3 running in Ubuntu 14.04 should that matter.
That's expected behavior. Python uses ncurses, which does this because other implementations do this.
In the manual page for addch
:
The
addch
,waddch
,mvaddch
andmvwaddch
routines put the characterch
into the given window at its current window position, which is then advanced. They are analogous toputchar
in stdio(3). If the advance is at the right margin:
The cursor automatically wraps to the beginning of the next line.
At the bottom of the current scrolling region, and if
scrollok
is enabled, the scrolling region is scrolled up one line.If
scrollok
is not enabled, writing a character at the lower right margin succeeds. However, an error is returned because it is not possible to wrap to a new line
Python's curses binding has scrollok
. To add characters without scrolling, you would call it with a "false" parameter, e.g.,
self.main.scrollok(0)
If you do not want to scroll, you can use a try/catch block, like this:
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)
来源:https://stackoverflow.com/questions/37648557/curses-error-add-wch-returned-an-error