main()
関数
main()
関数では、まず初期化関数 init()
を呼び出し、その後 while()
ループに入ります。このループは主に 3 つの部分で構成されています。
- ユーザーの入力をチェックする:「w」キーまたはスペースバーが押された場合、鳥は 2 行上に移動します。「q」キーが押された場合、ゲームは終了します。「z」キーが押された場合、ゲームは一時停止します。
- 鳥を移動させて再描画する。
- 鳥がパイプに当たったかどうかをチェックする。
コードを見てみましょう。
int main()
{
char ch;
init();
while(1)
{
ch = getch(); // キーボード入力を取得
if(ch == ' ' || ch == 'w' || ch == 'W') // スペースバーまたは「w」キーが押された場合
{
// 鳥を移動させて再描画
move(bird_y, bird_x);
addch(CHAR_BLANK);
refresh();
bird_y--;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
// 鳥がパイプに当たった場合、ゲームを終了
if((char)inch() == CHAR_STONE)
{
set_ticker(0);
sleep(1);
endwin();
exit(0);
}
}
else if(ch == 'z' || ch == 'Z') // 一時停止
{
set_ticker(0);
do
{
ch = getch();
} while(ch!= 'z' && ch!= 'Z');
set_ticker(ticker);
}
else if(ch == 'q' || ch == 'Q') // 終了
{
sleep(1);
endwin();
exit(0);
}
}
return 0;
}
main()
関数では、まず画面を初期化し、その後ループでキーボード入力を受け取ります。「w」キーまたはスペースバーが押された場合、鳥は 2 行上に移動します。「q」キーが押された場合、ゲームは終了します。「z」キーが押された場合、ゲームは一時停止します。
次に、init()
関数を見てみましょう。
void init()
{
initscr();
cbreak();
noecho();
curs_set(0);
srand(time(0));
signal(SIGALRM, drop);
init_bird();
init_head();
init_wall();
init_draw();
sleep(1);
ticker = 500;
set_ticker(ticker);
}
init()
関数はまず ncurses
が提供する関数を使って画面を初期化します。その後、いくつかのサブ関数を呼び出して特定の初期化を行います。シグナルハンドラ関数 drop()
をインストールし、タイマー間隔を設定することに注意してください。
それぞれの初期化サブ関数を見てみましょう。
init_bird()
関数は鳥の位置を初期化します。
void init_bird()
{
bird_x = 5;
bird_y = 15;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
sleep(1);
}
init_head()
関数と init_wall()
関数は、パイプを格納するリンクリストを初期化します。
void init_head()
{
Node tmp;
tmp = (node *)malloc(sizeof(node));
tmp->next = NULL;
head = tmp;
tail = head;
}
void init_wall()
{
int i;
Node tmp, p;
p = head;
for(i = 0; i < 5; i++)
{
tmp = (node *)malloc(sizeof(node));
tmp->x = (i + 1) * 19;
tmp->y = rand() % 11 + 5;
p->next = tmp;
tmp->next = NULL;
p = tmp;
}
tail = p;
}
init_draw()
関数は画面を初期化します。
void init_draw()
{
Node p;
int i, j;
// リンクリストを巡回
for(p = head->next; p->next!= NULL; p = p->next)
{
// パイプを描画
for(i = p->x; i > p->x-10; i--)
{
for(j = 0; j < p->y; j++)
{
move(j, i);
addch(CHAR_STONE);
}
for(j = p->y+5; j <= 23; j++)
{
move(j, i);
addch(CHAR_STONE);
}
}
refresh();
sleep(1);
}
}
これで、私たちの Flappy Bird ゲームは完成です。