C言語

【C言語】第10章第9回:ゲーム開発 – テトリス風ゲーム

本記事では、C言語を使用してシンプルなテトリス風ゲームを作成します。基本的なゲームロジックや画面描画の方法を学びます。

0. 記事の概要

この記事を読むメリット

  • ゲームロジックの理解:ブロックの移動、回転、ライン消去の仕組みを学べます。
  • グラフィック処理の基礎:簡易的な描画の仕組みを通じて、コンソール画面での表示方法を理解します。
  • 応用力の向上:テトリスをベースにしたカスタムゲームを開発する基礎が得られます。

この記事で学べること

  • ブロックの生成、移動、回転のロジック
  • ゲーム画面の描画と更新
  • ライン消去の実装

1. テトリス風ゲームの基本設計

1.1 ゲームの基本ルール

テトリスの基本ルールは以下の通りです。

  • ブロックはランダムに生成され、画面上部から落下します。
  • プレイヤーはブロックを左右に移動し、回転させることができます。
  • 一列が完全に埋まるとその列が消去され、得点が加算されます。
  • ブロックが画面上部に達するとゲームオーバーです。

1.2 必要なプログラム構造

プログラムは以下の主要部分で構成されます。

  • ブロックデータの管理
  • ゲーム画面の描画
  • ユーザー入力の処理
  • ゲームロジック(移動、回転、消去)の実装

2. コード例と詳細解説

2.1 基本コード例

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Windows環境用。UNIX系ではcursesライブラリを使用
#include <time.h>

#define WIDTH 10
#define HEIGHT 20

int board[HEIGHT][WIDTH] = {0};

// ブロックの形状
int blocks[7][4][4] = {
    {{1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, // I型
    {{1, 1}, {1, 1}}, // O型
    // その他のブロック省略...
};

void displayBoard() {
    system("cls"); // Windows用。UNIX系ではsystem("clear")
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            printf(board[i][j] ? "■" : " ");
        }
        printf("\\n");
    }
}

int main() {
    printf("テトリスゲームを始めます!\\n");
    // ゲームループの実装は後述...
    return 0;
}
動作解説
  1. ゲーム画面の初期化:ボードは2次元配列`board`で表現され、すべて0で初期化されます。
  2. 画面描画:`displayBoard`関数でボードの状態を表示します。
  3. ブロック管理:`blocks`配列で異なる形状のブロックを定義します。

3. 練習問題

以下の課題に挑戦して、テトリス風ゲームを拡張してみましょう。

  1. ブロックの回転機能を実装してください。
  2. ライン消去のロジックを追加してください。
  3. 得点を計算し、画面に表示する機能を追加してください。

4. 練習問題の解答と解説

問2の解答例

// ライン消去のロジック
void clearLines() {
    for (int i = HEIGHT - 1; i >= 0; i--) {
        int fullLine = 1;
        for (int j = 0; j < WIDTH; j++) {
            if (board[i][j] == 0) {
                fullLine = 0;
                break;
            }
        }
        if (fullLine) {
            for (int k = i; k > 0; k--) {
                for (int j = 0; j < WIDTH; j++) {
                    board[k][j] = board[k - 1][j];
                }
            }
            i++; // 同じ行を再チェック
        }
    }
}

この関数では、一列が埋まっている場合にその行を消去し、上の行を下にずらします。

5. まとめ

本記事では、C言語を用いてシンプルなテトリス風ゲームを作成しました。さらに多くの機能を追加して、自分だけのカスタムテトリスを作りましょう。