🎮 ステップ24: ミニプロジェクト①
これまでの知識を総動員して、楽しいプログラムを作ろう!
このステップでは、これまで学んできた変数、条件分岐、繰り返し処理、関数などの知識を組み合わせて、実際に動くプログラムを作ります。
📖 このステップで作るもの
・🎮 じゃんけんゲーム
・🎲 数当てゲーム
・📝 To-Doリスト管理アプリ
💡 プロジェクト学習のポイント
完璧を目指さなくて大丈夫です。まずは動くものを作り、少しずつ改善していきましょう。
エラーが出ても、それは学びのチャンスです!
🎮 プロジェクト1: じゃんけんゲーム
📝 プロジェクトの説明
コンピュータとじゃんけんをするゲームを作ります。プレイヤーが「グー」「チョキ」「パー」のいずれかを選び、コンピュータもランダムに選択して、勝敗を判定します。
📌 このプロジェクトで使う知識
| 知識 | 使う場面 |
| randomモジュール | コンピュータの手をランダムに選ぶ |
| input()関数 | プレイヤーの入力を受け取る |
| if文 | 勝敗を判定する |
| リスト | じゃんけんの手を管理する |
🔰 ステップ1: 基本的なじゃんけんプログラム
まずは1回だけじゃんけんができるシンプルなプログラムを作ります。完成までの手順を一つずつ見ていきましょう。
手順1:必要なモジュールをインポート
ランダムな選択をするために、randomモジュールを使います。
コード:randomモジュールのインポート
※スマートフォンでは横スクロールできます
import random
💡 コードの説明
import random
・randomモジュールを読み込みます
・このモジュールにはランダムな選択をする機能が含まれています
・コンピュータの手をランダムに選ぶために必要です
手順2:じゃんけんの手を定義
「グー」「チョキ」「パー」の3つの手をリストで用意します。
コード:手のリストを作成
※スマートフォンでは横スクロールできます
choices = ['グー', 'チョキ', 'パー']
💡 コードの説明
choices = [‘グー’, ‘チョキ’, ‘パー’]
・じゃんけんの3つの手をリストに格納します
・インデックス0が「グー」、1が「チョキ」、2が「パー」です
・この順番は後でプレイヤーの入力と対応させます
手順3:ゲームの説明を表示
プレイヤーにゲームの遊び方を伝えます。
コード:ゲームの説明
※スマートフォンでは横スクロールできます
print("じゃんけんゲームへようこそ!")
print("1: グー, 2: チョキ, 3: パー")
💡 コードの説明
print(“じゃんけんゲームへようこそ!”)
・ゲームの開始メッセージを表示します
print(“1: グー, 2: チョキ, 3: パー”)
・プレイヤーが選べる選択肢を表示します
・1を入力すると「グー」、2で「チョキ」、3で「パー」を選べることを示します
手順4:プレイヤーの入力を受け取る
プレイヤーが1、2、3のいずれかを入力します。
コード:プレイヤーの選択
※スマートフォンでは横スクロールできます
player_num = int(input("あなたの手を選んでください(1-3): "))
💡 コードの説明
input(“あなたの手を選んでください(1-3): “)
・プレイヤーからキーボード入力を受け取ります
・input()は文字列を返します
int(…)
・文字列を整数に変換します
・「1」という文字列を数値の1に変換します
player_num =
・変換した数値をplayer_num変数に保存します
手順5:入力された番号を手に変換
プレイヤーが入力した数値(1、2、3)を、対応する手(グー、チョキ、パー)に変換します。
コード:番号を手に変換
※スマートフォンでは横スクロールできます
player = choices[player_num - 1]
💡 コードの説明
choices[player_num – 1]
・リストのインデックスは0から始まるので、入力値から1を引きます
・player_numが1なら → choices[0] → 「グー」
・player_numが2なら → choices[1] → 「チョキ」
・player_numが3なら → choices[2] → 「パー」
player =
・選ばれた手をplayer変数に保存します
手順6:コンピュータの手をランダムに選ぶ
コンピュータはランダムに手を選びます。
コード:コンピュータの選択
※スマートフォンでは横スクロールできます
computer = random.choice(choices)
💡 コードの説明
random.choice(choices)
・randomモジュールのchoice()関数を使います
・リストの中からランダムに1つの要素を選びます
・「グー」「チョキ」「パー」のいずれかが選ばれます
computer =
・選ばれた手をcomputer変数に保存します
手順7:両者の手を表示
プレイヤーとコンピュータが何を出したか表示します。
コード:手の表示
※スマートフォンでは横スクロールできます
print(f"\nあなた: {player}")
print(f"コンピュータ: {computer}")
💡 コードの説明
\n
・改行を表します
・見やすくするために空行を入れています
f”あなた: {player}”
・f文字列(フォーマット済み文字列)を使っています
・{player}の部分に変数playerの値が入ります
・例:playerが「グー」なら「あなた: グー」と表示されます
手順8:勝敗を判定する
じゃんけんの勝敗ルールに従って、結果を判定します。
コード:勝敗判定
※スマートフォンでは横スクロールできます
if player == computer:
print("引き分けです!")
elif (player == 'グー' and computer == 'チョキ') or \
(player == 'チョキ' and computer == 'パー') or \
(player == 'パー' and computer == 'グー'):
print("あなたの勝ちです!🎉")
else:
print("コンピュータの勝ちです...")
💡 コードの説明
if player == computer:
・両者の手が同じかチェックします
・同じなら引き分けです
elif (player == ‘グー’ and computer == ‘チョキ’)
・プレイヤーが勝つパターンをチェックします
・グーはチョキに勝ちます
or
・複数の条件のいずれかが当てはまればTrueになります
\(バックスラッシュ)
・行が長い時、次の行に続けて書くための記号です
・条件が読みやすくなります
else:
・引き分けでもプレイヤーの勝ちでもない場合
・つまり、コンピュータの勝ちです
📌 じゃんけんの勝ちパターン
| プレイヤーの手 | コンピュータの手 | 結果 |
| グー | チョキ | プレイヤーの勝ち |
| チョキ | パー | プレイヤーの勝ち |
| パー | グー | プレイヤーの勝ち |
完成コード:基本的なじゃんけんゲーム
これまでの手順を全て組み合わせた完成版です。
コード:完成版
※スマートフォンでは横スクロールできます
import random
# じゃんけんの手
choices = ['グー', 'チョキ', 'パー']
# プレイヤーの入力
print("じゃんけんゲームへようこそ!")
print("1: グー, 2: チョキ, 3: パー")
player_num = int(input("あなたの手を選んでください(1-3): "))
# プレイヤーの手を取得
player = choices[player_num - 1]
# コンピュータの手をランダムに選択
computer = random.choice(choices)
print(f"\nあなた: {player}")
print(f"コンピュータ: {computer}")
# 勝敗判定
if player == computer:
print("引き分けです!")
elif (player == 'グー' and computer == 'チョキ') or \
(player == 'チョキ' and computer == 'パー') or \
(player == 'パー' and computer == 'グー'):
print("あなたの勝ちです!🎉")
else:
print("コンピュータの勝ちです...")
実行結果
じゃんけんゲームへようこそ! 1: グー, 2: チョキ, 3: パー あなたの手を選んでください(1-3): 1 あなた: グー コンピュータ: チョキ あなたの勝ちです!🎉
🔑 重要なポイント
random.choice()を使うと、リストからランダムに要素を選べます。
リストのインデックスは0から始まるので、1を引いて調整します。
複数の条件はorでつなげて、いずれかが当てはまればTrueになります。
💡 動作の流れ
1. プレイヤーが1を入力する
2. player_numに1が保存される
3. choices[1-1] = choices[0] = 「グー」がplayerに保存される
4. コンピュータがランダムに選ぶ(例:「チョキ」)
5. 両者の手を表示する
6. 「グー」と「チョキ」を比較 → プレイヤーの勝ち
7. 「あなたの勝ちです!🎉」と表示される
🔄 ステップ2: 繰り返しプレイできるように改良
1回だけでなく、何度でもプレイできるようにプログラムを改良します。さらに戦績記録、エラー処理、終了機能も追加します。
📌 追加する機能
| 機能 | 説明 |
| 繰り返しプレイ | while文で何度でも遊べる |
| 戦績記録 | 勝ち、負け、引き分けをカウント |
| エラー処理 | try-exceptで無効な入力に対応 |
| 終了機能 | 0を入力でゲーム終了 |
| 関数化 | コードを整理して読みやすく |
手順1:戦績を記録する変数を用意
勝ち、負け、引き分けの回数を数えるための変数を用意します。
コード:戦績記録用の変数
※スマートフォンでは横スクロールできます
wins = 0 # 勝ち数
losses = 0 # 負け数
draws = 0 # 引き分け数
💡 コードの説明
wins = 0
・プレイヤーの勝利回数を記録します
・0で初期化して、勝つたびに1増やします
losses = 0
・プレイヤーの敗北回数を記録します
draws = 0
・引き分けの回数を記録します
全て0から始めて、結果に応じて増やしていきます。
手順2:メインループを作る
while文を使って、ゲームを繰り返せるようにします。
コード:繰り返しの基本構造
※スマートフォンでは横スクロールできます
while True:
print("\n1: グー, 2: チョキ, 3: パー, 0: 終了")
player_num = int(input("あなたの手を選んでください: "))
💡 コードの説明
while True:
・条件が常にTrueなので、永遠に繰り返します
・breakで抜けるまで続きます
・ゲームのメインループとして使います
\n
・改行を入れて見やすくします
・前の結果と次のゲームの間に空行が入ります
0: 終了
・0を入力するとゲームを終了できます
・プレイヤーが自分で終わりを決められます
手順3:終了処理を追加
0が入力されたらループを抜けて、ゲームを終了します。
コード:終了処理
※スマートフォンでは横スクロールできます
if player_num == 0:
print("\n" + "=" * 40)
print("ゲーム終了!")
print(f"戦績: {wins}勝 {losses}敗 {draws}引き分け")
print("=" * 40)
break
💡 コードの説明
if player_num == 0:
・入力が0かどうかをチェックします
・0なら終了処理を実行します
“=” * 40
・=記号を40個並べます
・見やすい区切り線になります
print(f”戦績: {wins}勝 {losses}敗 {draws}引き分け”)
・最終的な戦績を表示します
・{wins}などの部分に変数の値が入ります
break
・while文のループを抜けます
・ゲームが終了します
手順4:エラー処理を追加
数字以外が入力された場合や、1〜3以外の数字が入力された場合に対応します。
コード:入力チェック
※スマートフォンでは横スクロールできます
try:
player_num = int(input("あなたの手を選んでください: "))
# 入力チェック
if player_num not in [1, 2, 3, 0]:
print("❌ 0, 1, 2, 3のいずれかを入力してください")
continue
except ValueError:
print("❌ 数字を入力してください")
continue
💡 コードの説明
try:
・エラーが起きる可能性のあるコードを囲みます
・int()で変換できない入力があるとエラーになります
player_num not in [1, 2, 3, 0]
・player_numが1、2、3、0のいずれでもないかチェックします
・例えば5が入力された場合、この条件がTrueになります
continue
・この行以降をスキップして、whileループの最初に戻ります
・もう一度入力を求めます
except ValueError:
・int()で変換できなかった時に実行されます
・例えば「あ」と入力された場合です
エラーメッセージを表示して、もう一度入力を求めます。
手順5:勝敗に応じて戦績を更新
じゃんけんの結果に応じて、対応する変数を1増やします。
コード:戦績の更新
※スマートフォンでは横スクロールできます
if player == computer:
print("引き分けです!")
draws += 1
elif (player == 'グー' and computer == 'チョキ') or \
(player == 'チョキ' and computer == 'パー') or \
(player == 'パー' and computer == 'グー'):
print("あなたの勝ちです!🎉")
wins += 1
else:
print("コンピュータの勝ちです...")
losses += 1
print(f"現在の戦績: {wins}勝 {losses}敗 {draws}引き分け")
💡 コードの説明
draws += 1
・draws = draws + 1 の省略形です
・引き分けの回数を1増やします
wins += 1
・勝ちの回数を1増やします
losses += 1
・負けの回数を1増やします
print(f”現在の戦績: {wins}勝 {losses}敗 {draws}引き分け”)
・現在の戦績を毎回表示します
・プレイヤーは自分の成績を確認できます
手順6:関数にまとめる
全体のコードを関数にまとめると、より整理されて使いやすくなります。
コード:関数定義
※スマートフォンでは横スクロールできます
def janken_game():
"""じゃんけんゲームのメイン関数"""
choices = ['グー', 'チョキ', 'パー']
wins = 0
losses = 0
draws = 0
# ゲームのコードをここに書く
# ゲーム開始
janken_game()
💡 コードの説明
def janken_game():
・janken_gameという名前の関数を定義します
・()の中は空なので、引数はありません
“””じゃんけんゲームのメイン関数”””
・ドキュメント文字列(docstring)です
・この関数が何をするかを説明します
janken_game()
・定義した関数を実行します
・このコードを実行すると、ゲームが始まります
完成コード:繰り返しプレイ版じゃんけん
全ての機能を組み合わせた完成版です。
コード:完成版
※スマートフォンでは横スクロールできます
import random
def janken_game():
"""じゃんけんゲームのメイン関数"""
choices = ['グー', 'チョキ', 'パー']
# 戦績記録
wins = 0
losses = 0
draws = 0
print("=" * 40)
print("じゃんけんゲームへようこそ!")
print("=" * 40)
while True:
print("\n1: グー, 2: チョキ, 3: パー, 0: 終了")
try:
player_num = int(input("あなたの手を選んでください: "))
# 終了処理
if player_num == 0:
print("\n" + "=" * 40)
print("ゲーム終了!")
print(f"戦績: {wins}勝 {losses}敗 {draws}引き分け")
print("=" * 40)
break
# 入力チェック
if player_num not in [1, 2, 3]:
print("❌ 1, 2, 3のいずれかを入力してください")
continue
# プレイヤーの手
player = choices[player_num - 1]
# コンピュータの手
computer = random.choice(choices)
print(f"\nあなた: {player}")
print(f"コンピュータ: {computer}")
print("-" * 40)
# 勝敗判定
if player == computer:
print("引き分けです!")
draws += 1
elif (player == 'グー' and computer == 'チョキ') or \
(player == 'チョキ' and computer == 'パー') or \
(player == 'パー' and computer == 'グー'):
print("あなたの勝ちです!🎉")
wins += 1
else:
print("コンピュータの勝ちです...")
losses += 1
# 現在の戦績表示
print(f"現在の戦績: {wins}勝 {losses}敗 {draws}引き分け")
except ValueError:
print("❌ 数字を入力してください")
# ゲーム開始
janken_game()
実行結果
======================================== じゃんけんゲームへようこそ! ======================================== 1: グー, 2: チョキ, 3: パー, 0: 終了 あなたの手を選んでください: 1 あなた: グー コンピュータ: パー ---------------------------------------- コンピュータの勝ちです... 現在の戦績: 0勝 1敗 0引き分け 1: グー, 2: チョキ, 3: パー, 0: 終了 あなたの手を選んでください: 2 あなた: チョキ コンピュータ: パー ---------------------------------------- あなたの勝ちです!🎉 現在の戦績: 1勝 1敗 0引き分け 1: グー, 2: チョキ, 3: パー, 0: 終了 あなたの手を選んでください: 0 ======================================== ゲーム終了! 戦績: 1勝 1敗 0引き分け ========================================
🔑 重要なポイント
while True:とbreakを組み合わせると、条件が複雑な繰り返しを作れます。
try-exceptを使うと、エラーが起きてもプログラムが止まらず、適切に対応できます。
continueを使うと、無効な入力の時にループの最初に戻れます。
🎲 プロジェクト2: 数当てゲーム
📝 プロジェクトの説明
コンピュータが1から100までの数字をランダムに選び、プレイヤーがその数字を当てるゲームです。プレイヤーが数字を入力すると、「もっと大きい」「もっと小さい」とヒントが表示されます。
📌 このプロジェクトで使う知識
| 知識 | 使う場面 |
| random.randint() | ランダムな整数を生成 |
| while文 | 正解するまで繰り返す |
| if文 | 大小を判定してヒントを表示 |
| 変数 | 試行回数をカウント |
手順1:正解の数字を生成
コンピュータがランダムに1から100までの数字を選びます。
コード:ランダムな数字の生成
※スマートフォンでは横スクロールできます
import random
answer = random.randint(1, 100)
attempts = 0
💡 コードの説明
import random
・randomモジュールを読み込みます
・ランダムな数を生成する機能が使えるようになります
random.randint(1, 100)
・1から100までのランダムな整数を生成します
・1と100の両方を含みます(1や100も出る可能性があります)
・この数字が正解になります
answer =
・生成された数字をanswer変数に保存します
・プレイヤーには見えません
attempts = 0
・試行回数を数える変数を0で初期化します
・予想するたびに1増やします
手順2:ゲームの説明を表示
プレイヤーにゲームのルールを伝えます。
コード:ゲームの説明
※スマートフォンでは横スクロールできます
print("=" * 40)
print("数当てゲームへようこそ!")
print("=" * 40)
print("1から100までの数字を当ててください")
💡 コードの説明
“=” * 40
・=記号を40個繰り返します
・見やすい区切り線を作ります
print(“1から100までの数字を当ててください”)
・ゲームのルールを説明します
・プレイヤーは1〜100の範囲で予想します
手順3:プレイヤーの予想を受け取る
正解するまで、プレイヤーの予想を繰り返し受け取ります。
コード:入力と試行回数のカウント
※スマートフォンでは横スクロールできます
while True:
try:
guess = int(input("\nあなたの予想: "))
attempts += 1
except ValueError:
print("❌ 数字を入力してください")
💡 コードの説明
while True:
・正解するまでずっと繰り返します
・breakで抜けるまで続きます
guess = int(input(“\nあなたの予想: “))
・プレイヤーから数字の入力を受け取ります
・文字列を整数に変換してguess変数に保存します
attempts += 1
・試行回数を1増やします
・何回で当てられたかを記録します
except ValueError:
・数字以外が入力された場合に実行されます
・エラーメッセージを表示して、再度入力を求めます
手順4:入力範囲のチェック
1から100の範囲外の数字が入力された場合に対応します。
コード:範囲チェック
※スマートフォンでは横スクロールできます
if guess < 1 or guess > 100:
print("❌ 1から100の間で入力してください")
continue
💡 コードの説明
if guess < 1 or guess > 100:
・guessが1未満、または100より大きいかチェックします
・例えば0や150が入力された場合、この条件がTrueになります
or
・左右いずれかの条件が当てはまればTrueになります
continue
・この行以降をスキップして、whileループの最初に戻ります
・もう一度正しい範囲で入力を求めます
手順5:大小を判定してヒントを表示
予想と正解を比較して、適切なヒントを出します。
コード:判定とヒント
※スマートフォンでは横スクロールできます
if guess == answer:
print(f"\n🎉 正解です!")
print(f"試行回数: {attempts}回")
break
elif guess < answer:
print("📈 もっと大きいです")
else:
print("📉 もっと小さいです")
💡 コードの説明
if guess == answer:
・予想が正解と一致するかチェックします
・一致すれば正解です
print(f"試行回数: {attempts}回")
・何回で当てられたかを表示します
・{attempts}に試行回数が入ります
break
・正解したのでループを抜けます
・ゲームが終了します
elif guess < answer:
・予想が正解より小さい場合です
・「もっと大きい数です」とヒントを出します
else:
・予想が正解より大きい場合です
・「もっと小さい数です」とヒントを出します
完成コード:基本的な数当てゲーム
全ての手順を組み合わせた完成版です。
コード:完成版
※スマートフォンでは横スクロールできます
import random
def number_guess_game():
"""数当てゲームのメイン関数"""
print("=" * 40)
print("数当てゲームへようこそ!")
print("=" * 40)
print("1から100までの数字を当ててください")
# 正解の数字を生成
answer = random.randint(1, 100)
attempts = 0 # 試行回数
while True:
try:
# プレイヤーの入力
guess = int(input("\nあなたの予想: "))
attempts += 1
# 範囲チェック
if guess < 1 or guess > 100:
print("❌ 1から100の間で入力してください")
continue
# 判定
if guess == answer:
print(f"\n🎉 正解です!")
print(f"試行回数: {attempts}回")
break
elif guess < answer:
print("📈 もっと大きいです")
else:
print("📉 もっと小さいです")
except ValueError:
print("❌ 数字を入力してください")
# ゲーム開始
number_guess_game()
実行結果
======================================== 数当てゲームへようこそ! ======================================== 1から100までの数字を当ててください あなたの予想: 50 📈 もっと大きいです あなたの予想: 75 📉 もっと小さいです あなたの予想: 62 📈 もっと大きいです あなたの予想: 68 📉 もっと小さいです あなたの予想: 65 🎉 正解です! 試行回数: 5回
💡 効率的な当て方のヒント
1から100の数字を効率よく当てるには、真ん中の数字から試すのがコツです。
二分探索の考え方:
・1回目:50を予想 → 範囲が半分に絞れます
・2回目:25か75を予想 → 範囲がさらに半分に
・3回目:さらに真ん中を予想
この方法なら、最大7回で必ず当てられます!
🔑 重要なポイント
random.randint(a, b)は、aからbまでの整数をランダムに生成します(両端を含む)。
while True:とbreakで、正解するまで繰り返します。
if-elif-elseで、3つの状態(正解、小さい、大きい)を判定します。
🎯 ステップ2: 難易度選択とベストスコア機能を追加
より楽しめるように、難易度選択とベストスコア記録機能を追加します。プレイヤーは自分のレベルに合わせて難易度を選べるようになります。
📌 追加する機能
| 機能 | 説明 |
| 難易度選択 | かんたん(1-50)、ふつう(1-100)、むずかしい(1-200) |
| ベストスコア | 最も少ない試行回数を記録 |
| 繰り返しプレイ | 何度でも遊べる |
| 新記録表示 | ベストスコアを更新したら通知 |
手順1:ベストスコア変数を用意
これまでの最高記録を保存する変数を用意します。
コード:ベストスコアの初期化
※スマートフォンでは横スクロールできます
best_score = None
💡 コードの説明
best_score = None
・ベストスコアを記録する変数です
・Noneは「値がない」という意味です
・まだ一度もプレイしていない状態を表します
・最初のプレイ後に数値が入ります
手順2:難易度選択メニューを作る
プレイヤーが難易度を選べるようにします。
コード:難易度選択
※スマートフォンでは横スクロールできます
print("\n難易度を選んでください:")
print("1: かんたん(1-50)")
print("2: ふつう(1-100)")
print("3: むずかしい(1-200)")
print("0: 終了")
level = int(input("選択: "))
💡 コードの説明
print("1: かんたん(1-50)")
・各難易度とその範囲を表示します
・プレイヤーは1、2、3から選べます
print("0: 終了")
・0を入力するとゲームを終了できます
level = int(input("選択: "))
・選択された数字をlevel変数に保存します
手順3:終了処理を追加
0が入力されたら、ベストスコアを表示して終了します。
コード:終了処理
※スマートフォンでは横スクロールできます
if level == 0:
print("\nゲーム終了!")
if best_score:
print(f"ベストスコア: {best_score}回")
break
💡 コードの説明
if level == 0:
・0が選択されたかチェックします
if best_score:
・best_scoreがNoneでない(記録がある)かチェックします
・Noneは偽(False)として扱われます
・一度もプレイしていなければ表示されません
print(f"ベストスコア: {best_score}回")
・最高記録を表示します
手順4:難易度に応じて範囲を設定
選択された難易度によって、数字の範囲を変えます。
コード:範囲の設定
※スマートフォンでは横スクロールできます
if level == 1:
max_num = 50
difficulty = "かんたん"
elif level == 2:
max_num = 100
difficulty = "ふつう"
elif level == 3:
max_num = 200
difficulty = "むずかしい"
else:
print("❌ 1, 2, 3のいずれかを選んでください")
continue
💡 コードの説明
if level == 1:
・難易度1(かんたん)が選ばれた場合です
max_num = 50
・数字の範囲の上限を50に設定します
・1から50までの数を当てるゲームになります
difficulty = "かんたん"
・難易度名を変数に保存します
・表示に使います
elif level == 2:
・難易度2(ふつう)の場合、max_numは100になります
elif level == 3:
・難易度3(むずかしい)の場合、max_numは200になります
else:
・1、2、3以外が入力された場合です
・エラーメッセージを表示して、もう一度選択を求めます
手順5:選択した難易度を表示
プレイヤーに現在の難易度と範囲を知らせます。
コード:難易度の表示
※スマートフォンでは横スクロールできます
print(f"\n【{difficulty}モード】1から{max_num}までの数字を当ててください")
answer = random.randint(1, max_num)
attempts = 0
💡 コードの説明
print(f"\n【{difficulty}モード】...")
・選択された難易度を表示します
・{difficulty}に「かんたん」などが入ります
・{max_num}に範囲の上限が入ります
answer = random.randint(1, max_num)
・1からmax_numまでのランダムな数を生成します
・難易度によって範囲が変わります
attempts = 0
・試行回数をリセットします
・新しいゲームのたびに0から始めます
手順6:ベストスコアの更新チェック
正解したら、ベストスコアを更新したかチェックします。
コード:ベストスコア更新
※スマートフォンでは横スクロールできます
if guess == answer:
print(f"\n🎉 正解です!")
print(f"試行回数: {attempts}回")
# ベストスコア更新チェック
if best_score is None or attempts < best_score:
best_score = attempts
print("✨ 新記録です!")
print(f"現在のベストスコア: {best_score}回")
break
💡 コードの説明
if best_score is None or attempts < best_score:
・ベストスコアを更新する条件をチェックします
・2つの条件のいずれかが当てはまれば更新します
best_score is None
・初めてのプレイ(記録がない)かチェックします
・Noneとの比較にはisを使います
attempts < best_score
・今回の試行回数が前の記録より少ないかチェックします
・少なければ新記録です
best_score = attempts
・新しいベストスコアを記録します
print("✨ 新記録です!")
・記録を更新したことをプレイヤーに知らせます
完成コード:難易度選択版数当てゲーム
全ての機能を組み合わせた完成版です。
コード:完成版
※スマートフォンでは横スクロールできます
import random
def number_guess_game_advanced():
"""数当てゲーム(難易度選択付き)"""
best_score = None # ベストスコア(初期値はなし)
print("=" * 40)
print("数当てゲーム(難易度選択版)")
print("=" * 40)
while True:
# 難易度選択
print("\n難易度を選んでください:")
print("1: かんたん(1-50)")
print("2: ふつう(1-100)")
print("3: むずかしい(1-200)")
print("0: 終了")
try:
level = int(input("選択: "))
if level == 0:
print("\nゲーム終了!")
if best_score:
print(f"ベストスコア: {best_score}回")
break
# 難易度に応じて範囲を設定
if level == 1:
max_num = 50
difficulty = "かんたん"
elif level == 2:
max_num = 100
difficulty = "ふつう"
elif level == 3:
max_num = 200
difficulty = "むずかしい"
else:
print("❌ 1, 2, 3のいずれかを選んでください")
continue
print(f"\n【{difficulty}モード】1から{max_num}までの数字を当ててください")
# 正解の数字を生成
answer = random.randint(1, max_num)
attempts = 0
# ゲームループ
while True:
guess = int(input("\nあなたの予想: "))
attempts += 1
if guess < 1 or guess > max_num:
print(f"❌ 1から{max_num}の間で入力してください")
continue
if guess == answer:
print(f"\n🎉 正解です!")
print(f"試行回数: {attempts}回")
# ベストスコア更新チェック
if best_score is None or attempts < best_score:
best_score = attempts
print("✨ 新記録です!")
print(f"現在のベストスコア: {best_score}回")
break
elif guess < answer:
print("📈 もっと大きいです")
else:
print("📉 もっと小さいです")
except ValueError:
print("❌ 数字を入力してください")
# ゲーム開始
number_guess_game_advanced()
実行結果
======================================== 数当てゲーム(難易度選択版) ======================================== 難易度を選んでください: 1: かんたん(1-50) 2: ふつう(1-100) 3: むずかしい(1-200) 0: 終了 選択: 1 【かんたんモード】1から50までの数字を当ててください あなたの予想: 25 📈 もっと大きいです あなたの予想: 37 📉 もっと小さいです あなたの予想: 31 🎉 正解です! 試行回数: 3回 ✨ 新記録です! 現在のベストスコア: 3回
🔑 重要なポイント
Noneは「値がない」状態を表す特別な値です。初期値によく使います。
is NoneでNoneかどうかをチェックします(==ではなくis)。
二重ループ:外側は難易度選択、内側は1回のゲームです。
変数の再利用:max_numなどを使って、コードを柔軟にしています。
📝 プロジェクト3: To-Doリスト管理アプリ
📝 プロジェクトの説明
やることリスト(To-Doリスト)を管理するアプリを作ります。タスクの追加、表示、削除ができる実用的なプログラムです。
📌 このプロジェクトで使う知識
| 知識 | 使う場面 |
| リスト | タスクを保存する |
| 関数 | 機能ごとにコードを整理 |
| while文とif文 | メニュー選択と繰り返し |
| enumerate() | 番号付きでリストを表示 |
🔰 ステップ1: シンプルなTo-Doリスト
まずは追加・表示・削除だけのシンプルなTo-Doリストを作ります。
手順1:タスクを保存するリストを用意
タスクを入れる空のリストを作ります。
コード:リストの初期化
※スマートフォンでは横スクロールできます
todos = []
💡 コードの説明
todos = []
・空のリストを作成します
・[]は空のリストを表します
・このリストにタスクを追加していきます
・todosは「やること」を意味するto-doの複数形です
手順2:メニューを表示
プレイヤーが選べる操作を表示します。
コード:メニュー表示
※スマートフォンでは横スクロールできます
while True:
print("\n【メニュー】")
print("1: タスク追加")
print("2: タスク一覧表示")
print("3: タスク削除")
print("0: 終了")
choice = input("\n選択: ")
💡 コードの説明
while True:
・終了するまでメニューを繰り返し表示します
print("1: タスク追加")
・各機能を番号付きで表示します
・プレイヤーは1、2、3、0から選べます
choice = input("\n選択: ")
・プレイヤーの選択を文字列として受け取ります
・今回はint()で変換せず、文字列のまま扱います
手順3:タスク追加機能を作る
新しいタスクをリストに追加します。
コード:タスクの追加
※スマートフォンでは横スクロールできます
if choice == '1':
task = input("新しいタスク: ")
todos.append(task)
print(f"✅ '{task}'を追加しました")
💡 コードの説明
if choice == '1':
・選択が'1'(タスク追加)かチェックします
・文字列として比較するので'1'とシングルクォートで囲みます
task = input("新しいタスク: ")
・追加したいタスクを入力してもらいます
・例:「宿題をする」「買い物に行く」など
todos.append(task)
・リストの末尾にタスクを追加します
・append()は「追加する」という意味です
print(f"✅ '{task}'を追加しました")
・追加したタスクを確認メッセージとして表示します
手順4:タスク一覧表示機能を作る
保存されているタスクを番号付きで表示します。
コード:タスクの表示
※スマートフォンでは横スクロールできます
elif choice == '2':
if not todos:
print("📭 タスクはありません")
else:
print("\n【To-Doリスト】")
for i, task in enumerate(todos, 1):
print(f"{i}. {task}")
💡 コードの説明
elif choice == '2':
・選択が'2'(タスク一覧表示)かチェックします
if not todos:
・リストが空かどうかをチェックします
・空のリストは偽(False)なので、notで真(True)になります
・タスクがない場合のメッセージを表示します
for i, task in enumerate(todos, 1):
・enumerateはインデックス付きでループします
・iに番号、taskにタスクが入ります
・第2引数の1は、番号を1から始めるという意味です
print(f"{i}. {task}")
・「1. 宿題をする」のように番号付きで表示します
手順5:タスク削除機能を作る
指定したタスクをリストから削除します。
コード:タスクの削除
※スマートフォンでは横スクロールできます
elif choice == '3':
if not todos:
print("📭 削除するタスクがありません")
else:
print("\n【To-Doリスト】")
for i, task in enumerate(todos, 1):
print(f"{i}. {task}")
try:
num = int(input("\n削除するタスク番号: "))
if 1 <= num <= len(todos):
removed = todos.pop(num - 1)
print(f"🗑️ '{removed}'を削除しました")
else:
print("❌ 無効な番号です")
except ValueError:
print("❌ 数字を入力してください")
💡 コードの説明
elif choice == '3':
・選択が'3'(タスク削除)かチェックします
if not todos:
・削除するタスクがあるかチェックします
for i, task in enumerate(todos, 1):
・まず現在のタスク一覧を表示します
・削除するタスクを選びやすくします
num = int(input("\n削除するタスク番号: "))
・削除したいタスクの番号を入力してもらいます
if 1 <= num <= len(todos):
・入力された番号が有効範囲かチェックします
・1以上、タスク数以下ならOKです
removed = todos.pop(num - 1)
・pop()は指定位置の要素を削除して、その値を返します
・num - 1はインデックスに変換(1番目→0)
・削除したタスクをremoved変数に保存します
手順6:終了処理を追加
0が選択されたらアプリを終了します。
コード:終了処理
※スマートフォンでは横スクロールできます
elif choice == '0':
print("\nアプリを終了します")
break
else:
print("❌ 0-3のいずれかを選んでください")
💡 コードの説明
elif choice == '0':
・選択が'0'(終了)かチェックします
break
・while文を抜けて、プログラムを終了します
else:
・'0'、'1'、'2'、'3'以外が入力された場合です
・エラーメッセージを表示します
完成コード:シンプルなTo-Doリスト
基本的な機能を持ったTo-Doリストの完成版です。
コード:完成版
※スマートフォンでは横スクロールできます
def simple_todo():
"""シンプルなTo-Doリスト"""
todos = [] # タスクのリスト
print("=" * 40)
print("To-Doリスト管理アプリ")
print("=" * 40)
while True:
print("\n【メニュー】")
print("1: タスク追加")
print("2: タスク一覧表示")
print("3: タスク削除")
print("0: 終了")
choice = input("\n選択: ")
if choice == '1':
# タスク追加
task = input("新しいタスク: ")
todos.append(task)
print(f"✅ '{task}'を追加しました")
elif choice == '2':
# タスク一覧表示
if not todos:
print("📭 タスクはありません")
else:
print("\n【To-Doリスト】")
for i, task in enumerate(todos, 1):
print(f"{i}. {task}")
elif choice == '3':
# タスク削除
if not todos:
print("📭 削除するタスクがありません")
else:
print("\n【To-Doリスト】")
for i, task in enumerate(todos, 1):
print(f"{i}. {task}")
try:
num = int(input("\n削除するタスク番号: "))
if 1 <= num <= len(todos):
removed = todos.pop(num - 1)
print(f"🗑️ '{removed}'を削除しました")
else:
print("❌ 無効な番号です")
except ValueError:
print("❌ 数字を入力してください")
elif choice == '0':
print("\nアプリを終了します")
break
else:
print("❌ 0-3のいずれかを選んでください")
# アプリ起動
simple_todo()
実行結果
======================================== To-Doリスト管理アプリ ======================================== 【メニュー】 1: タスク追加 2: タスク一覧表示 3: タスク削除 0: 終了 選択: 1 新しいタスク: 宿題をする ✅ '宿題をする'を追加しました 【メニュー】 1: タスク追加 2: タスク一覧表示 3: タスク削除 0: 終了 選択: 1 新しいタスク: 買い物に行く ✅ '買い物に行く'を追加しました 【メニュー】 1: タスク追加 2: タスク一覧表示 3: タスク削除 0: 終了 選択: 2 【To-Doリスト】 1. 宿題をする 2. 買い物に行く
🔑 重要なポイント
append()でリストの末尾に要素を追加します。
pop(index)で指定位置の要素を削除し、その値を返します。
enumerate(list, start)で番号付きループができます。startは開始番号です。
not リストでリストが空かどうかをチェックできます。
⭐ ステップ2: 完了機能と優先度を追加
タスクに完了機能と優先度を追加して、より実用的にします。タスクを辞書で管理することで、複数の情報を持たせられます。
📌 追加する機能
| 機能 | 説明 |
| 優先度 | 高・中・低の3段階 |
| 完了機能 | タスクを完了済みにマーク |
| 統計表示 | タスク数と進捗率を表示 |
| 確認ダイアログ | 未完了タスクがある時に確認 |
手順1:辞書形式でタスクを管理
文字列だけでなく、タスク名、優先度、完了状態を1つにまとめます。
コード:辞書でタスクを作成
※スマートフォンでは横スクロールできます
todo_item = {
'task': '宿題をする',
'priority': 1,
'completed': False
}
💡 コードの説明
todo_item = {...}
・辞書を作成します
・{}で囲んで、キーと値のペアを書きます
'task': '宿題をする'
・taskキーにタスク名を保存します
・タスクの内容です
'priority': 1
・priorityキーに優先度を保存します
・1=高、2=中、3=低として使います
'completed': False
・completedキーに完了状態を保存します
・False=未完了、True=完了です
手順2:優先度付きでタスクを追加
新しいタスクを追加する時、優先度も一緒に指定します。
コード:優先度の入力
※スマートフォンでは横スクロールできます
if choice == '1':
task = input("新しいタスク: ")
print("優先度: 1(高), 2(中), 3(低)")
try:
priority = int(input("優先度: "))
if priority not in [1, 2, 3]:
priority = 2
print("デフォルト(中)に設定しました")
except ValueError:
priority = 2
print("デフォルト(中)に設定しました")
💡 コードの説明
print("優先度: 1(高), 2(中), 3(低)")
・優先度の選択肢を表示します
priority = int(input("優先度: "))
・優先度を数値として入力してもらいます
if priority not in [1, 2, 3]:
・1、2、3以外が入力されたかチェックします
・例えば5が入力された場合です
priority = 2
・無効な入力の場合、デフォルト値2(中)に設定します
except ValueError:
・数字以外が入力された場合です
・同じくデフォルト値2に設定します
手順3:辞書形式でタスクを保存
入力された情報を辞書にまとめて、リストに追加します。
コード:辞書の作成と追加
※スマートフォンでは横スクロールできます
todo_item = {
'task': task,
'priority': priority,
'completed': False
}
todos.append(todo_item)
print(f"✅ '{task}'を追加しました")
💡 コードの説明
todo_item = {...}
・入力された情報を辞書にまとめます
'task': task
・入力されたタスク名を保存します
・変数taskの値が入ります
'completed': False
・新しいタスクは未完了なのでFalseにします
todos.append(todo_item)
・作成した辞書をリストに追加します
・todosは辞書のリストになります
手順4:優先度と完了状態付きで表示
タスク一覧を表示する時、優先度と完了状態も一緒に表示します。
コード:優先度ラベルの準備
※スマートフォンでは横スクロールできます
priority_labels = {1: '高', 2: '中', 3: '低'}
💡 コードの説明
priority_labels = {1: '高', 2: '中', 3: '低'}
・数値を日本語に変換する辞書です
・1を'高'、2を'中'、3を'低'に変換します
・priority_labels[1]で'高'が取得できます
コード:タスクの表示
※スマートフォンでは横スクロールできます
elif choice == '2':
if not todos:
print("📭 タスクはありません")
else:
print("\n【To-Doリスト】")
priority_labels = {1: '高', 2: '中', 3: '低'}
for i, todo in enumerate(todos, 1):
status = "✓" if todo['completed'] else " "
priority = priority_labels[todo['priority']]
task = todo['task']
if todo['completed']:
print(f"{i}. [{status}] [優先度:{priority}] {task} (完了)")
else:
print(f"{i}. [{status}] [優先度:{priority}] {task}")
💡 コードの説明
for i, todo in enumerate(todos, 1):
・todosは辞書のリストなので、todoには辞書が入ります
status = "✓" if todo['completed'] else " "
・三項演算子を使っています
・完了済みなら✓、未完了なら空白です
priority = priority_labels[todo['priority']]
・辞書から優先度の数値を取得します
・priority_labelsで日本語に変換します
task = todo['task']
・辞書からタスク名を取得します
print(f"{i}. [{status}] [優先度:{priority}] {task}")
・全ての情報を1行で表示します
・例:「1. [ ] [優先度:高] 宿題をする」
手順5:タスク完了機能を追加
未完了のタスクを完了済みに変更します。
コード:未完了タスクの抽出
※スマートフォンでは横スクロールできます
incomplete = [(i, todo) for i, todo in enumerate(todos) if not todo['completed']]
💡 コードの説明
[(i, todo) for i, todo in enumerate(todos) if not todo['completed']]
・リスト内包表記を使っています
・条件に合う要素だけを抽出します
for i, todo in enumerate(todos)
・インデックスと辞書のペアでループします
if not todo['completed']
・completedがFalse(未完了)のものだけ選びます
(i, todo)
・インデックスと辞書をタプルにして保存します
結果:未完了タスクのリストができます
コード:完了処理
※スマートフォンでは横スクロールできます
elif choice == '3':
incomplete = [(i, todo) for i, todo in enumerate(todos) if not todo['completed']]
if not incomplete:
print("🎉 全てのタスクが完了しています!")
else:
print("\n【未完了タスク】")
for idx, (i, todo) in enumerate(incomplete, 1):
print(f"{i+1}. {todo['task']}")
try:
num = int(input("\n完了にするタスク番号: "))
if 1 <= num <= len(todos):
if not todos[num-1]['completed']:
todos[num-1]['completed'] = True
print(f"🎉 '{todos[num-1]['task']}'を完了にしました")
else:
print("このタスクは既に完了しています")
else:
print("❌ 無効な番号です")
except ValueError:
print("❌ 数字を入力してください")
💡 コードの説明
if not incomplete:
・未完了タスクがあるかチェックします
・全て完了していればお祝いメッセージを表示します
for idx, (i, todo) in enumerate(incomplete, 1):
・incompleteは(インデックス, 辞書)のタプルのリストです
・(i, todo)でアンパック(展開)します
todos[num-1]['completed'] = True
・指定されたタスクのcompletedをTrueに変更します
・辞書の値を直接変更できます
手順6:統計表示機能を追加
タスクの総数、完了数、進捗率を計算して表示します。
コード:統計の計算
※スマートフォンでは横スクロールできます
elif choice == '5':
total = len(todos)
completed = sum(1 for todo in todos if todo['completed'])
incomplete = total - completed
print("\n【タスク統計】")
print(f"総タスク数: {total}")
print(f"完了: {completed}")
print(f"未完了: {incomplete}")
if total > 0:
progress = (completed / total) * 100
print(f"進捗率: {progress:.1f}%")
💡 コードの説明
total = len(todos)
・リストの長さで総タスク数を取得します
sum(1 for todo in todos if todo['completed'])
・完了済みタスクの数を数えます
・sum()関数とジェネレータ式を使っています
・completedがTrueのものだけ1をカウントします
incomplete = total - completed
・未完了数は総数から完了数を引きます
progress = (completed / total) * 100
・進捗率をパーセントで計算します
{progress:.1f}%
・小数点第1位まで表示します
・例:75.5%
手順7:終了時の確認ダイアログ
未完了タスクがある場合、本当に終了するか確認します。
コード:終了確認
※スマートフォンでは横スクロールできます
elif choice == '0':
incomplete = [todo for todo in todos if not todo['completed']]
if incomplete:
print(f"\n⚠️ 未完了のタスクが{len(incomplete)}件あります")
confirm = input("本当に終了しますか? (y/n): ").lower()
if confirm == 'y':
print("\nアプリを終了します")
break
else:
print("\n🎉 全てのタスクが完了しています!")
print("アプリを終了します")
break
💡 コードの説明
incomplete = [todo for todo in todos if not todo['completed']]
・未完了タスクのリストを作ります
if incomplete:
・未完了タスクがあるかチェックします
print(f"\n⚠️ 未完了のタスクが{len(incomplete)}件あります")
・警告メッセージと未完了の数を表示します
confirm = input("本当に終了しますか? (y/n): ").lower()
・確認を求めます
・.lower()で小文字に変換します(Yでもyでも同じ扱い)
if confirm == 'y':
・yが入力されたら終了します
・それ以外ならメニューに戻ります
完成コード:高機能版To-Doリスト
全ての機能を組み合わせた完成版です。
コード:完成版
※スマートフォンでは横スクロールできます
def advanced_todo():
"""完了機能と優先度付きTo-Doリスト"""
todos = [] # タスクのリスト(辞書のリスト)
print("=" * 40)
print("To-Doリスト管理アプリ(高機能版)")
print("=" * 40)
while True:
print("\n【メニュー】")
print("1: タスク追加")
print("2: タスク一覧表示")
print("3: タスク完了")
print("4: タスク削除")
print("5: 統計表示")
print("0: 終了")
choice = input("\n選択: ")
if choice == '1':
# タスク追加
task = input("新しいタスク: ")
print("優先度: 1(高), 2(中), 3(低)")
try:
priority = int(input("優先度: "))
if priority not in [1, 2, 3]:
priority = 2
print("デフォルト(中)に設定しました")
except ValueError:
priority = 2
print("デフォルト(中)に設定しました")
todo_item = {
'task': task,
'priority': priority,
'completed': False
}
todos.append(todo_item)
print(f"✅ '{task}'を追加しました")
elif choice == '2':
# タスク一覧表示
if not todos:
print("📭 タスクはありません")
else:
print("\n【To-Doリスト】")
priority_labels = {1: '高', 2: '中', 3: '低'}
for i, todo in enumerate(todos, 1):
status = "✓" if todo['completed'] else " "
priority = priority_labels[todo['priority']]
task = todo['task']
if todo['completed']:
print(f"{i}. [{status}] [優先度:{priority}] {task} (完了)")
else:
print(f"{i}. [{status}] [優先度:{priority}] {task}")
elif choice == '3':
# タスク完了
if not todos:
print("📭 完了するタスクがありません")
else:
incomplete = [(i, todo) for i, todo in enumerate(todos) if not todo['completed']]
if not incomplete:
print("🎉 全てのタスクが完了しています!")
else:
print("\n【未完了タスク】")
for idx, (i, todo) in enumerate(incomplete, 1):
print(f"{i+1}. {todo['task']}")
try:
num = int(input("\n完了にするタスク番号: "))
if 1 <= num <= len(todos):
if not todos[num-1]['completed']:
todos[num-1]['completed'] = True
print(f"🎉 '{todos[num-1]['task']}'を完了にしました")
else:
print("このタスクは既に完了しています")
else:
print("❌ 無効な番号です")
except ValueError:
print("❌ 数字を入力してください")
elif choice == '4':
# タスク削除
if not todos:
print("📭 削除するタスクがありません")
else:
print("\n【To-Doリスト】")
for i, todo in enumerate(todos, 1):
print(f"{i}. {todo['task']}")
try:
num = int(input("\n削除するタスク番号: "))
if 1 <= num <= len(todos):
removed = todos.pop(num - 1)
print(f"🗑️ '{removed['task']}'を削除しました")
else:
print("❌ 無効な番号です")
except ValueError:
print("❌ 数字を入力してください")
elif choice == '5':
# 統計表示
total = len(todos)
completed = sum(1 for todo in todos if todo['completed'])
incomplete = total - completed
print("\n【タスク統計】")
print(f"総タスク数: {total}")
print(f"完了: {completed}")
print(f"未完了: {incomplete}")
if total > 0:
progress = (completed / total) * 100
print(f"進捗率: {progress:.1f}%")
elif choice == '0':
# 終了前に未完了タスクを確認
incomplete = [todo for todo in todos if not todo['completed']]
if incomplete:
print(f"\n⚠️ 未完了のタスクが{len(incomplete)}件あります")
confirm = input("本当に終了しますか? (y/n): ").lower()
if confirm == 'y':
print("\nアプリを終了します")
break
else:
print("\n🎉 全てのタスクが完了しています!")
print("アプリを終了します")
break
else:
print("❌ 0-5のいずれかを選んでください")
# アプリ起動
advanced_todo()
実行結果
======================================== To-Doリスト管理アプリ(高機能版) ======================================== 【メニュー】 1: タスク追加 2: タスク一覧表示 3: タスク完了 4: タスク削除 5: 統計表示 0: 終了 選択: 1 新しいタスク: レポートを書く 優先度: 1(高), 2(中), 3(低) 優先度: 1 ✅ 'レポートを書く'を追加しました 選択: 1 新しいタスク: 買い物に行く 優先度: 1(高), 2(中), 3(低) 優先度: 3 ✅ '買い物に行く'を追加しました 選択: 2 【To-Doリスト】 1. [ ] [優先度:高] レポートを書く 2. [ ] [優先度:低] 買い物に行く 選択: 3 【未完了タスク】 1. レポートを書く 2. 買い物に行く 完了にするタスク番号: 1 🎉 'レポートを書く'を完了にしました 選択: 5 【タスク統計】 総タスク数: 2 完了: 1 未完了: 1 進捗率: 50.0%
🔑 重要なポイント
辞書でデータ管理:複数の情報を1つにまとめられます。
リスト内包表記:[... for ... if ...]で条件に合う要素を抽出できます。
sum()とジェネレータ:sum(1 for ... if ...)で条件に合う数をカウントできます。
辞書の値の変更:辞書[キー] = 新しい値で直接変更できます。
🎯 このステップのまとめ
✅ このステップで作ったもの
✓ じゃんけんゲーム:random、if文、while文、戦績記録
✓ 数当てゲーム:ランダム数値、大小判定、難易度選択、ベストスコア
✓ To-Doリスト:リスト、辞書、追加・削除・完了・統計
📌 学んだテクニック
| テクニック | 使い方 |
| random.choice() | リストからランダムに1つ選ぶ |
| random.randint() | 指定範囲のランダムな整数を生成 |
| try-except | 無効な入力に対応 |
| while True + break | 終了条件まで繰り返す |
| continue | 無効な入力でやり直し |
| enumerate() | 番号付きでループ |
| 辞書 | 複数の情報をまとめて管理 |
| リスト内包表記 | 条件に合う要素を抽出 |
| 関数化 | コードを整理して読みやすく |
📝 練習問題
学んだことを活かして、プログラムを改良してみましょう。
問題1:じゃんけんに「あいこ」カウントを追加(初級)
📋 問題
じゃんけんゲームに、「あいこ」の回数を記録する機能を追加してください。
終了時に「勝ち○回、負け○回、引き分け○回、あいこ○回」と表示してください。
問題2:数当てゲームにヒント機能を追加(中級)
📋 問題
数当てゲームに、「偶数か奇数か」のヒントを表示する機能を追加してください。
プレイヤーが「h」と入力したらヒントを表示し、試行回数は増やさないようにしてください。
問題3:To-Doリストに期限機能を追加(上級)
📋 問題
To-Doリストに「期限」を追加できるようにしてください。
期限を設定したタスクは、一覧表示の時に期限も表示されるようにしてください。
❓ よくある質問
Q1: プログラムが思った通りに動きません
A: まずはエラーメッセージをよく読みましょう。エラーが出ていない場合は、print()文を使って変数の中身を確認すると、どこがおかしいか分かりやすくなります。
Q2: コードが長くなって読みにくいです
A: 機能ごとに関数に分けると良いです。例えば、「タスク追加」「タスク表示」など、それぞれを関数にすると、メイン処理がすっきりします。
Q3: どうやって改良していけばいいですか?
A: まずは基本機能を完成させます。次に、実際に使ってみて「こんな機能があったら便利」と思ったものを1つずつ追加していきましょう。欲張らず、1つずつが大切です!
Q4: エラーが出るのが怖いです
A: エラーは悪いものではありません!むしろ、「ここを直してね」というプログラムからのメッセージです。プログラマーは誰でも毎日何度もエラーを経験します。エラーを見たら「勉強のチャンス!」と思いましょう。
Q5: リストと辞書、どちらを使えばいいですか?
A: 1つの情報だけならリスト、複数の関連する情報をまとめたいなら辞書が適しています。例えば、タスク名だけならリスト、タスク名+優先度+完了状態なら辞書を使います。
Q6: enumerate()を使わずに書けますか?
A: はい、できます。しかしenumerate()を使うと、コードが短く読みやすくなります。例:
通常のfor文:for i in range(len(todos)): print(f"{i+1}. {todos[i]}")
enumerate:for i, task in enumerate(todos, 1): print(f"{i}. {task}")
💪 次のステップへ
おめでとうございます!これまで学んだ知識を組み合わせて、実際に動くプログラムを作りました!
変数、条件分岐、繰り返し、関数、リスト、辞書など、たくさんの要素を使いこなせるようになりましたね。
次のステップでは、さらに実用的なプログラムに挑戦します。ファイル操作やデータ分析の基礎を学び、より本格的なアプリケーション作りへと進んでいきましょう!
学習メモ
Pythonプログラミング基礎 - Step 24