C言語でじゃんけんゲームを作ってみた(Claudeに相談しながら)

AIにコードを書いてもらったら、どこまでできるんだろう?

そんな疑問を持って、VS2026とClaude(AI)を使ってC言語でじゃんけんゲームを作ってみることにしました。

この記事では、「何を作るか」「どんな仕様にするか」をAIと相談した過程をそのまま紹介します。
プログラムを作ったことがない人でも、AIとのやり取りのイメージが掴めるような内容にしましたので、ぜひ参考にしてみてください。

この記事で分かること
  • AIを使ってプログラムを作るときの進め方
  • じゃんけんゲームの仕様をAIと一緒に決める方法
  • C言語初心者でもAIを使えば簡単なアプリを作れる
目次

なぜじゃんけんゲームを作るのか

「AIでプログラムを作る」と言っても、最初から複雑なものを作ろうとすると途中で詰まってしまいます。

そこで今回はじゃんけんゲームを題材にしました。理由はこちらです。

  • ルールが単純でわかりやすい(グー・チョキ・パーの3択)
  • C言語の基本的な書き方(条件分岐・乱数・ループ)が全部詰まっている
  • 完成したときの達成感がある

C言語を勉強中の方にとっても、ちょうどいい難易度の題材です。

完成したコードと実行結果

まず、今回完成したコードと実際に動かした結果から紹介します。

ちなみにClaudeに「コードを書いてみて」とお願いしたところ、コンパイルエラーも無くバッチリ動作するコードを作ってくれました。なので、私は一切手を加えていないAI作成のコードになります。

仕様を決めた過程やコードの解説を先に読みたい方は、後半の見出しからどうぞ。

完成したコード(AI(Claude)が作成)

/*
 * janken.c - じゃんけんゲーム
 * 開発環境: Visual Studio 2026
 * 動作環境: Windows コンソールアプリ
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* -------------------------------------------------------
 * 定数定義
 * ------------------------------------------------------- */
#define GU     1   /* グー   */
#define CHOKI  2   /* チョキ */
#define PA     3   /* パー   */

/* -------------------------------------------------------
 * 関数プロトタイプ
 * ------------------------------------------------------- */
int  get_player_hand(void);          /* プレイヤーの入力取得 */
int  get_computer_hand(void);        /* コンピュータの手を決定 */
void show_hand(const char* label, int hand); /* 手の表示 */
int  judge(int player, int computer); /* 勝敗判定: 1=勝ち 0=あいこ -1=負け */
void show_result(int result);        /* 勝敗メッセージ表示 */
int  ask_retry(void);                /* 再戦確認: 1=続ける 0=終わる */

/* -------------------------------------------------------
 * main 関数
 * ------------------------------------------------------- */
int main(void)
{
    int player, computer, result;
    int win = 0, lose = 0, draw = 0;

    /* 乱数の初期化(起動するたびに異なる結果になる) */
    srand((unsigned int)time(NULL));

    printf("=============================\n");
    printf("    じゃんけんゲーム へようこそ!\n");
    printf("=============================\n\n");

    /* ゲームループ(もう一度遊ぶ?で繰り返す) */
    do {
        printf("------------------------------\n");

        /* 1. プレイヤーの手を取得 */
        player = get_player_hand();

        /* 2. コンピュータの手を決定 */
        computer = get_computer_hand();

        /* 3. 両者の手を表示 */
        printf("\n");
        show_hand("あなた   ", player);
        show_hand("コンピュータ", computer);
        printf("\n");

        /* 4. 勝敗判定と表示 */
        result = judge(player, computer);
        show_result(result);

        /* 5. スコアを更新 */
        if      (result ==  1) win++;
        else if (result == -1) lose++;
        else                   draw++;

        printf("\n");

    } while (ask_retry());

    /* 6. ゲーム終了:スコア表示 */
    printf("\n==============================\n");
    printf("          ゲーム終了!\n");
    printf("------------------------------\n");
    printf("  勝ち : %d 回\n", win);
    printf("  負け : %d 回\n", lose);
    printf("  あいこ: %d 回\n", draw);
    printf("  合計 : %d 回\n", win + lose + draw);
    printf("==============================\n\n");
    printf("ありがとうございました!\n");

    return 0;
}

