読み込み中...

Pythonの基礎文法だけでじゃんけんプログラムを開発する5つの方法

じゃんけん 徹底解説 Python
この記事は約29分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●Pythonでじゃんけんゲームを作ろう!

「プログラミングって難しそう…」と感じていませんか?

心配いりません。

今日は、誰もが知っているじゃんけんゲームを通じて、Pythonプログラミングの基礎を楽しく学んでいきましょう。

○なぜPythonでじゃんけんプログラムを作るのか

Pythonは初心者にとって最適なプログラミング言語です。

文法がシンプルで読みやすく、多くの分野で活用されています。

じゃんけんプログラムを作ることで、変数、条件分岐、ループなどの基本的な概念を自然に学べます。

また、じゃんけんは誰もが知っているゲームです。

ルールが単純明快なので、プログラムの動作を直感的に理解しやすいのです。

自分で作ったプログラムが動く喜びを、すぐに味わえるでしょう。

○本記事で学べること

本記事では、Pythonを使ってじゃんけんゲームを段階的に作っていきます。

最初は基本的な1回勝負から始め、徐々に機能を追加していきます。

3回勝負、あいこの処理、複数人対戦、そして1000回勝負による統計分析まで、様々なバリエーションを実装します。

各段階で、新しいPythonの概念や機能を解説します。

変数の使い方、if文による条件分岐、whileループによる繰り返し処理、リストの操作、関数の定義など、プログラミングの基礎を一通り押さえていきます。

さらに、プログラムを作る過程で遭遇しがちなエラーとその対処法も解説します。

プログラミングでは、エラーと向き合い、解決する力も重要です。

この経験は、将来より複雑なプロジェクトに取り組む際にも役立つでしょう。

最後に、じゃんけんプログラムの応用例として、GUIの実装、AI対戦、オンライン対戦などの発展的なトピックも紹介します。

●基本のじゃんけんプログラム

Pythonでじゃんけんゲームを作る準備が整いました。

まずは、最も基本的な1回勝負のじゃんけんプログラムから始めましょう。

このプログラムを通じて、Pythonの基本的な文法や概念を学んでいきます。

○サンプルコード1:シンプルな1回勝負

では早速、シンプルな1回勝負のじゃんけんプログラムを作成してみましょう。

import random

# プレイヤーの手を入力
player_hand = input("グー、チョキ、パーのいずれかを入力してください: ")

# コンピューターの手をランダムに選択
choices = ["グー", "チョキ", "パー"]
computer_hand = random.choice(choices)

print(f"あなたの手: {player_hand}")
print(f"コンピューターの手: {computer_hand}")

# 勝敗判定
if player_hand == computer_hand:
    print("引き分けです!")
elif (player_hand == "グー" and computer_hand == "チョキ") or \
     (player_hand == "チョキ" and computer_hand == "パー") or \
     (player_hand == "パー" and computer_hand == "グー"):
    print("あなたの勝ちです!")
else:
    print("コンピューターの勝ちです!")

このプログラムを実行すると、次のような結果が得られます。

グー、チョキ、パーのいずれかを入力してください: グー
あなたの手: グー
コンピューターの手: チョキ
あなたの勝ちです!

○コードの解説と基礎文法のポイント

ここで、先ほどのコードの重要なポイントを解説します。

まず、import randomという文でrandomモジュールをインポートしています。

Pythonには多くの便利なモジュールがあり、randomモジュールはランダムな選択や数値の生成に使用されます。

次に、input()関数を使ってプレイヤーの手を入力しています。

この関数は、ユーザーからの入力を受け取るために使用されます。

random.choice(choices)は、リストchoicesからランダムに1つの要素を選択します。

コンピューターの手を決めるのに使用しています。

そして、if文を使って勝敗を判定しています。

Pythonでは、インデントによってコードブロックを区切ります。

ifelifelseの後のコードブロックは、必ず1段階インデントを下げる必要があります。

また、print(f"...")という形式の文字列は、f-stringと呼ばれます。

中括弧{}内に変数名を直接記述でき、非常に便利です。

