皆さん、こんにちは!YumePro/iTeen北上校 教室長のゆめとです。
今回から私のプログラミング学び直しも兼ねて新シリーズを開始します!

新シリーズ!「ゆめと教室長とプログラミング!」
第1弾は、あなたの心を“読んだように”当てる《マインドリーダー100》をPythonで作ります。
⸻
まずはゴールのイメージ
• あなたは 1〜100 の好きな数字を1つ頭に思い浮かべます。
• コンピューターが「その数字は○○より大きい?」と質問してくるので、yes / no で答えてください。
• すると…最大7回の質問で、あなたの数字をピタリと言い当てます!
どうして7回で必ず当たるの?
→ 100通りの中から1つをしぼるには、2の累乗で考えると分かりやすいです。
2⁶=64 < 100、2⁷=128 ≥ 100 ⇒ 7回の二者択一で100通りをカバーできます(=二分探索の考え方)。
⸻
完成コード(基礎版)

⸻
コードを“全部”理解しよう(基礎→実践)
print関数(表示)
画面に文字や数値を出します。授業では説明→指示→結果の順にprint()で丁寧に出すと親切。
print('1 から100 ... 思い浮かべてください。')
変数(値の入れ物)
lowとhighで 今の候補範囲 を表します。最初は 1〜100。
low = 1
high = 100
ここで print(low, high) はデバッグ用。開発中に内部の状態を見える化します(本番では消してOK)。
forループ(回数で繰り返す)
for i in range(7):
range(7) は 0〜6 の7回を意味します。
7回質問すれば必ず当てられる理屈(2⁷ ≥ 100)に合わせた設計です。
早期終了(break)
if low == high:
break
候補が1つにしぼれたら、ムダな質問をせずに即終了。これが“スマート”なコード。
算術演算子 //(整数の割り算)
guess = (low + high) // 2
// は小数点以下を切り捨て。
例:(1+100)//2 = 50
二分探索では「真ん中」をとるので、小数点は不要=整数でOK。
※ / だと小数(float)になり後で扱いづらくなります。
input関数(入力)
answer = input()
キーボードから文字列として受け取ります。ここでは "yes" かそれ以外(=no扱い)。
if文(分岐)
if answer == "yes":
low = guess + 1
else:
high = guess
• yes(大きい)⇒ 範囲を [guess+1, high] に狭める
• no(小さい or 等しい)⇒ 範囲を [low, guess] に狭める
“等しい”を明示で扱っていないのに当たる理由:
no側にguessを含める設計(high = guess)だから、最終的に low == high == 正解 に収束します。
結果表示
print('あなたの考えている数字は', low, 'ですね!')
ループを抜けたら low と high は同じ=それが答え。
⸻
追跡してみよう:たとえば「73」を思い浮かべた場合

(>は「大きい?」への回答)
1. 範囲[1,100] → 推測50 → 73は50より大きい(yes) ⇒ low=51
2. 範囲[51,100] → 推測75 → 73は75より大きくない(no) ⇒ high=75
3. 範囲[51,75] → 推測63 → 73は大きい(yes) ⇒ low=64
4. 範囲[64,75] → 推測69 → 大きい(yes) ⇒ low=70
5. 範囲[70,75] → 推測72 → 大きい(yes) ⇒ low=73
6. 範囲[73,75] → 推測74 → 大きくない(no) ⇒ high=74
7. 範囲[73,74] → 推測73 → 大きくない(no) ⇒ high=73 → low==high==73
⸻
デバッグのコツ(初学者がつまづくポイントと対策)
1) 途中経過を出す
print(f"[DEBUG] i={i}, low={low}, high={high}, guess={guess}, answer={answer}")
何がどう変化しているかを視覚化。バグ発見が一気に楽に。
2) よくあるエラー
• IndentationError: インデント(字下げ)ずれ。forやifの内側は4スペースで統一。
• NameError: 変数名の綴りミス(hoghなど)。コピペで回避。
• TypeError: /で小数にしてしまい、後続で整数前提の処理と衝突。//を使う。
• ロジックミス: if answer == "yes": high = guess のような反対代入に注意。
3) テスト観点
• 端の値:1や100を正しく当てられる?
• 中央値:50を正しく扱える?
• 入力揺れ:Yes / YES / y などにも対応したいなら正規化(後述の改良版)を導入。
⸻
改良版:入力ゆれ対応&丁寧プロンプト
基礎版は学習用としてシンプル。そのうえで、実運用では入力のゆれ(Yes, y, はい など)に強くしておくと体験が良くなります。例えば...
ポイント
• strip().lower() で空白・大小文字ゆれを吸収
• while True: で無効入力を再質問
• f文字列(f'...')で可読性UP
⸻
学びの整理(今回のキーワード)
• print関数:結果や案内を表示
• 変数:low, high, guess で状態管理
• コメント:#で意図を残す(未来の自分/仲間のため)
• forループ:決まった回数の繰り返し
• 算術演算子:+ - //(整数割り算)
• input関数:ユーザーから情報を受け取る
• if文:条件で分岐
• デバッグ:途中経過の可視化・テスト観点・エラー対処
⸻
もっと楽しくする発展アイデア
1. 回数の自動計算
範囲がN(例:1〜1000)でも、必要回数はだいたい ceil(log2(N))。範囲を自由入力にして万能化。
2. キャラクター化
質問するたびに、表情アイコンやセリフを変える(テキストでもOK)。
3. ウソ検出モード(上級)
矛盾した回答(範囲が成立しない)を検知してやり直し提案。
4. GUI化
tkinterでボタン(はい/いいえ)にして小学生でも直感操作。
5. 結果演出
当てたときに効果音やASCIIアートでドーン!と祝う。
⸻
親御さまへ:この授業で育つ力
• 論理的思考:情報を半分にしぼる「二分探索」の発想
• 問題分解:導入→対話→結果表示という3部構成
• 検証習慣:デバッグ出力で状況を客観視する方法
• 表現力:ユーザーに伝わる文言・入力設計(体験設計)
⸻
次回予告
次回は 「推理力測定ゲーム」 を予定。
条件分岐やループをもっと活用して、推理クイズの仕掛けを作っていきます。お楽しみに!
⸻
体験授業では、アプリを自分好みに改造して持ち帰ることもできます。
「うちの子、どこから始めればいい?」などお気軽にご相談ください!
それでは、また次の「ゆめと教室長とプログラミング!」でお会いしましょう!