/* -------------------------------------------------------
 * プレイヤーの手を取得する
 *   1〜3 以外が入力されたらエラーメッセージを出して再入力
 * ------------------------------------------------------- */
int get_player_hand(void)
{
    int hand;

    printf("手を選んでください:\n");
    printf("  1: グー\n");
    printf("  2: チョキ\n");
    printf("  3: パー\n");

    while (1) {
        printf("入力 > ");
        if (scanf_s("%d", &hand) != 1) {
            /* 数字以外が入力されたときに入力バッファをクリア */
            int c;
            while ((c = getchar()) != '\n' && c != EOF);
            printf("数字を入力してください(1〜3)。もう一度:\n");
            continue;
        }
        if (hand >= 1 && hand <= 3) {
            break;
        }
        printf("1〜3 の数字を入力してください。もう一度:\n");
    }

    return hand;
}

/* -------------------------------------------------------
 * コンピュータの手をランダムに決定する
 * ------------------------------------------------------- */
int get_computer_hand(void)
{
    return rand() % 3 + 1;   /* 1, 2, 3 のどれかを返す */
}

/* -------------------------------------------------------
 * 手の名前を表示する
 * ------------------------------------------------------- */
void show_hand(const char* label, int hand)
{
    const char* names[] = { "", "グー", "チョキ", "パー" };
    printf("  %s : %s\n", label, names[hand]);
}

/* -------------------------------------------------------
 * 勝敗を判定する
 *   戻り値: 1=プレイヤーの勝ち / 0=あいこ / -1=プレイヤーの負け
 * ------------------------------------------------------- */
int judge(int player, int computer)
{
    if (player == computer) {
        return 0;   /* あいこ */
    }

    /* グー(1)→チョキ(2)→パー(3)→グー(1) の順で勝つ */
    if ((player == GU    && computer == CHOKI) ||
        (player == CHOKI && computer == PA   ) ||
        (player == PA    && computer == GU   )) {
        return 1;   /* 勝ち */
    }

    return -1;  /* 負け */
}

/* -------------------------------------------------------
 * 勝敗メッセージを表示する
 * ------------------------------------------------------- */
void show_result(int result)
{
    if (result == 1) {
        printf("  ★ あなたの勝ちです!\n");
    } else if (result == -1) {
        printf("  ▲ あなたの負けです…\n");
    } else {
        printf("  ■ あいこです!\n");
    }
}

/* -------------------------------------------------------
 * もう一度遊ぶか確認する
 *   戻り値: 1=続ける / 0=終わる
 * ------------------------------------------------------- */
int ask_retry(void)
{
    int c;
    printf("もう一度遊ぶ? (y/n) > ");

    /* 入力バッファをクリアしてから1文字読む */
    while ((c = getchar()) == '\n' || c == ' ');

    /* 残りバッファを捨てる */
    int discard;
    while ((discard = getchar()) != '\n' && discard != EOF);

    return (c == 'y' || c == 'Y');
}

実行結果

こんな感じで真っ黒なコンソール画面で遊びます。

「入力 > 」の後ろの「2」が私が選んだ手で、チョキを選択しています。
コンピュータはパーだったようで、私の勝ち、と判定してくれています!

今回使う環境

  • Windows 11
  • Visual Studio 2026(コードを書いて実行するツール)
  • Claude(AI)

VS2026のインストール方法は以下の記事で解説しています。

AIと一緒に仕様を決めてみた

AIに仕様を相談

いきなりコードを書き始める前に、「どんなゲームにするか」をAIと相談しました。

まずClaudeにこんな質問をしてみました。

C言語でじゃんけんゲームを作りたいです。どんな仕様にすればいいですか?初心者向けに教えてください。

Claudeからはこんな回答が返ってきました。

じゃんけんゲームの仕様を考えてみましょう!初心者向けにシンプルで学習効果の高い内容にします。

最初にフローチャート(プログラムの流れを図示したもの)を提示してくれました。分かりやすい。
以降は、Claudeからの回答を画像で貼っていきます。

Claudeの回答:

シンプルな構造で、サクッと仕様を提案してくれました。これをベースに、もう少し具体的に詰めていきます。

仕様をもっと具体的にしてみた

「基本の仕様はわかったけど、実際の画面はどうなるの?」と思ったので、さらに聞いてみました。