最後に、複数の条件をorでつなげて、1つの長い条件式を作成しています。

\記号は、1行が長くなりすぎる場合に、コードを次の行に続けるために使用されます。

●じゃんけんゲーム

基本的なじゃんけんプログラムを作成できましたね。

一度基礎を理解すると、そこから可能性が広がります。

今回は、その基本プログラムを進化させ、より複雑で面白いゲームに発展させていきましょう。

○サンプルコード2:3回勝負の実装方法

まずは、1回勝負から3回勝負へと進化させます。

この変更により、ゲームの戦略性が増し、より楽しめるようになります。

import random

def play_game():
    choices = ["グー", "チョキ", "パー"]
    player_hand = input("グー、チョキ、パーのいずれかを入力してください: ")
    computer_hand = random.choice(choices)

    print(f"あなたの手: {player_hand}")
    print(f"コンピューターの手: {computer_hand}")

    if player_hand == computer_hand:
        return "引き分け"
    elif (player_hand == "グー" and computer_hand == "チョキ") or \
         (player_hand == "チョキ" and computer_hand == "パー") or \
         (player_hand == "パー" and computer_hand == "グー"):
        return "勝ち"
    else:
        return "負け"

player_wins = 0
computer_wins = 0

for round in range(3):
    print(f"\nラウンド {round + 1}")
    result = play_game()

    if result == "勝ち":
        player_wins += 1
        print("あなたの勝ちです!")
    elif result == "負け":
        computer_wins += 1
        print("コンピューターの勝ちです!")
    else:
        print("引き分けです!")

print("\n最終結果:")
print(f"あなた: {player_wins}勝")
print(f"コンピューター: {computer_wins}勝")

if player_wins > computer_wins:
    print("おめでとうございます!あなたの総合勝利です!")
elif player_wins < computer_wins:
    print("残念!コンピューターの総合勝利です。")
else:
    print("総合結果は引き分けです!")

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

ラウンド 1
グー、チョキ、パーのいずれかを入力してください: グー
あなたの手: グー
コンピューターの手: チョキ
あなたの勝ちです!

ラウンド 2
グー、チョキ、パーのいずれかを入力してください: チョキ
あなたの手: チョキ
コンピューターの手: グー
コンピューターの勝ちです!

ラウンド 3
グー、チョキ、パーのいずれかを入力してください: パー
あなたの手: パー
コンピューターの手: グー
あなたの勝ちです!

最終結果:
あなた: 2勝
コンピューター: 1勝
おめでとうございます!あなたの総合勝利です!

このコードでは、play_game()関数を定義し、1回のじゃんけんの勝敗を判定しています。

その後、for文を使って3回のラウンドを実行し、それぞれの勝敗を記録しています。

最後に、総合結果を表示しています。

○サンプルコード3:あいこを含む繰り返し処理

次に、あいこの場合に再戦する機能を追加しましょう。

実際のじゃんけんでも、あいこの場合は「あいこでしょ!」と言って再戦しますよね。

import random

def play_game():
    choices = ["グー", "チョキ", "パー"]
    while True:
        player_hand = input("グー、チョキ、パーのいずれかを入力してください: ")
        computer_hand = random.choice(choices)

        print(f"あなたの手: {player_hand}")
        print(f"コンピューターの手: {computer_hand}")

        if player_hand == computer_hand:
            print("あいこです!もう一度!")
        elif (player_hand == "グー" and computer_hand == "チョキ") or \
             (player_hand == "チョキ" and computer_hand == "パー") or \
             (player_hand == "パー" and computer_hand == "グー"):
            return "勝ち"
        else:
            return "負け"

player_wins = 0
computer_wins = 0

for round in range(3):
    print(f"\nラウンド {round + 1}")
    result = play_game()

    if result == "勝ち":
        player_wins += 1
        print("あなたの勝ちです!")
    else:
        computer_wins += 1
        print("コンピューターの勝ちです!")

print("\n最終結果:")
print(f"あなた: {player_wins}勝")
print(f"コンピューター: {computer_wins}勝")

if player_wins > computer_wins:
    print("おめでとうございます!あなたの総合勝利です!")
