ステップ24:ミニプロジェクト①

🎮 ステップ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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE