画像(logo)

HOME/[C言語コンソール]ブロックパズルの作り方 目次/三日目 落下

広告

[C言語 コンソール ブロックパズルの作り方]
三日目 落下

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

目次へ戻る

落下

今回はまっすぐ下にブロックを落下させたいと思います。

と言ってもただブロックの縦位置「block_y」の値を増やすだけなのでとても簡単です。

「field」を消去

そのままでは「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」の内側だけ表示

前回はわかりやすいように「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」文などで処理する時は配列の要素数を読み違えて配列の要素からはみ出る「バッファオーバーフロー」しないように注意が必要です。

画像(cb_3_1)

ブロック落下!

ここまでの中間ソースになります。

中間ソース2

それでは次回は左右の壁の当たり判定をつけたいと思います。

次回

四日目 当たり判定「壁」

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2017年06月16日発売↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/5/1 13:15時点)