第1回 HIT&BLOWを作ってみよう(計画)
🎮 第1回 HIT&BLOWを作ってみよう
まずは、小手調べとC言語の復習を兼ねて、コンソール上で動くゲームを作ります。
今回作るのは、HIT&BLOWです。
1.HIT&BLOWのルール
コンピュータは、同じ数字が重ならない4桁の問題を作ります。
プレイヤーは4桁の数字を入力し、コンピュータから返されたHITとBLOWを手掛かりに正解を探します。
- HIT:数字も位置も正解と一致している
- BLOW:数字は正解に含まれているが、位置が違う
例えば、正解と入力が次の場合を考えます。
正解:1234
入力:1325
結果は次のようになります。
1 HIT 2 BLOW
今回のルールをまとめると、次のとおりです。
- 重複しない4桁の数字をランダムに作る
- プレイヤーが4桁を入力する
- 入力内容に間違いがないか確認する
- HITとBLOWを数える
- 4 HITでなければ、もう一度入力する
- 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言語では、ifとelseに当たります。
■から■までは「繰り返す」
■ 正解していない
│ ・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を表示する
│ ▼
│
■
・正解メッセージを表示する
・ゲームを終了する
上から順番に読むと、次の流れになります。
- 正解を保存する配列と、入力を保存する配列を用意する
- HIT・BLOW・エラー番号を保存する変数を用意する
- コンピュータが問題を作る
hitを0にするhitが4ではない間、入力と判定を繰り返す- 入力エラーがある場合は、エラーを表示する
- 入力エラーがない場合は、HITとBLOWを数える
- 4 HITになったら繰返しを終了する
- 正解メッセージを表示して終了する
5.C言語のどの仕組みを使うのか
| 疑似言語の処理 | C言語で使うもの |
|---|---|
| 問題を作る | 配列、rand、srand、要素の交換 |
| 4桁を入力する | scanf、文字配列 |
| 入力エラーを調べる | strlen、isdigit、if |
| 入力を繰り返す | while |
| HITを数える | for、配列、if |
| BLOWを数える | 二重のfor、配列、if |
| 正解を判断する | strcmp、break |
一度にすべて作る必要はありません。
これから各回で、一つずつ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桁を、なぜ整数ではなく文字列として扱うのかを確認します。
No Comments