プレイヤーが手を選ぶとき、どんな画面になりますか?具体的に教えてください。

Claudeの回答(冗長な内容は省略):

これで完成イメージが掴めました!

今回作るじゃんけんゲームの仕様まとめ

AIとのやり取りを経て、以下の仕様に決めました。

項目内容
動作環境Windows コンソールアプリ(黒い画面)
プレイヤーの操作1・2・3のキーを入力してグー・チョキ・パーを選ぶ
コンピュータの手ランダムで選ぶ
勝敗判定勝ち・負け・あいこを画面に表示
連続対戦「もう一度遊ぶ?」と聞いて続けられるようにする
スコア表示ゲーム終了時に勝敗の合計を表示

「連続対戦」と「スコア表示」はAIに提案してもらった機能です。最初から入れることにしました。

AIと仕様を決めてみて気づいたこと

今回AIと相談してみて、「何を作るかを言葉で整理してから始める」ことの大切さを実感しました。

いきなりコードを書き始めると「あれ、この場合どうするんだっけ?」と詰まりがちですが、先に仕様を決めておくと作業がスムーズに進みます。

AIはこういう「仕様の壁打ち相手」としても優秀です。
わからないことをそのまま聞けば、具体的に答えてくれますし、今回の「連続対戦」「スコア表示」のように、自分では思いつかなかった機能を提案してくれることもありました。

ソースコード(プログラム)作成

AI(Claude)にソースコードの作成を依頼する

いよいよソースコード作成です。Claudeに以下のようにお願いしてみました。

以下【じゃんけんゲームの仕様】に記載した内容を満たすソースコードを書いてください。
【じゃんけんゲームの仕様】
開発言語:C言語
開発環境:Visual Studio 2026
動作環境:Windows コンソールアプリ(黒い画面)
プレイヤーの操作:1・2・3のキーを入力してグー・チョキ・パーを選ぶ
コンピュータの手:ランダムで選ぶ
勝敗判定:勝ち・負け・あいこを画面に表示
連続対戦:「もう一度遊ぶ?」と聞いて続けられるようにする
スコア表示:ゲーム終了時に勝敗の合計を表示

AI(Claude)からのじゃんけんゲームのソースコード回答

Claudeにソースコード作成を依頼したら、以下のような応答がありました。

「ん?ソースコードはどこだ??」と思ったら、一番下の”Janken”をクリックすることで右側に表示されるようになりました。

このように、Claudeにじゃんけんゲームの仕様を伝えてソースコード生成を依頼すると、以下の内容をセットで教えてくれました!

AI(Claude)にソースコード生成依頼した際の回答内容
  • ソースコード
  • 構成(関数の役割)
  • Visual Studio でのビルド手順
  • 初心者向けの注意点

せっかくなので、本記事では教えてもらったビルド手順に従って動かしてみます。

コードの解説

もらったコードをそのまま動かすだけでも楽しいですが、少しだけ中身を見てみると「C言語の基本」がぎゅっと詰まっているのが分かります。冒頭で触れた条件分岐・乱数・ループが実際どこで使われているか、要点だけ解説します。

全体の流れ:do-whileループで連続対戦

do {    
    /* 1回分のじゃんけん処理 */
} while (ask_retry());

ここが「連続対戦」の仕組みです。

ask_retry()が1(=もう一度遊ぶ)を返している間、中身を繰り返します。
「まず1回実行してから、続けるかどうかを判定する」処理をしたいときにピッタリのループです。

プレイヤーの手を決める:get_player_hand()

if (hand >= 1 && hand <= 3) {
    break;
}

ここが条件分岐です。
1〜3以外の数字が入力されたらwhile (1)の無限ループに戻ってやり直しになるので、正しい値が入力されるまでget_player_hand()を抜けられない仕組みになっています。
じゃんけんゲームに限らず、「ユーザーの入力をチェックする」処理でよく使う形なので覚えておくと便利です。

コンピュータの手を決める:get_computer_hand()

return rand() % 3 + 1;

ここが乱数です。
rand()はランダムな数値を返す関数ですが、そのままだと大きすぎる値になるので、% 3(3で割った余り)で0・1・2のどれかに変換し、+ 1で1・2・3に揃えています。
ちなみにmain()の最初にあるsrand((unsigned int)time(NULL))を忘れると、プログラムを実行するたびに毎回同じ手が出てしまいます(実行時刻を使って乱数の種を変えているため)。