elif player_wins < computer_wins:
    print("残念!コンピューターの総合勝利です。")
else:
    print("総合結果は引き分けです!")

この例では、play_game()関数内でwhile文を使用しています。

あいこの場合、ループが継続され、勝敗が決まるまでじゃんけんを繰り返します。

○サンプルコード4:複数人対戦の実現方法

さらに発展させて、複数人で対戦できるようにしてみましょう。

この機能により、より多くの友人と一緒にゲームを楽しむことができます。

import random

def get_winner(hands):
    if len(set(hands)) == 1:
        return None  # あいこ
    elif "グー" in hands and "チョキ" in hands and "パー" not in hands:
        return hands.index("グー")
    elif "チョキ" in hands and "パー" in hands and "グー" not in hands:
        return hands.index("チョキ")
    elif "パー" in hands and "グー" in hands and "チョキ" not in hands:
        return hands.index("パー")
    else:
        return None  # あいこ

def play_game(num_players):
    choices = ["グー", "チョキ", "パー"]
    players = [f"プレイヤー{i+1}" for i in range(num_players-1)] + ["コンピューター"]
    scores = {player: 0 for player in players}

    for round in range(3):
        print(f"\nラウンド {round + 1}")
        hands = []
        for player in players[:-1]:
            hand = input(f"{player}、グー、チョキ、パーのいずれかを入力してください: ")
            hands.append(hand)
        computer_hand = random.choice(choices)
        hands.append(computer_hand)
        print(f"コンピューターの手: {computer_hand}")

        winner_index = get_winner(hands)
        if winner_index is not None:
            winner = players[winner_index]
            scores[winner] += 1
            print(f"{winner}の勝ちです!")
        else:
            print("あいこです!")

    print("\n最終結果:")
    for player, score in scores.items():
        print(f"{player}: {score}勝")

    max_score = max(scores.values())
    winners = [player for player, score in scores.items() if score == max_score]
    if len(winners) == 1:
        print(f"おめでとうございます!{winners[0]}の総合勝利です!")
    else:
        print(f"総合結果は引き分けです!勝者: {', '.join(winners)}")

num_players = int(input("プレイヤーの人数を入力してください(コンピューターを含む): "))
play_game(num_players)

この例では、任意の人数のプレイヤーとコンピューターが対戦できるようになっています。

get_winner()関数で複数の手の中から勝者を決定し、3ラウンド行った後に総合結果を表示します。

○サンプルコード5:1000回勝負の統計分析

最後に、コンピューター同士で1000回の対戦を行い、統計を取ってみましょう。

この機能により、じゃんけんの確率的な側面を理解することができます。

import random
from collections import Counter

def play_game():
    choices = ["グー", "チョキ", "パー"]
    player1 = random.choice(choices)
    player2 = random.choice(choices)

    if player1 == player2:
        return "引き分け"
    elif (player1 == "グー" and player2 == "チョキ") or \
         (player1 == "チョキ" and player2 == "パー") or \
         (player1 == "パー" and player2 == "グー"):
        return "プレイヤー1の勝ち"
    else:
        return "プレイヤー2の勝ち"

results = []
for _ in range(1000):
    results.append(play_game())

result_counts = Counter(results)

print("1000回の対戦結果:")
for result, count in result_counts.items():
    percentage = (count / 1000) * 100
    print(f"{result}: {count}回 ({percentage:.2f}%)")

player1_wins = result_counts["プレイヤー1の勝ち"]
player2_wins = result_counts["プレイヤー2の勝ち"]
draws = result_counts["引き分け"]

print(f"\n勝率:")
print(f"プレイヤー1: {(player1_wins / 1000) * 100:.2f}%")
print(f"プレイヤー2: {(player2_wins / 1000) * 100:.2f}%")
print(f"引き分け: {(draws / 1000) * 100:.2f}%")

この例では、1000回のじゃんけんを行い、各結果の出現回数と割合を計算しています。

Counterクラスを使用して結果をカウントし、最後に勝率を表示しています。

実行結果は次のようになるでしょう。

