【ゼロから始めるC言語】C言語でマルバツゲームを作ってみよう!

C言語
この記事を書いた人
柊あい

生成AI研究家。新卒で一般企業に就職するも、日々の過酷な残業でメンタルを崩し、退職。
そんな中、生成AIに出会い、当時はまだ珍しかったAI活用フリーランサーとして活動。現在はAI活用を広めるインフルエンサーとして、本サイトの記事の執筆を担当。

公式SNSをフォローする

この記事では、C言語初心者の方向けに、基本的なプログラミングの概念(関数、ループ、条件分岐)を使用して、CLI(コマンドラインインターフェース)上で動作するマルバツゲームを作成していきます!

C言語でマルバツゲームを作る

マルバツゲームとは?

まずは、マルバツゲームがどんなゲームなのか説明します。これは3×3のボード上で「X」と「O」を交互に配置し、縦、横、斜めに同じ記号が3つ揃うと勝利するというシンプルなゲームです。

必要な機能

  • ボードの表示
  • ユーザー入力の処理
  • 勝利条件のチェック
  • ゲームの状態(勝者がいるか、引き分けか)の判断
  • ゲームのリセット

ステップバイステップガイド

ステップ1: プロジェクトの準備とボードの初期化

C言語プロジェクトのセットアップ方法と、ゲームのボードを初期化するための関数を実装します。

void initializeBoard() {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            board[i][j] = '1' + i * 3 + j;  // '1'〜'9'をセット
        }
    }
    currentPlayer = 'X';  // 'X'プレイヤーからスタート
}

解説

  • ここでは、initializeBoard関数を使って3×3のボードを準備します。各マスは数字で初期化され、後で「X」や「O」が入力されます。
  • また、最初のプレイヤーは「X」に設定しています。

ステップ2: ボードの表示方法を実装しよう

現在のボードの状態をわかりやすく表示する関数を作成します。

void printBoard() {
    printf("\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf(" %c ", board[i][j]);
            if (j < 2) printf("|");
        }
        printf("\n");
        if (i < 2) printf("---|---|---\n");
    }
    printf("\n");
}

解説:

printBoard関数は、ボードを画面上に出力します。縦線や横線を使って、見やすいレイアウトでボードを表示します。

AIを使ってC言語のプログラムを簡単に生成したい方にオススメ!

ChatGPT活用塾
「起業家として成功したい」「フリーランスで稼ぎたい」「副業で稼ぎたい」そんな方々向けのChatGPT講座。eラーニング+コーチングであなたの業務を効率化させます。

ステップ3: プレイヤーのターンを作成する

プレイヤーがどのマスに「X」や「O」を置くか入力できる関数を実装します。

void makeMove() {
    int choice;
    printf("プレイヤー %c のターンです。空いているマスを1-9で選んでください: ", currentPlayer);
    scanf("%d", &choice);

    int row = (choice - 1) / 3;
    int col = (choice - 1) % 3;

    if (board[row][col] != 'X' && board[row][col] != 'O') {
        board[row][col] = currentPlayer;
    } else {
        printf("そのマスはすでに埋まっています!別のマスを選んでください。\n");
        makeMove();  // 再入力
    }
}

解説:

  • この関数では、プレイヤーがどのマスに記号を置くかを選びます。既に埋まっているマスを選んだ場合は再入力を求めます。

ステップ4: 勝利条件と引き分けを判断する

縦、横、斜めに同じ記号が3つ揃っているか、ボードが全て埋まっているかを判断するロジックを実装します。

int checkWin() {
    for (int i = 0; i < 3; i++) {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return 1;
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return 1;
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return 1;
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return 1;
    return 0;
}

int checkDraw() {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i][j] != 'X' && board[i][j] != 'O') return 0;
        }
    }
    return 1;
}

解説:

  • checkWin関数で勝利条件をチェックし、checkDraw関数で引き分けかどうかを確認します。ゲームの終了を判断する重要なロジックです。

ステップ5: プレイヤーの交代を実装しよう

