curses インターフェイス (これまで使用したことがありませんでした) に慣れたかったので、先週末、ちょっとしたスネークゲームを書きました。1 行のステータス WINDOW *
があり、残りの画面はフィールド WINDOW *
です。ゲーム ロジックは、必要な場合にのみ、中央の描画関数を呼び出してアイテムを配置します。
/* note: CP_* are just enum values to give my own color pairs names */
void
screen_putItem(Screen *self, int y, int x, Item item, int refresh)
{
switch (item)
{
case EMPTY:
mvwaddch(self->field, y, x, ' '|COLOR_PAIR(CP_WHITE));
break;
case HEAD:
#ifdef WIN32
/* 'smiley' character for windows console */
mvwaddch(self->field, y, x,
1|COLOR_PAIR(CP_YELLOW)|A_BOLD|A_ALTCHARSET);
#else
mvwaddch(self->field, y, x, '@'|COLOR_PAIR(CP_YELLOW)|A_BOLD);
#endif
break;
case TAIL:
mvwaddch(self->field, y, x, ACS_CKBOARD|COLOR_PAIR(CP_YELLOW));
break;
case FOOD:
mvwaddch(self->field, y, x, '#'|COLOR_PAIR(CP_GREEN)|A_BOLD);
break;
case FFOOD:
mvwaddch(self->field, y, x, '#'|COLOR_PAIR(CP_GREEN));
break;
case WALL:
mvwaddch(self->field, y, x,
' '|COLOR_PAIR(CP_RED)|A_REVERSE);
break;
}
if (refresh) wrefresh(self->field);
}
問題はrxvt
、 で、ヘビの体 (TAIL
アイテムで作成) が時々ちらつくことです。ヘビの動きでは再描画されません。頭の最後の位置のみが に置き換えられTAIL
、ヘビの最後の尾のアイテムは に置き換えられEMPTY
ます。
参考までに、プロジェクト全体はgithubにあります。この質問をした時点でのリビジョンを参照してください。
入力については、コードが使用しており、フィールドウィンドウでのみ同じ結果を使用しgetch()
て、これが問題ではないことを既に確認しました(問題はありません。stdscr
初期化時に更新され、二度と触れられません) 。wgetch()
また、 pdcursesxterm
を使用して、古き良き Windows コンソールで(ちらつきのない)正常に動作します。上記のスニペットの を「通常の」文字に置き換えれば、問題なく動作します。rxvt
ACS_CKBOARD
だから、今私は知りたい: でバグ/欠点に遭遇しましたrxvt
か? ACS_*
端末がちらつく可能性のある文字に何か特別なことがありますか? 私のアプローチに何か問題がありますか?