1000回の対戦結果:
プレイヤー1の勝ち: 334回 (33.40%)
プレイヤー2の勝ち: 321回 (32.10%)
引き分け: 345回 (34.50%)

勝率:
プレイヤー1: 33.40%
プレイヤー2: 32.10%
引き分け: 34.50%

統計分析によって、じゃんけんが完全に確率的なゲームであることがわかります。

長期的に見れば、勝率はほぼ均等になる傾向があります。

●よくあるエラーと対処法

プログラミングを学ぶ過程で、エラーに遭遇することは避けられません。

実際、エラーと向き合い、解決する能力こそがプログラマーにとって重要なスキルです。

じゃんけんプログラムを作成する際に遭遇しやすいエラーとその対処法を見ていきましょう。

○IndexErrorの対処法

IndexErrorは、リストやタプルなどのシーケンス型のオブジェクトに対して、存在しないインデックスにアクセスしようとした際に発生します。

じゃんけんプログラムでは、選択肢のリストを扱う際にこのエラーが発生する可能性があります。

例えば、次のようなコードを考えてみましょう。

choices = ["グー", "チョキ", "パー"]
player_choice = input("0:グー, 1:チョキ, 2:パーから選んでください: ")
print(f"あなたの選択: {choices[int(player_choice)]}")

このコードでは、ユーザーが0、1、2以外の数字や文字列を入力すると、IndexErrorが発生します。

対処法としては、try-except文を使用してエラーをキャッチし、適切に処理することが考えられます。

choices = ["グー", "チョキ", "パー"]
while True:
    try:
        player_choice = int(input("0:グー, 1:チョキ, 2:パーから選んでください: "))
        if 0 <= player_choice <= 2:
            print(f"あなたの選択: {choices[player_choice]}")
            break
        else:
            print("0, 1, 2のいずれかを入力してください。")
    except ValueError:
        print("数字を入力してください。")
    except IndexError:
        print("0, 1, 2のいずれかを入力してください。")

このように、エラーを適切に処理することで、プログラムがクラッシュすることなく、ユーザーに適切なフィードバックを提供できます。

○無限ループに陥った場合の対策

無限ループは、条件が永久に真となってしまい、プログラムが終了しなくなる状態を指します。

じゃんけんプログラムでは、例えば「あいこ」の場合に再戦を繰り返すロジックで発生する可能性があります。

import random

choices = ["グー", "チョキ", "パー"]
while True:
    player = input("グー、チョキ、パーのいずれかを入力してください: ")
    computer = random.choice(choices)
    print(f"コンピューター: {computer}")

    if player == computer:
        print("あいこ!もう一度!")
        # ここで続行条件がないため、無限ループの可能性あり

この場合、「あいこ」が続く限りゲームが終わりません。

対策としては、ループに終了条件を追加するか、最大試行回数を設定することが考えられます。

import random

choices = ["グー", "チョキ", "パー"]
max_attempts = 5
attempt = 0

while attempt < max_attempts:
    player = input("グー、チョキ、パーのいずれかを入力してください: ")
    computer = random.choice(choices)
    print(f"コンピューター: {computer}")

    if player == computer:
        print("あいこ!もう一度!")
        attempt += 1
    else:
        # 勝敗判定のロジック
        break

if attempt == max_attempts:
    print(f"{max_attempts}回あいこが続いたため、ゲームを終了します。")

このように、ループに適切な終了条件を設けることで、無限ループを防ぐことができます。

○ランダム関数が偏る問題の解決策

Pythonの標準ライブラリにあるrandom.choice()関数は、一般的には十分にランダムな結果を生成します。

しかし、長期的に大量の試行を行うと、わずかな偏りが生じる可能性があります。

より高度な乱数生成や、完全な公平性が必要な場合は、別のアプローチを検討する必要があります。

一つの解決策として、secrets モジュールの使用が挙げられます。

secretsモジュールは、暗号論的に強い乱数を生成するために設計されており、より予測困難で偏りの少ない結果を得られます。

import secrets

choices = ["グー", "チョキ", "パー"]
computer_choice = secrets.choice(choices)

