広告
↓発売日:2018年09月22日↓
![]() |
新品価格 |
今回はまっすぐ下にブロックを落下させたいと思います。
と言ってもただブロックの縦位置「block_y」の値を増やすだけなのでとても簡単です。
そのままでは「field[23][18]」に前のデータが残ったままになってしまうので念のため毎回その内容を消去します。
void my_clear_field(){
int i,j;
for(i=0;i<FIELD_HEIGHT;i++){
for(j=0;j<FIELD_WIDTH;j++){
field[i][j] = 0;
}
}
}
特に難しい事はしておりません。
ただ単純に「field[23][18]」の要素を「0」に戻してあげているだけです。
それでは「block_y」を増加させてブロックを落下させます。
void my_fall_block(){
block_y++;
}
こちらがブロック落下用の関数になります。
ただ「block_y++」しているだけなので特に説明はいらないですね。
それではこちらの関数をメインに設置します。
int main(){
int stop = 0;
my_init_var();
while(1){
my_clear_field();
my_make_block();
my_make_field();
my_draw_field();
my_fall_block();
stop = _getch();
if(block_y > 17)break;
}
return 0;
}
「while」文を使ってその中でブロック落下も含めて今までの作業を繰り返す事によりブロックパズルの動きを実現していきます。
特にスピード調整などはしていないので「_getch()」文で毎回停止させているのと、どこまでもいってしまわないように
if(block_y > 17)break;
と制限をかけております。
広告
前回はわかりやすいように「field[23][18]」の全体を表示しましたが今回から内側だけを描くようにします。
void my_draw_field(){
int i,j;
system("cls");
for(i=0;i<FIELD_HEIGHT - 2;i++){
for(j=2;j<FIELD_WIDTH - 2;j++){
if(field[i][j] == 9)printf("■");
else if(field[i][j] == 1)printf("□");
else printf(" ");
}
printf("\n");
}
}
配列を「for」文などで処理する時は配列の要素数を読み違えて配列の要素からはみ出る「バッファオーバーフロー」しないように注意が必要です。
ブロック落下!
ここまでの中間ソースになります。
それでは次回は左右の壁の当たり判定をつけたいと思います。
広告
↓発売日:2016年02月29日↓
![]() |
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
![]() |
新品価格 |
↓発売日:2018年03月09日↓
![]() |
新品価格 |
↓発売日:2017年06月14日↓
![]() |
新品価格 |
↓発売日:2018年05月21日↓
![]() |
新品価格 |
↓発売日:2017年12月07日↓
![]() |
新品価格 |
↓発売日:2017年02月08日↓
![]() |
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
![]() |
新品価格 |