@woodnx.com

Tetris

2026/01/13

2026/08/01

2021/06~


概要

落ち物パズルゲーム「テトリス」を、C++とDxLibを用いて一から実装しました。

ミノの移動や回転、ライン消去といった基本的な処理に加えて、スーパーローテーションシステム、T-Spin判定、バッグシステム、ロックダウンなど、テトリスのガイドラインに沿った仕様の再現に取り組みました。

本作品は、プログラミング学習を目的として個人で制作した非公式作品です。

制作の動機

テトリスを基礎とした新しいパズルゲームを作りたいと考え、まずは土台となるテトリスの実装から始めました。

また、ゲームエンジンで用意された機能に頼らず、ゲームの進行、入力、描画、当たり判定などの基本的な処理を自分で実装することも目的の1つでした。

動画内に表示されている「2π」というタイトルは、当初構想していた独自ルールを持つパズルゲームの開発名です。

使用技術・開発体制

  • 開発言語:C++
  • 使用ライブラリ:DxLib
  • 開発人数:1人
  • 開発開始:2021年6月
  • 対応入力:ゲームパッド
  • 開発環境:Visual Studio、Visual Studio Code

2Dゲームの描画や入力処理を比較的簡潔に実装できることから、DxLibを採用しました。UnityやUnreal Engineなどのゲームエンジンは使用せず、テトリスのゲームロジックを自分で組み立てています。

実装した機能

基本的なゲーム機能

ミノの移動、回転、落下、設置、ライン消去、ゲームオーバー判定など、テトリスとして遊ぶために必要な基本機能を実装しました。

単にミノを落としてラインを消すだけではなく、一般的なテトリスで採用されている細かな仕様についても調査し、可能な範囲で再現しています。

スーパーローテーション

ミノを回転させた際に壁や床と干渉した場合、複数の補正位置を順番に試すスーパーローテーションシステムを実装しました。

通常の回転処理だけでは回転できない位置でも、ウォールキックによってミノの位置を補正することで、壁際での回転や特定の隙間への配置が可能になります。

実装にあたっては、この解説を参考にしました。

T-Spin 判定

Tミノを設置した際、最後に行った操作や周囲のブロック配置を確認し、T-Spinが成立しているかを判定する処理を実装しました。

T-Spinを伴うライン消去では通常より高いスコアが得られるため、回転処理だけでなく、設置時の状態を適切に判定する必要があります。

判定処理の実装には、この記事を参考にしました。

バッグシステム

7種類のミノを1セットとしてシャッフルし、順番に出現させる7バッグ方式を実装しました。

ミノを完全なランダムで選択すると、同じ種類のミノが極端に連続したり、必要なミノが長時間出現しなかったりする可能性があります。7バッグ方式を採用することで、ミノの出現の偏りを抑えながら、ランダム性を保っています。

ロックダウン

ミノが床やほかのブロックに接地してから盤面へ固定されるまで、0.5秒の猶予時間を設けました。

猶予時間中はミノの移動や回転ができるため、接地後の位置調整やT-Spinなどの操作が可能です。一方で、移動や回転を繰り返すことで固定を無制限に先延ばしできないよう、操作回数が15回に達すると強制的に固定されるようにしています。

長押し入力

横移動やソフトドロップのボタンを押し続けた際、一定時間後に連続して入力される処理を実装しました。

ボタンを押した直後の単発入力と、長押し中の連続入力を分けることで、細かな位置調整と素早い移動の両方を行えるようにしています。

実装上の工夫

ガイドラインの調査

制作を始めるまでは、テトリスの仕様は比較的単純なものだと考えていました。しかし、実際にはミノごとの回転位置、ウォールキック、固定までの猶予時間、ミノの出現順など、多くの細かな仕様が定められています。

それぞれの仕様を調査し、実際の挙動を確認しながら実装することで、見た目だけでなく操作感も一般的なテトリスに近づけることを目指しました。

ゲームパッドへの対応

2021年の松江高専の高専祭へ出展する際、来場者が操作しやすいようにゲームパッドへ対応しました。

展示では、開発者以外の人が説明を受けずに操作する場面も想定する必要があります。 そのため、キーボード操作だけでなく、直感的に扱いやすいゲームパッドを使用できるようにしました。

長期間中断したコードの整理

2021年7月に基本的な機能を完成させた後、ほかの開発活動と時期が重なったため、制作を一時中断しました。

2025年に開発を再開した際には、当時のコードの処理や設計意図を把握することが難しくなっていました。 そこで、既存のコードを読み解きながら、処理の責務が分かりやすくなるよう、クラス構成や実装を段階的に整理しました。

2026年初頭に一連のリファクタリングを完了し、今後の機能追加を進めやすい構造へ改善しました。

開発環境の移行

開発を始めた2021年当時は、Visual Studioを使用していました。

2025年ごろには、ほかの開発プロジェクトと環境を統一するため、Visual Studio Codeへ移行しました。 一方で、ブレークポイントやウォッチウィンドウを使ったデバッグについてはVisual Studioのほうが扱いやすい部分もあり、開発内容に応じた環境の使い分けを検討しています。

出展歴

2021年に松江高専の高専祭へ出展しました。

個人の環境で動作させるだけでなく、来場者に実際に遊んでもらうことを想定したことで、操作方法や入力デバイスについて見直すきっかけになりました。

一方で、当時は出展までに動作させることを優先してゲームパッド対応を実装したため、入力処理の設計には改善の余地が残りました。今後は、ゲームパッドとキーボードの切り替えや、キーコンフィグにも対応できる構造へ改善したいと考えています。

現在の状態と今後

テトリスとしての基本機能と、ガイドラインに沿った主要な仕様の実装は完了しています。また、開発再開後にコード全体のリファクタリングを行い、機能を追加しやすい構造へ整理しました。

次の段階として、当初構想していた独自ルール「2π」の仕様を整理し、テトリスを土台とした新しいパズルゲームへ発展させることを検討しています。

そのほか、次の改善も今後の課題としています。

  • キーボードとゲームパッドの両方への対応
  • キーコンフィグ機能の実装
  • 入力処理の整理
  • 独自ルール「2π」の設計と実装

振り返り

本作品を通して、ゲームエンジンを使用せずに、ゲームの基本的な処理を組み立てる経験を得ました。

特に、回転や接地といった一見単純に見える処理にも、操作性を支える多くの細かな仕様が存在することを学びました。また、仕様を調査して再現するだけでなく、長期間中断したコードを読み直し、将来の機能追加を考慮して整理する経験にもなりました。

高専祭で実際に人に遊んでもらったことで、ゲームが正しく動作することだけでなく、操作する人にとって扱いやすいことも重要だと実感しました。