また、より大規模なシミュレーションや統計的に重要な場合は、NumPyライブラリの乱数生成機能を利用することも考えられます。

import numpy as np

choices = ["グー", "チョキ", "パー"]
np.random.seed()  # 現在時刻をシードとして使用
computer_choice = np.random.choice(choices)

NumPyの乱数生成器は、統計的な品質が高く、大規模なシミュレーションに適しています。

ランダム性の問題は、一見気づきにくいものですが、大量の試行を行う際には重要になります。

例えば、1000回勝負の統計分析を行う際、わずかな偏りが結果に大きな影響を与える可能性があります。

●じゃんけんプログラムの応用例

基本的なじゃんけんプログラムの作成と、よくあるエラーの対処法を解説しました。

プログラミングの醍醐味は、基本的な知識を応用して、より複雑で面白いプログラムを作り出すことにあります。

ここでは、じゃんけんプログラムをさらに発展させた応用例を紹介します。

この例を通じて、Pythonプログラミングの可能性の広さを感じ取ってください。

○サンプルコード6:GUI付きじゃんけんゲーム

コマンドラインでのじゃんけんゲームも楽しいですが、グラフィカルユーザーインターフェース(GUI)を追加することで、より直感的で魅力的なゲームになります。

PySimpleGUIというライブラリを使用して、簡単なGUI付きじゃんけんゲームを作成してみましょう。

import PySimpleGUI as sg
import random

def determine_winner(player, computer):
    if player == computer:
        return "引き分け"
    elif (player == "グー" and computer == "チョキ") or \
         (player == "チョキ" and computer == "パー") or \
         (player == "パー" and computer == "グー"):
        return "プレイヤーの勝ち"
    else:
        return "コンピューターの勝ち"

layout = [
    [sg.Text("じゃんけんゲーム", font=("Helvetica", 20))],
    [sg.Button("グー"), sg.Button("チョキ"), sg.Button("パー")],
    [sg.Text("", size=(30, 1), key="-RESULT-")],
    [sg.Button("終了")]
]

window = sg.Window("じゃんけんゲーム", layout)

while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "終了":
        break
    if event in ["グー", "チョキ", "パー"]:
        player_choice = event
        computer_choice = random.choice(["グー", "チョキ", "パー"])
        result = determine_winner(player_choice, computer_choice)
        window["-RESULT-"].update(f"プレイヤー: {player_choice}, コンピューター: {computer_choice}\n{result}")

window.close()

このコードを実行すると、ボタンクリックでじゃんけんができるGUIウィンドウが表示されます。

プレイヤーが選択を行うと、コンピューターの選択と勝敗結果が画面に表示されます。

PySimpleGUIを使用することで、複雑なGUIプログラミングの知識がなくても、見た目の良いアプリケーションを作成できます。

このような視覚的なフィードバックは、プログラミング初心者にとって大きな励みになるでしょう。

○サンプルコード7:AIを導入した強化学習版じゃんけん

人工知能(AI)の基本概念を学ぶ良い例として、強化学習を用いたじゃんけんAIを作成してみましょう。

このAIは、プレイヤーの過去の選択パターンを学習し、より賢い選択を行うようになります。

import random

class RockPaperScissorsAI:
    def __init__(self):
        self.choices = ['グー', 'チョキ', 'パー']
        self.player_history = []
        self.weights = {'グー': 1, 'チョキ': 1, 'パー': 1}

    def get_ai_choice(self):
        return random.choices(self.choices, weights=[self.weights[c] for c in self.choices])[0]

    def update_weights(self, player_choice):
        self.player_history.append(player_choice)
        if len(self.player_history) > 3:
            pattern = ''.join(self.player_history[-3:])
            next_likely = max(set(pattern), key=pattern.count)
            winning_move = self.choices[(self.choices.index(next_likely) + 1) % 3]
            self.weights[winning_move] += 0.1

    def play_game(self):
        player_score = 0
        ai_score = 0

        for _ in range(10):  # 10ラウンド行う
            player_choice = input("グー、チョキ、パーのいずれかを入力してください: ")
            ai_choice = self.get_ai_choice()

            print(f"AIの選択: {ai_choice}")

            if player_choice == ai_choice:
                print("引き分け")
            elif (player_choice == "グー" and ai_choice == "チョキ") or \
                 (player_choice == "チョキ" and ai_choice == "パー") or \
                 (player_choice == "パー" and ai_choice == "グー"):
                print("プレイヤーの勝ち")
                player_score += 1
            else:
                print("AIの勝ち")
                ai_score += 1

            self.update_weights(player_choice)

        print(f"\n最終スコア - プレイヤー: {player_score}, AI: {ai_score}")

