2

ローグライク ゲームの表示をレンダリングする次のコードがあります。これには、マップのレンダリングが含まれます。

  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)

毎回エラーになります。画面からはみ出しているからだと思いますが、height と width の変数は self.main.getmaxyx() から来ているので、そうすべきではありませんよね?私は何が欠けていますか?Ubuntu 14.04 で実行されている Python 3.4.3 が問題になるはずです。

4

1 に答える 1

3

それは予想される動作です。Python は ncurses を使用します。これは、他の実装がこれを行うためです。

マニュアルaddchページ:

addch、 およびルーチンは、指定されたウィンドウの現在のウィンドウ位置に文字waddchを配置し、その後、ウィンドウを進めます。これらは 、stdio(3) の場合と類似しています。前払いが右マージンにある場合:mvaddchmvwaddchchputchar

  • カーソルは自動的に次の行の先頭に戻ります。

  • 現在のスクロール領域の下部で、 scrollok 有効になっている場合、スクロール領域は 1 行上にスクロールされます。

  • が有効でない場合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 に答える