Pythonとpygameでテトリス作ってみた

Python初心者がpygameでテトリスを作ってみた。実際のコードはGithubで公開中。テトリスを作るための仕組みやアルゴリズムもご紹介。

サンプル動画

実際のコード|Githubからどうぞ

全部で500行近くあるためここには掲載しないことにした。下記リンクからご覧いただきたい。

LINK: https://github.com/kotabu/tetris

仕組み アルゴリズム

このPythonで作ったテトリスには、見出しにまとめると下記要素が含まれている。この要素を含めれば同じようなテトリスが他の言語でも完成すると思う。

ウィンドウ(土台)を用意する

テトリスは横に10マス、縦に20マスのフィールドに決められたブロックが上から下へ落ちていくゲームだ。従って、X軸方向に10の倍数、Y軸方向に20の倍数の大きさのウィンドウ(土台)を用意する。そこに、マスを区切るためのラインを縦横に引く。

ブロックを用意する

表示するためのブロックを用意する。テトリスでは、ブロックが7種類(棒、L、逆L、Z、逆Z、四角、逆T)ある。また、回転の種類が各4種類(四角は1種類)ある。それで、約25種類のブロックパターンを用意する。Pythonのpygameでは、四角を描画する関数が用意されているので、その文法に従ってブロックを設定する。

(例)四角のブロックを用意する

配列(リスト)にブロックの位置と色を記憶する

ウィンドウに表示されているブロックの位置と色を記憶しておく必要がある。そのために最低でも2つの配列が必要になると思う。今回は自分で分かりやすいように、3つの配列を用意した。以下の配列が必要になる。

  • 落ちている最中のブロックの位置
  • 止まっているブロックの位置
  • 止まっているブロックの色
このような配列(リスト)に値を代入する

2つの配列で良いといったのは、ブロックの色だけでも止まっているブロックの位置を取得できるからだ。

位置を保存する配列には、ブロックがあるなら「1」を、ないなら「0」を代入する。色を保存する配列には、ウィンドウの各マスの色をRGBで代入する。

ブロックを表示する

ブロックを表示するには、用意した配列を利用する。位置を保存した配列を読み込んで、その値に応じでブロックを表示させる。その位置に対応した色が別の配列に保存されているので、その情報も同時に反映させる。

ブロックが落ちるようにする

ブロックが落ちるようにするためには、表示するブロックの座標を少しずつY軸方向に足していく必要がある。

落ちるブロックが止まるようにする

落ちるブロックを止めるには、Y軸方向に位置を足していく処理に分岐を与える必要がある。Y軸方向の次の位置が、ウィンドウの端であったり、何かのブロックであったりした場合に、Y軸方向に位置を足さないように分岐させる。

ランダムな種類のブロックが落ちるようにする

ランダムな種類のブロックを選択するには、ランダムな数字を生成する必要がある。その数字に応じてブロックを割り当てておけば、ランダムにブロックが落ちるようになる。

ブロックの落ちるスピードを設定する

ブロックの落ちるスピードが速すぎるとゲームができない。そのため、スピードを調整できるようにする。Pythonのpygameでは、どれくらいのスピードで処理を繰り返すか設定できる。今回は30fpsに設定。フレームを数えることによってブロックの落ちるスピードが変化するようにした。

ブロックを動かせるようにする

テトリスでは、プレイヤーがブロックをX軸方向に動かせるようにする必要がある。プレイヤーの入力に応じて、X軸方向に位置を足すようにすればブロックは移動する。

また、テトリスではブロックを回転できるようにする必要もある。テトリスでは回転の種類が4種類ある。それで、変数で0から4をプレイヤーの入力に応じて回していけばブロックが回転するようになる。

ブロックの動かせる範囲を設定する

X軸方向にプレイヤーはブロックを動かすことができるが、その範囲を設定する必要がある。設定しないとブロックがウィンドウからはみ出る。ブロックが回転すると範囲が変わるので、すべてのブロックの設定がきちんと設定されているか確認する必要がある。

端で回転させたときにエラーが起きないようにする

ウィンドウの端で、あるブロック(逆Tや棒)を回転させたときに、ブロックが範囲外になるためにエラーが発生することがある。その場合にブロックを回転させないように設定しておく必要がある。

ブロックが一列に並んだら消えるようにする

ブロックが一列に並んだということを判定するためには、位置を取得している配列の一列の値の合計値が一定値を超えているかどうかで判断できる。今回であれば、幅のマスである10をその合計値が超えているなら、ブロックが一列に並んでいるということだ。

位置を取得している配列のブロックが一列に並んでいる列を削除すれば消すことができる。一列消したら配列の数がおかしくならないように、一列足しておく。

ゲームオーバーを設定する

テトリスのゲームオーバーは、ブロックが一番上にあり、そのブロックが落ちることができなくなったときだ。

まとめ

Pythonでテトリスを作ることで多くのことを学ぶことができたように思う。

共有する

このエントリーをはてなブックマークに追加

コメントをする

メールアドレスが公開されることはありません。
*のついている項目は必須です。


*