ai = RockPaperScissorsAI()
ai.play_game()

このAIは、プレイヤーの直近3手のパターンを分析し、次の手を予測します。

予測に基づいて、AIは勝てる可能性が高い手を選びます。

プレイを重ねるごとに、AIの予測精度が向上していきます。

実行結果は、プレイヤーの選択によって変わりますが、次のような形になります。

グー、チョキ、パーのいずれかを入力してください: グー
AIの選択: チョキ
プレイヤーの勝ち
グー、チョキ、パーのいずれかを入力してください: チョキ
AIの選択: パー
AIの勝ち
...
最終スコア - プレイヤー: 4, AI: 6

このAIじゃんけんプログラムは、機械学習の基本概念を理解するための良い入門となります。

パターン認識、重み付け、確率的選択など、AIの重要な要素が含まれています。

○サンプルコード8:オンライン対戦じゃんけんの実装

最後に、ネットワークプログラミングの基礎を学ぶため、簡単なオンライン対戦じゃんけんゲームを作成してみましょう。

サーバーとクライアントの2つのプログラムを用意します。

サーバープログラム

import socket
import threading

def handle_client(conn, addr):
    print(f"新しい接続: {addr}")
    connected = True
    while connected:
        try:
            data = conn.recv(1024).decode()
            if not data:
                break
            print(f"クライアント{addr}の選択: {data}")
            conn.send("選択を受け取りました".encode())
        except:
            connected = False
    conn.close()

def start_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('localhost', 5555))
    server.listen()
    print("サーバーが起動し、接続を待っています...")
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()

start_server()

クライアントプログラム

import socket

def start_client():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('localhost', 5555))

    while True:
        choice = input("グー、チョキ、パーのいずれかを入力してください(終了するには'q'): ")
        if choice.lower() == 'q':
            break
        client.send(choice.encode())
        response = client.recv(1024).decode()
        print(f"サーバーからの応答: {response}")

    client.close()

start_client()

このプログラムを実行するには、まずサーバープログラムを起動し、その後クライアントプログラムを実行します。

複数のクライアントが同時に接続でき、それぞれのクライアントの選択がサーバーに送信されます。

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

サーバー側

サーバーが起動し、接続を待っています...
新しい接続: ('127.0.0.1', 52746)
クライアント('127.0.0.1', 52746)の選択: グー
クライアント('127.0.0.1', 52746)の選択: チョキ
クライアント('127.0.0.1', 52746)の選択: パー

クライアント側

グー、チョキ、パーのいずれかを入力してください(終了するには'q'): グー
サーバーからの応答: 選択を受け取りました
グー、チョキ、パーのいずれかを入力してください(終了するには'q'): チョキ
サーバーからの応答: 選択を受け取りました
グー、チョキ、パーのいずれかを入力してください(終了するには'q'): パー
サーバーからの応答: 選択を受け取りました
グー、チョキ、パーのいずれかを入力してください(終了するには'q'): q

このオンライン対戦じゃんけんプログラムは、ネットワークプログラミングの基礎を学ぶ良い例となります。

ソケットプログラミング、クライアント-サーバーモデル、マルチスレッディングなど、ネットワークアプリケーション開発の重要な概念が含まれています。

まとめ

Pythonでじゃんけんプログラムを作成する旅を通じて、プログラミングの基礎から応用まで幅広い概念を解説しました。

今回学んだ知識とスキルを基礎として、さらに複雑なプロジェクトに挑戦してみてください。

ここで学んだことを基に、自分だけのユニークなプロジェクトを生み出してみましょう。