Skip to main content

第1回 HIT&BLOWを作ってみよう(計画)

🎮 第1回 HIT&BLOWを作ってみよう

まずは、小手調べとC言語の復習を兼ねて、コンソール上で動くゲームを作ります。

今回作るのは、HIT&BLOWです。


1.HIT&BLOWのルール

コンピュータは、同じ数字が重ならない4桁の問題を作ります。

プレイヤーは4桁の数字を入力し、コンピュータから返されたHITとBLOWを手掛かりに正解を探します。

  • HIT:数字も位置も正解と一致している
  • BLOW:数字は正解に含まれているが、位置が違う

例えば、正解と入力が次の場合を考えます。

正解:1234
入力:1325

結果は次のようになります。

1 HIT 2 BLOW

今回のルールをまとめると、次のとおりです。

  1. 重複しない4桁の数字をランダムに作る
  2. プレイヤーが4桁を入力する
  3. 入力内容に間違いがないか確認する
  4. HITとBLOWを数える
  5. 4 HITでなければ、もう一度入力する
  6. 4 HITになったらゲーム終了

2.プログラムをいきなり書く前に流れを考える

長いプログラムを、最初からC言語だけで考えるのは大変です。

そこで、まずは疑似言語を使って、ゲーム全体の処理を整理します。

疑似言語は、プログラムの流れを人間が読みやすい形で表したものです。

この教材では、昔の基本情報技術者試験で使われていた記号式の疑似言語を参考にし、授業用に少し簡略化して使用します。

⚠️ 試験問題の表記を完全に再現することが目的ではありません。
記号を使って、選択処理や繰返し処理の範囲を読み取る練習をします。 授業でやった疑似言語とはちょっと違うけどこれはこれで見やすいよ!


3.疑似言語の記号を読んでみよう

は「手続きや変数を用意する」

○ HIT_AND_BLOW

これは、次のように読みます。

「HIT_AND_BLOWという手続きを始める」

C言語では、関数の始まりに近いものです。

int main(void)
{

変数や配列を用意するときにも使います。

○ 整数型:hit,blow
○ 文字型配列:answer[5],input[255]

C言語では、次の宣言に当たります。

int hit;
int blow;
char answer[5];
char input[255];

は「この処理を実行する」

・問題を作る

これは、そのまま次のように読みます。

「問題を作る処理を実行する」

・HITとBLOWを表示する

なら、「HITとBLOWを画面に表示する」という意味です。


は「右側の値を左側へ代入する」

・hit ← 0

これは、次のように読みます。

「hitに0を代入する」

C言語では、次のように書きます。

hit = 0;

⚠️ 代入は、数学の「等しい」とは意味が違います。
右側の値を、左側の変数へ入れる処理です。


からまでは「条件による分岐」

▲ 入力エラーがある
│ ・「入力し直してください」と表示する
▼

これは、次のように読みます。

「もし入力エラーがあるなら、入力し直すように表示する」

C言語のif文に当たります。

if (inputError != 0)
{
    printf("入力し直してください。\n");
}

途中に横線がある場合は、「そうでなければ」を表します。

▲ 入力エラーがある
│ ・エラーメッセージを表示する
├────────────────
│ ・HITとBLOWを数える
▼

C言語では、ifelseに当たります。


からまでは「繰り返す」

■ 正解していない
│ ・4桁を入力する
│ ・HITとBLOWを数える
■

これは、次のように読みます。

「正解していない間、4桁の入力と判定を繰り返す」

C言語のwhile文に当たります。

while (正解していない)
{
    /* 入力と判定 */
}

上側のが繰返しの始まり、下側のが繰返しの終わりです。


は「等しくない」

hit ≠ 4

これは、「hitが4と等しくない」と読みます。

C言語では次のように書きます。

hit != 4
意味 疑似言語 C言語
等しい ==
等しくない !=
代入する =

4.HIT&BLOW全体の流れ

記号の意味が分かったところで、ゲーム全体の流れを読んでみましょう。
ここが今回一番大事なところ。ここを見てプログラムにどう直したらいいかな?
っていうのが想像できるようになってくると、プログラムを書くための能力が正しく上がってきています。

○ HIT_AND_BLOW

  ○ 文字型配列:answer[5],input[255]
  ○ 整数型:error,hit,blow

  ・問題を作る
  ・hit ← 0

  ■ hit ≠ 4
  │
  │ ・4桁を入力する
  │ ・error ← 入力エラーを調べる(input)
  │
  │ ▲ error ≠ 0
  │ │ ・入力エラーを表示する
  │ ├────────────────────
  │ │ ・hit ← HIT数を数える(answer, input)
  │ │ ・blow ← BLOW数を数える(answer, input)
  │ │ ・hitとblowを表示する
  │ ▼
  │
  ■

  ・正解メッセージを表示する
  ・ゲームを終了する

上から順番に読むと、次の流れになります。

  1. 正解を保存する配列と、入力を保存する配列を用意する
  2. HIT・BLOW・エラー番号を保存する変数を用意する
  3. コンピュータが問題を作る
  4. hitを0にする
  5. hitが4ではない間、入力と判定を繰り返す
  6. 入力エラーがある場合は、エラーを表示する
  7. 入力エラーがない場合は、HITとBLOWを数える
  8. 4 HITになったら繰返しを終了する
  9. 正解メッセージを表示して終了する

5.C言語のどの仕組みを使うのか

疑似言語の処理 C言語で使うもの
問題を作る 配列、randsrand、要素の交換
4桁を入力する scanf、文字配列
入力エラーを調べる strlenisdigitif
入力を繰り返す while
HITを数える for、配列、if
BLOWを数える 二重のfor、配列、if
正解を判断する strcmpbreak

一度にすべて作る必要はありません。

これから各回で、一つずつC言語へ置き換えていきます。


6.プロジェクトを用意する

Visual Studioで、空のコンソールプロジェクトを作成します。 (準備編2で作ったやつね!

プロジェクト名の例は、次のとおりです。

HitAndBlow

ソースファイルには、次の名前を付けます。

main.c

⚠️ 今回はC言語で作るため、拡張子を.cppではなく.cにします。

.cppでも別にいいけどね。.cにするとコンパイラが賢いとC++じゃなくCのコンパイラ使ってくれます。

まず、次のプログラムが動くことを確認してください。

#include <stdio.h>

int main(void)
{
    printf("HIT & BLOW GAME\n");
    return 0;
}
HIT & BLOW GAME

と表示されれば、準備完了です。


🏁 今回のまとめ

  • HITは、数字も位置も同じ
  • BLOWは、数字はあるが位置が違う
  • プログラムを書く前に、処理全体の流れを考える
  • は選択処理
  • は繰返し処理
  • は代入
  • 今回はmain.cを使ってC言語で作る

次回は、プレイヤーが入力する4桁を、なぜ整数ではなく文字列として扱うのかを確認します。