【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;
}
動作解説
- ゲーム画面の初期化:ボードは2次元配列`board`で表現され、すべて0で初期化されます。
- 画面描画:`displayBoard`関数でボードの状態を表示します。
- ブロック管理:`blocks`配列で異なる形状のブロックを定義します。
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言語を用いてシンプルなテトリス風ゲームを作成しました。さらに多くの機能を追加して、自分だけのカスタムテトリスを作りましょう。