プレイヤーが交代するロジックを実装します。

void switchPlayer() {
    currentPlayer = (currentPlayer == 'X') ? 'O' : 'X';
}

解説:

  • switchPlayer関数は、現在のプレイヤーを交代させるシンプルな関数です。「X」と「O」のプレイヤーを交互に切り替えます。

ステップ6: ゲームループを組み立てて完成!

すべての関数を組み合わせてゲームループを構築し、ゲームを完成させます。

int main() {
    initializeBoard();
    printBoard();

    while (1) {
        makeMove();
        printBoard();

        if (checkWin()) {
            printf("プレイヤー %c の勝利です!\n", currentPlayer);
            break;
        }

        if (checkDraw()) {
            printf("引き分けです!\n");
            break;
        }

        switchPlayer();
    }

    return 0;
}

解説:

  • main関数でゲーム全体の流れを制御します。各関数を呼び出して、プレイヤーが交互にマスを選び、勝敗や引き分けが決まるまでループします。

コード全体

#include <stdio.h>

char board[3][3];  // 3x3のマルバツゲームのボード
char currentPlayer;  // 現在のプレイヤー ('X'または'O')

void initializeBoard() {
    // ボードを初期化
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            board[i][j] = '1' + i * 3 + j;  // '1'〜'9'をセット
        }
    }
    currentPlayer = 'X';  // 'X'プレイヤーからスタート
}

void printBoard() {
    // ボードを表示
    printf("\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf(" %c ", board[i][j]);
            if (j < 2) printf("|");
        }
        printf("\n");
        if (i < 2) printf("---|---|---\n");
    }
    printf("\n");
}

int checkWin() {
    // 縦、横、斜めの勝利条件をチェック
    for (int i = 0; i < 3; i++) {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) return 1;
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) return 1;
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) return 1;
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) return 1;
    return 0;
}

int checkDraw() {
    // 引き分けをチェック(全マスが埋まった場合)
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i][j] != 'X' && board[i][j] != 'O') return 0;
        }
    }
    return 1;
}

void switchPlayer() {
    // プレイヤーを切り替え
    currentPlayer = (currentPlayer == 'X') ? 'O' : 'X';
}

void makeMove() {
    int choice;
    printf("プレイヤー %c のターンです。空いているマスを1-9で選んでください: ", currentPlayer);
    scanf("%d", &choice);

    // 入力された番号のマスに対して、適切な位置に'X'または'O'を入れる
    int row = (choice - 1) / 3;
    int col = (choice - 1) % 3;

    if (board[row][col] != 'X' && board[row][col] != 'O') {
        board[row][col] = currentPlayer;
    } else {
        printf("そのマスはすでに埋まっています!別のマスを選んでください。\n");
        makeMove();  // 再入力
    }
}

int main() {
    initializeBoard();
    printBoard();

    while (1) {
        makeMove();
        printBoard();

        if (checkWin()) {
            printf("プレイヤー %c の勝利です!\n", currentPlayer);
            break;
        }

        if (checkDraw()) {
            printf("引き分けです!\n");
            break;
        }

        switchPlayer();  // プレイヤー交代
    }

    return 0;
}

まとめ

さて、このチュートリアルでは、C言語で簡単なマルバツゲームを作成しました。

ここでここまで記事を読んでいただいた皆さんにお知らせしなければならないことがあります…

実は、このプログラム、ChatGPTに全て書いてもらっているのです。

ChatGPTを使えば、今までエンジニアが数時間掛けて書いていたコードを、ものの3分で作成してくれます。

これからエンジニアとして活躍したい方、文系からエンジニアを目指したい方は、ぜひChatGPTの活用方法を学んで、高度なIT人材になりましょう!

ChatGPTを使ってC言語でゲームを制作したい方は、こちらのAIスクールがおすすめです!

ChatGPT活用塾
「起業家として成功したい」「フリーランスで稼ぎたい」「副業で稼ぎたい」そんな方々向けのChatGPT講座。eラーニング+コーチングであなたの業務を効率化させます。