勝敗判定:judge()

if ((player == GU    && computer == CHOKI) ||
    (player == CHOKI && computer == PA   ) ||
    (player == PA    && computer == GU   )) {
    return 1;
}

グーはチョキに勝つ、チョキはパーに勝つ、パーはグーに勝つ、という3パターンを||(または)でつなげて条件分岐しています。
じゃんけんは一見複雑に見えますが、勝ちパターンを3つ書き出すだけで判定できてしまうのが面白いところです。

スコア集計main()

if      (result ==  1) win++;
else if (result == -1) lose++;
else                   draw++;

judge()の戻り値によって、勝ち・負け・あいこのカウンターを増やしています。
ループを抜けたあとにこの合計を表示しているので、「連続対戦」と「スコア表示」の仕様がここで繋がっています。

Visual Studio 2026 でのビルド/実行手順

Claudeにソースコード生成を依頼した際、Visual Studioでの実行手順を教えてくれたので、その手順に従って進めます。

Visual Studio を起動 → 新しいプロジェクトコンソール アプリ(C++) を選択

👇プロジェクト名は特に指定が無かったので、好きな名前にします。アルファベットにしておくのが無難です。

デフォルトの .cpp ファイルの中身をすべて削除し、ダウンロードしたコードを貼り付け

ファイルの拡張子を .c に変更

👇ファイル名を「janken.cpp」から「janken.c」に変更できました。

Ctrl + F5 でビルド&実行

「Ctrl」と「F5」キーを同時に押すか、塗りつぶし無しの三角マークを押してビルド&実行。
(「Ctrl」+「F5」キーは「デバッグなしで開始」という意味です)

👇のような黒い画面が立ち上がり、ゲームが開始しました!

👇2(チョキ)を選んでみます

👇コンピュータは「パー」を選んだので、私の勝ち!
もう一度遊ぶかも聞いてくれます。最初に決めた仕様通りになってます。

👇もう一度遊んで、私の勝ち。最後に「n」を選んで、ゲーム終了します。

👇ゲーム終了時にスコアも表示してくれます。これも仕様通り。素晴らしい!

おまけ:誤った値を入力するとどうなる?

指定以外の値を入力するとどうなるか、もチェックしてみました。

👇の画像のように、正しい値を入力するようにメッセージが出てきます。
ここが正しく実装できていないと応答がなくなったり、プログラムが暴走する場合もあるので、エラー時の処理ができているのも良いポイントです◎

ただし「1?3」という表示だけ、文字化けしてしまっていたため、少し確認してみましょう。
コードには"1〜3 の数字を入力してください"と正しく書かれています。

原因ですが、Windowsのコンソールが使う文字コード(Shift-JIS)は「〜」(波ダッシュ)とあまり相性が良くなく、文字化けしてしまうことがあります。

直し方は簡単で、コード内の(全角チルダ、見た目はほぼ同じ)に置き換えるだけでOKです。

ちなみに、コンソール自体をUTF-8対応にして根本的に直す方法もありますが、今回はシンプルな置き換えで十分です。
C言語をWindowsで書いていると地味によくハマるポイントなので、覚えておくと役立ちます。

まとめ

今回はAIに相談しながら(ほぼAIが)じゃんけんゲームを作成しました。

  • じゃんけんゲームはC言語初心者にちょうどいい題材
  • AIと仕様を相談することで、完成イメージが掴みやすくなる
  • 今回決めた仕様:コンソールアプリ・連続対戦・スコア表示あり
  • AIに仕様を渡すと、速攻でじゃんけんゲームができた

実際に自分でソースコードを書くことも大切ですが、AIを活用すれば「まずプロジェクトを作って動かしてみる」という体験が手軽にできます

このようにベースのソースコードをAIに作ってもらって

「ここはどういう意味かな?」

「この機能を追加するのはどうしたらいいんだろう?」

と調べたり考えたりするのも、現代ならではの効率の良い学習方法ではないかと思います。

関連記事

C言語の環境構築がまだの方は、以下の記事も参考にしてみてくださいね。

最後まで読んでいただき、ありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次