プログラミング コラム

ハイ・アンド・ローを作る 第2回

さて、今回は第1回目に続き、ハイ・アンド・ローの制作に挑戦します。

前回はコンピュータが無作為に答えを決定する部分を作成しました。
次はプレイヤーが任意の数値を入力する部分から作成しましょう。

※ キーボード入力を行う関数は様々ありますが、今回はscanfを採用します。
int main(void)
{
	int inputNum;

	printf("input:");
	scanf("%d",&inputNum);

	printf("inputNum = %d\n" , inputNum);

	return 0;
}

無事にキーボード入力を確認できました。

続いて、答えと入力値を比較します。
本来であれば、不正解の時にヒントを表示しますが、まずは正解/不正解だけを判断してみます。

int main(void)
{
	int inputNum;
	int answer;

	srand( time(NULL) );

	answer = (rand() % 100) + 1;
	printf("answer = %d\n" , answer);

	printf("input:");
	scanf("%d",&inputNum);

	printf("inputNum = %d\n" , inputNum);

	if( answer == inputNum )
	{
		printf("正解!\n");
	}
	else
	{
		printf("不正解\n");
	}

	return 0;
}

始めてif文が登場しました。
ifの下に続く波括弧の範囲(ブロック)が、条件が正しい時に実行されます。
elseは条件が正しくないときに実行されるブロックになります。

分岐に慣れないうちは、複雑な条件になると難しく感じてしまいます。
そんなときは「複雑な分岐は単純な分岐の組み合わせ」と考えてみましょう。
1度に全ての条件を考えるのではなく、上記のように主となる条件だけ先に動かして確認します。

ここまで動作させることができれば、後は不正解の時にヒントを出すだけですね。
分岐を入れ子にして、ヒントを表示します。

int main(void)
{
	int inputNum;
	int answer;

	srand( time(NULL) );

	answer = (rand() % 100) + 1;
	printf("answer = %d\n" , answer);

	printf("input:");
	scanf("%d",&inputNum);

	printf("inputNum = %d\n" , inputNum);

	if( answer == inputNum )
	{
		printf("正解!\n");
	}
	else
	{
		if( answer > inputNum )
		{
			printf("答えの方が 大きい です\n");
		}
		else
		{
			printf("答えの方が 小さい です\n");
		}	
	}

	return 0;
}

これでヒントの表示まで実現できました。

分岐に苦手意識を持っているのであれば、今回実践したように、少しずつ分岐を増やすやり方もお薦めです。
慣れてくると、今回の分岐は以下のように短縮して書けるようになってきます。

if( answer == inputNum )
{
	printf("正解!\n");
}else if( answer > inputNum ){
	printf("答えの方が 大きい です\n");
}else{
	printf("答えの方が 小さい です\n");
}

else if文を使うことで、入れ子が無くなりソースコードがスマートになりましたね。
無理に使う必要はありませんが、入れ子が増えてくると必然的にソースコードが見づらくなってしまうので、知っておきたい文法です。

さて、今のままではプレイヤーが入力するチャンスは1度しかありません。
次回は「反復」を活用して、プレイヤーが何度も数値を入力できるようにしてみましょう。
written by Tomoji Onishi / 2023.02.02
コラム一覧